1

我从http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx阅读了 SQL 命令生成器类 ,我发现我可以使用 select 和 update 命令显示对数据集/数据库进行的更新.

如果我使用单个数据集,SQL 命令生成器的概念很清楚,但如果我想使用两个不同的数据集怎么办?

场景:我正在将数据库中的值读入一个数据集 ds1;这是分配给 sql 适配器和 sql 命令生成器。现在,我只从 ds1 中读取选定的值并将其存储到第二个数据集 ds2 中;未分配给 sql 数据适配器和 sql 命令生成器。

如果我要更新 ds2 上的任何数据,我担心它是否会更新数据库。另外,我应该如何使用 SQL 命令生成器和 SQL 适配器来做到这一点。

//主数据集

ds = new ProductDataSet();
        command = new SqlCommand(
            "SELECT no, name, price, cost, dept FROM PRODUCTS", connection);
        adapter = new SqlDataAdapter();
        adapter.SelectCommand = command;            
        adapter.Fill(ds, "table");

主数据集填充表单加载事件。用户将输入他选择的项目编号,该项目将从主 ds 搜索并保存/显示到 2nd ds(2nd ds 目前未与任何适配器或命令生成器连接)。例如;第二个 ds 有 3 个项目。

现在说用户更新第二个 ds 上的任何信息,它应该自动更新数据库并显示在网格上。

//第二次ds2更新代码

for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
                            {
 string item = ds2.Tables[0].Rows[i][0].ToString();                   

command = new SqlCommand("UPDATE PRODUCTS SET " + _colName + " = '" + _newValue + "'" + "WHERE ITEM_NO = '" + item + "'", Class1.conn);                                    
datagrid.DataSource = ds2.Tables[0];

}

根据您的建议,如果我在上面的代码中添加/声明适配器/生成器,它不起作用。我收到表映射错误。

4

2 回答 2

3

使用另一个 SQLAdapter 和 SQLCommandBuilder。该页面上的示例显示了如何更新数据库。您只需要以查询的形式提供要更新的字段,例如:

SELECT Name, Address, Phone, Email FROM Contact

命令生成器将生成正确的 SQLUPDATE语句。

于 2012-11-13T19:30:52.727 回答
1

SqlCommandBuilder 会根据单个表的 SELECT 语句自动生成 INSERT、UPDATE 和 DELETE sql 语句。

对于要使用 SqlCommandBuilder 生成的 Transact-SQL 语句,有 2 个步骤

步骤 1. 设置 SqlDataAdapter 对象的“SelectCommand”属性

      SqlDataAdapter dataAdapter = new SqlDataAdapter();

      dataAdapter.SelectCommand = new SqlCommand("SELECT_Query", con);

      DataSet dataSet = new DataSet();
      dataAdapter.Fill(dataSet, "Students");

步骤 2. 创建 SqlCommandBuilder 类的实例,并使用 SqlCommandBuilder 对象的 DataAdapter 属性关联上面创建的 SqlDataAdapter 对象

        SqlCommandBuilder builder = new SqlCommandBuilder();
        builder.DataAdapter = dataAdapter;

步骤 3. 更新 ds1 的记录

         dataAdapter.Update(ds1, "Students");
于 2017-09-20T08:39:44.993 回答