我有 2 个表,我想为每个表添加一行并将更改传输到数据库。我同时使用SqlCommandBuilder。这是我的代码:
string connectionString = @"Data Source=WKS456\SQLEXPRESS;Initial Catalog=ShopDB;Integrated Security=True";
string sql = "SELECT * FROM Customers;Select * FROM Employees";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
adapter.Fill(ds);
DataTable customers = ds.Tables[0];
DataTable employees = ds.Tables[1];
// добавим новую строку в первую таблицу:
DataRow newRow = customers.NewRow();
newRow["FName"] = "x";
newRow["LName"] = "x";
newRow["Address1"] = "x";
newRow["City"] = "x";
newRow["Phone"] = "x";
customers.Rows.Add(newRow);
// добавим новую строку во вторую таблицу:
DataRow newRow1 = employees.NewRow();
newRow1["EmployeeID"] = 101;
newRow1["FName"] = "x";
newRow1["LName"] = "x";
newRow1["MName"] = "x";
newRow1["Salary"] = 111;
newRow1["PriorSalary"] = 111;
newRow1["HireDate"] = "9999 / 12 / 31";
newRow1["ManagerEmpID"] = 5;
employees.Rows.Add(newRow1);
//Создаю SqlCommandBuilder:
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
adapter.Update(ds);
此外,我观察到一项奇怪的工作,即:更改只发送到一个表,并发送到第一个表(客户)。在第二个(员工) - 沉默。我试图注释掉在第一个表中添加一行,即 只剩下第二个 - 一切都解决了 - 在第二个表(员工)中 - 出现了。但是为什么它不能同时在两张桌子上工作呢?我尝试了不同的 adapter.Update(...) 重载 - 但似乎没有任何帮助。
当您使用此行实例化适配器时:
它有一个属性集
SelectCommand,用于使用Fill.该方法
Update在其工作中使用该属性UpdateCommand。如果您没有以某种方式设置它,则此属性等于null.您要么需要手动设置它:
或使用 自动生成
SqlCommandBuilder。通过这一行,您创建了构建器的一个实例:
接下来,您需要调用它的方法来生成 sql 代码并将此命令分配给相应的属性:
或者,如果尚未设置此属性,则第一次调用该方法时,
adapter.Update将自动使用构建器。其实上面写的都只是对工作原理的解释,问题的答案是:
我检查了构建器在包含两个查询的 sql 代码上的工作
select。它update仅在第一次选择时生成。因此,要么连续使用两次调用,要么手动设置更新代码。