【发布时间】:2014-07-18 22:15:54
【问题描述】:
这是我从服务器填充 DataSet 的方法(为我需要的每个表调用此方法):
private static void PopulateDataTable(DataSet ds, string tablename, string sqlCommand = "SELECT * FROM {0}")
{
var da
= new SqlDataAdapter(String.Format(sqlCommand, "dbo." + tablename), connection);
da.FillSchema(ds, SchemaType.Source, tablename);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.Fill(ds, tablename);
}
在对 DataSet 表中的数据进行操作后,我需要将表中的更改上传回服务器:
public static void UploadSqlServer(DataTable dt)
{
using (var cmd = new SqlCommand(String.Format("SELECT * FROM {0}", "dbo." + dt.TableName),
new SqlConnection(conn_string)))
{
using (var da = new SqlDataAdapter(cmd))
{
using (var cb = new SqlCommandBuilder(da))
da.Update(dt);
}
}
}
问题是表(外键)中存在依赖关系,我无法上传表逐个迭代它们(根据上传顺序我会得到错误The INSERT (DELETE) statement conflicted with the FOREIGN KEY constraint ...)
处理这个问题的正确方法是什么?
例子:
NamesList: column1 (pm key) - ID, column2 - name
People: column1 (pm key) - ID, column2 (fn key in NamesList) - name
用户在NameList 中添加了新行并在People 表中创建了新人。如果我先尝试将People 表上传到SQL 服务器,我会收到错误消息,因为NamesList 中还没有这样的name。删除后情况正好相反。
【问题讨论】:
-
你在做什么操作?我很难想象你可以做的那种通用操作意味着你无法控制你做事的顺序。
-
行添加\删除\编辑,所以有些行被标记为DataRowState.Deleted等等。
-
因此,如果您向表 A 中添加行,并向表 B 中添加行,其中表 A 有一个外键,那么在您提交更改之前阻止您提交对表 A 的更改是什么?表B,避免冲突?您可以通过将外键的引用触发操作更改为
ON DELETE CASCADE来处理表 A 中的删除 -
问题出现在SQL Server,而不是本地DataSet。这个触发器(据我所知)需要在 SQL 基本设置中更改,但我无权访问真实数据库。我想,还有另一种正确的方法可以在您的应用程序中本地存储 sql base 并将其上传回服务器,而不是为 DataSet 中的每个表调用
UploadSqlServer(我什至可以手动编写正确的调用顺序,但删除时会有所不同并添加行)
标签: c# sql sql-server dataset