【问题标题】:ADO.NET DataSet Primary Key ViolationsADO.NET 数据集主键冲突
【发布时间】:2011-11-19 12:47:08
【问题描述】:

我正在使用DataAdapter 从带有主键的表中填充DataSet

如果我将主键列中的值更改为另一行中已经存在的值,我不会收到主键冲突错误。

如果我在更改行之后调用DataSet.AcceptChanges(),使得现在有重复的主键值,仍然没有主键冲突错误。

这是为什么?

string sqlcommand = "select * from itemmaster";//itemaster contains id field which is primary key//

SqlConnection cn = new SqlConnection(connstring);
cn.Open();
SqlCommand cmd = new SqlCommand(sqlcommand, cn);

SqlDataAdapter da = new SqlDataAdapter(cmd);

DataSet ds = new DataSet();
da.Fill(ds);

ds.Tables[0].Rows[4]["ID"] = "2"; // value 2 already exists in another row

【问题讨论】:

  • 出于好奇,您为什么要使用 DataSets 而不是 ORM 进行开发?
  • 另外,如果你显示代码,你会得到更好的答案。创建一个显示问题的小示例,然后在此处发布示例。
  • 添加了一些示例代码以使事情变得清晰

标签: c# ado.net dataset


【解决方案1】:

要强制执行任何约束,例如主键约束,您需要告诉DataSet 来自源的底层架构。为此,请在填写 DataSet 之前使用 FillSchema() 方法:

da.FillSchema(ds, SchemaType.Source);
da.Fill(ds);

DataSet 只是一组断开连接的数据。

当您从数据集中插入、更新或删除行时,您实际上并没有直接更新数据库。您只是将这些更改提交到断开连接的数据集。即当你这样做时:

ds.Tables[0].Rows[4].Delete();
ds.AcceptChanges();

您在这里所做的只是从Table[0] 中删除一行,然后将更改提交到DataSet,而不是数据库本身。要在数据库本身中提交此更改,您需要做一些不同的事情。

您需要在DataAdapter 中添加“删除命令”。以您的代码为例:

string sqlcommand = "select * from itemmaster";//itemaster contains id field which is primary key//

SqlConnection cn = new SqlConnection(connstring);
cn.Open();
SqlCommand cmd = new SqlCommand(sqlcommand, cn);

SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommand deleteCmd = new SqlCommand("DELETE FROM itemmaster WHERE ID = @ID", cn);
SqlParameter deleteParam = deleteCmd.Parameters.Add("@ID", SqlDbType.Int, 4, "ID");
deleteParam.SourceVersion = DataRowVersion.Original;
da.DeleteCommand = deleteCmd;

DataSet ds = new DataSet();
da.FillSchema(ds, SchemaType.Source, "itemmaster");
da.Fill(ds, "itemmaster");

ds.Tables[0].Rows[4].Delete();

da.Update(ds, "itemmaster");

更多信息见:

Updating Data Sources with DataAdapters

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多