主题:请教怎样使用CommandBuilder自动生成更新SQL 语句?
我想点击一个按钮就能将datagrid中的数据回写到SQL中,听说CommandBuilder能自动生成更新SQL语句,下面的代码是从MSDN中找出来的,折腾几天了都不知道怎么用,请哪位指点一下,谢谢!
使用 CommandBuilder 自动生成 SQL 语句
若要为 DataAdapter 自动生成 SQL 语句,请首先设置 DataAdapter 的 SelectCommand 属性。然后,创建一个 CommandBuilder 对象并以参数形式指定 CommandBuilder 将为其自动生成 SQL 语句的 DataAdapter。
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
SqlCommandBuilder custCB = new SqlCommandBuilder(custDA);
custCB.QuotePrefix = "[";
custCB.QuoteSuffix = "]";
DataSet custDS = new DataSet();
nwindConn.Open();
custDA.Fill(custDS, "Customers");
// Code to modify data in the DataSet here.
// Without the SqlCommandBuilder, this line would fail.
custDA.Update(custDS, "Customers");
nwindConn.Close();
修改 SelectCommand
如果在自动生成插入、更新或删除命令后修改 SelectCommand 的 CommandText,则可能会发生异常。如果已修改的 SelectCommand.CommandText 所包含的架构信息与自动生成插入、更新或删除命令时所使用的 SelectCommand.CommandText 不一致,则以后对 DataAdapter.Update 方法的调用可能会试图访问 SelectCommand 引用的当前表中已不存在的列,并且会引发异常。
可以通过调用 CommandBuilder 的 RefreshSchema 方法来刷新 CommandBuilder 用来自动生成命令的架构信息。
如果您希望知道什么命令已自动生成,可以使用 CommandBuilder 对象的 GetInsertCommand、GetUpdateCommand 和 GetDeleteCommand 方法来获取对自动生成命令的引用,然后检查关联 Command 的 CommandText 属性。
以下代码示例向控制台写入已自动生成的更新命令。
Console.WriteLine(custCB.GetUpdateCommand().CommandText)
以下示例继续上一示例(在“使用 CommandBuilder 自动生成 SQL 语句”部分)中的代码,重新创建 Customers 表,并将 CompanyName 列替换为 ContactName 列。然后调用 RefreshSchema 方法,使用此新列的信息来刷新自动生成的命令。
nwindConn.Open();
custDA.SelectCommand.CommandText = "SELECT CustomerID, ContactName FROM Customers";
custCB.RefreshSchema();
custDS.Tables.Remove(custDS.Tables["Customers"]);
custDA.Fill(custDS, "Customers");
// Code to modify the new table in the DataSet here.
// Without the call to RefreshSchema, this line would fail.
custDA.Update(custDS, "Customers");
nwindConn.Close();
使用 CommandBuilder 自动生成 SQL 语句
若要为 DataAdapter 自动生成 SQL 语句,请首先设置 DataAdapter 的 SelectCommand 属性。然后,创建一个 CommandBuilder 对象并以参数形式指定 CommandBuilder 将为其自动生成 SQL 语句的 DataAdapter。
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers", nwindConn);
SqlCommandBuilder custCB = new SqlCommandBuilder(custDA);
custCB.QuotePrefix = "[";
custCB.QuoteSuffix = "]";
DataSet custDS = new DataSet();
nwindConn.Open();
custDA.Fill(custDS, "Customers");
// Code to modify data in the DataSet here.
// Without the SqlCommandBuilder, this line would fail.
custDA.Update(custDS, "Customers");
nwindConn.Close();
修改 SelectCommand
如果在自动生成插入、更新或删除命令后修改 SelectCommand 的 CommandText,则可能会发生异常。如果已修改的 SelectCommand.CommandText 所包含的架构信息与自动生成插入、更新或删除命令时所使用的 SelectCommand.CommandText 不一致,则以后对 DataAdapter.Update 方法的调用可能会试图访问 SelectCommand 引用的当前表中已不存在的列,并且会引发异常。
可以通过调用 CommandBuilder 的 RefreshSchema 方法来刷新 CommandBuilder 用来自动生成命令的架构信息。
如果您希望知道什么命令已自动生成,可以使用 CommandBuilder 对象的 GetInsertCommand、GetUpdateCommand 和 GetDeleteCommand 方法来获取对自动生成命令的引用,然后检查关联 Command 的 CommandText 属性。
以下代码示例向控制台写入已自动生成的更新命令。
Console.WriteLine(custCB.GetUpdateCommand().CommandText)
以下示例继续上一示例(在“使用 CommandBuilder 自动生成 SQL 语句”部分)中的代码,重新创建 Customers 表,并将 CompanyName 列替换为 ContactName 列。然后调用 RefreshSchema 方法,使用此新列的信息来刷新自动生成的命令。
nwindConn.Open();
custDA.SelectCommand.CommandText = "SELECT CustomerID, ContactName FROM Customers";
custCB.RefreshSchema();
custDS.Tables.Remove(custDS.Tables["Customers"]);
custDA.Fill(custDS, "Customers");
// Code to modify the new table in the DataSet here.
// Without the call to RefreshSchema, this line would fail.
custDA.Update(custDS, "Customers");
nwindConn.Close();