C# 通过DataAdapter删除行
我已初始化数据适配器:C# 通过DataAdapter删除行,c#,sql-server,dataadapter,C#,Sql Server,Dataadapter,我已初始化数据适配器: string sql = "SELECT * From localitati"; da1 = new System.Data.SqlClient.SqlDataAdapter(sql, con); da1.Fill(ds1, "localitati"); 这个很好用。问题是当我试图删除记录并更新数据库时。 我从数据集中删除记录,如下所示: ds1.Tables["localitati"].Rows.Remove(dRow); 这也很好(已验证) 问题是,当我更新Dat
string sql = "SELECT * From localitati";
da1 = new System.Data.SqlClient.SqlDataAdapter(sql, con);
da1.Fill(ds1, "localitati");
这个很好用。问题是当我试图删除记录并更新数据库时。
我从数据集中删除记录,如下所示:
ds1.Tables["localitati"].Rows.Remove(dRow);
这也很好(已验证)
问题是,当我更新DataAdapter时,数据库不会被修改:
con.Open()
da1.Update(ds1, "localitati");
con.Close();
可能是什么问题?请尝试下面的代码
假设数据库未引发任何异常
con.Open()
da1.Update(ds1.Tables["localitati"].GetChanges());
con.Close();
您需要确保已设置da1.DeleteCommand-这是将为数据表中已删除的每一行激发的命令。请参阅示例。在您发布的代码中,仅为DataAdapter设置了SelectCommand。 您可以使用以下代码为da1生成Insert、Update和Delete命令
string sql = "SELECT * From localitati";
da1 = new SqlDataAdapter(sql, con);
SqlCommandBuilder builder = new SqlCommandBuilder(da1);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
da1.Fill(ds1, "localitati");
但是,CommandBuilder应仅用于相对简单的场景()。对于rest,建议您根据自定义命令文本/存储过程编写自己的命令
如果它仍然不起作用,您可以在服务器上启动SQL Server探查器,以跟踪执行更新方法时数据库收到的命令。对我来说,解决的办法是调用
数据行
上的删除
方法,而不是数据表
上的删除
方法
ds.Tables["localitati"].Rows.Find(primaryKeyValue).Delete();
或者干脆
dr.Delete();
这应该是公认的答案。.Delete()方法将通知父数据表该行已被删除。仅仅从表中删除行是不够的。在我的代码中,我试图执行table.Clear()。在更新调用之后,它没有更新数据库。但是,使用Delete确实可以。我同意这应该是公认的答案。一些解释可能会很好
DataRow dr = datatable.Rows.Find(key);
int Index = datatable.Rows.IndexOf(dr);
BindingContext[DataTable].RemoveAt(Index);
BindingContext[DataTable].EndCurrentEdit();
dataAdapter.Update(DataTable);
DataTable.AcceptChanges();