DataAdapter.Update()不会更新DB中的数据

时间:2011-07-03 01:39:33

标签: c# ado.net

我有一项要求我更新northwind数据库的作业, 我已完成了教程如下所示的所有内容

我使用DataTable填充DataAdapter.Fill(table)

我使用Delete,Insert,Update

构建CommangBuilder命令
SqlDataAdapter adapter = new SqlDataAdapter(selectStr, conn);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 
adapter.DeleteCommand = builder.GetDeleteCommand(true);
adapter.UpdateCommand = builder.GetUpdateCommand(true);
adapter.InsertCommand = builder.GetInsertCommand(true);
adapter.Fill(employees_table);

我还为表格设置了主键:

DataColumn[] employees_keys = new DataColumn[2];
employees_keys[0] = employees.Columns["EmployeeID"];
employees_table.PrimaryKey = employees_keys; 

现在我试图删除并添加一行:

// accepts an employee object and creates a new new row with the appropriate values for 
// an employee table row 
DataRow row = ConvertEmployeeToRow(employeeToAdd);
employee_table.Rows.Add(row);`

并删除一行:

DataRow row = employees.Rows.Find(employeeToDismiss.ID);
employees.Rows.Remove(row); 

我还应该指出,我已尝试使用row.SetAdded()row.Delete()

无论如何,最后我尝试更新数据库

int k = employees_adapter.Update(employees_table);

在添加的行上有时会被k得到重视,在删除时永远不会,并且在任何一种情况下,数据库本身都没有真正更新。

对我做错的任何见解?

3 个答案:

答案 0 :(得分:6)

确保在调用employees_adapter.AcceptChanges()后调用Update()以将更改保存到数据库。

答案 1 :(得分:3)

检查CommandBuilder是否真的为您发出了Update命令,如下所示:

MessageBox.Show(adapter.UpdateCommand.CommandText);

如果缺少主键信息,则根本不会构建更新命令!

答案 2 :(得分:0)

我有点混淆你的SqlDataAdapter名称是适配器,你在employees_adapter中进行更新。使用SqlDataAdapter的步骤非常简单,只需按照这些步骤进行操作

第一步:

    SqlDataAdapter adapter = new SqlDataAdapter(selectStr, conn);
    SqlCommandBuilder builder = new SqlCommandBuilder(adapter); 
    DataTable employees_table= new DataTable ();
    adapter.Fill(employees_table);

第2步:

在数据集中获取数据后开始操作...

要插入:

 DataRow MyRow = employees_table.NewRow();
 //Now Fill data in MyRow
 employees_table.Tables[0].Rows.Add(MyRow);
 adapter.Update(employees_table);

要删除:

 /get only the rows you want
 DataRow[] result = employees_table.Select("ID ="+id); //id will be provided by you
 //Now do here data updation 
 adapter.delete(result);
 adapter.Update(employees_table);

同样明智的你可以应用更新。但是在做任何更改之后必须调用'adapter.Update(employees_table)'