现在的位置: 首页 > 综合 > 正文

SqlCommandBuilder

2013年10月09日 ⁄ 综合 ⁄ 共 2984字 ⁄ 字号 评论关闭

 

最近看一个案例,关于如何向数据库传数据,颇有发现。
以前我的数据都是采用Sql代码用SqlCommand一条一条语句的传入数据库。
但是今天发现有更好的方法。
代码如下:
SqlConnection cn=new SqlConnection(ConStr);
   DataSet DS=new DataSet();
   SqlDataAdapter Sda=new SqlDataAdapter("Select * from Table1",cn);
   try
   {
    Sda.Fill(DS,"Table1");
    MessageBox.Show(DS.Tables[0].Rows.Count.ToString());
   }
   catch(Exception er)
   {
    MessageBox.Show(er.Message);
   }

   //DataSet DS2=DS.Clone();
   //Sda.SelectCommand=new SqlCommand("Select * from Table1");
   DataRow dr=DS.Tables[0].NewRow();
   dr["F1"]=5;
   dr["F2"]=5;
   dr["F3"]=5;
   DS.Tables[0].Rows.Add(dr);

   dr=DS.Tables[0].NewRow();
   dr["F1"]=6;
   dr["F2"]=6;
   dr["F3"]=6;
   DS.Tables[0].Rows.Add(dr);
   
   SqlCommandBuilder SCB=new SqlCommandBuilder(Sda);
   
   try
   {
    Sda.Update(DS,"Table1");
   }
   catch(Exception er)
   {
    MessageBox.Show(er.Message);
   }
  
   
   Sda.Dispose();
   cn.Close();

数据库用的是SQL2000,先在数据库中建立Table1的临时表,建立字段MainID,F1,F2,F3
初始数据如下
MainID     F1    F2    F3
1                1        1    1
2                2        2    2
3                3        3    3
4                4        4    4

注意到,我先把数据从数据库中读出来,赋值到DS中
结果显然为4行
然后我在该数据集DS中添加2个同构行
这是注意了,我没有做任何的Insert相关语句
打算直接采用SqlDataAdapter.Update(DataSet,TableScr)方法
但是注意,直接用是不行的,会提示缺少Insert命令的关联
这是可以用了如黄色高亮标记的语句

SqlCommandBuilder SCB=new SqlCommandBuilder(Sda);

这是所有关联就都建立好了,全自动。奇妙,诡异阿
这样就方便多了。
恩,更多的相关功能正在研究中。
 =============================================================

使用SqlCommandBuilder与SqlDataAdapter结合使用,可以方便地去数据库进行更新。只要指定Select 语句就可以自动生成Insert,update,delete语句,但要注意一点。Select 语句中返回的列要包括主键列,否则将无法产生Update,和Delete语句。相应的操作将无法执行

public static DataSet SelectSqlSrvRows(string myConnection, string mySelectQuery, string myTableName)
{
   SqlConnection myConn = new SqlConnection(myConnection);
   SqlDataAdapter myDataAdapter = new SqlDataAdapter();
   myDataAdapter.SelectCommand = new SqlCommand(mySelectQuery, myConn);
   SqlCommandBuilder cb = new SqlCommandBuilder(myDataAdapter);

   myConn.Open();

   DataSet ds = new DataSet();
   myDataAdapter.Fill(ds, myTableName);

   //code to modify data in DataSet here

   //Without the SqlCommandBuilder this line would fail
   myDataAdapter.Update(ds, myTableName);

   myConn.Close();

   return ds;
}

===========================================

今天看到了《C#入门经典》的第24章“数据库和ADO.NET”,由于上学期听过大四的那门.net数据库编程,所以看这部门感觉是颇顺利的,要做的基本上就是逐一验证书上的代码。

不过刚刚发现一个课上老师没提到过的类:SqlCommandBuilder,而且代码中也有使用,赶紧研究了一下,发现确实是个好东西。有了它在使用DataAdapter时就不用自己写与SELECT语句对应的那些INSERT、UPDATE、DELETE语句了。只要在声明好一个DataAdapter对象后,用这个DataAdapter初始化一个SqlCommandBuilder对象就OK,adapter就可以直接Update()了。
例:
SqlConnection thisConnection = new SqlConnection(@"Data Source=riqe/sqlexpress;Initial Catalog=Northwind;Integrated Security=True");
SqlDataAdapter thisAdapter = new SqlDataAdapter("SELECT CustomerID,CompanyName FROM customers", thisConnection);

SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

DataSet thisDataSet = new DataSet();
thisAdapter.Fill(thisDataSet, "Customers");

thisDataSet.Tables["Customers"].Rows[9][1] = "Acme, Inc.";

thisAdapter.Update(thisDataSet, "Customers");
thisConnection.Close();

如果没有定义那个SqlCommandBuilder的话,可是要自己设定DataAdapter的UpdateCommand属性,可是很麻烦的。

抱歉!评论已关闭.