如何为多个SqlDataAdapter插入重用DataTable

本文关键字:插入 DataTable SqlDataAdapter | 更新日期: 2023-09-27 18:08:49

给定一个DataTable加载了一些数据,如何使用不同的SqlDataAdapter.Update()方法执行多个插入到不同的SQL Server数据库表?

使用DataTable向表1插入记录后,不同的SqlDataAdapter将不会向表2插入数据,并且Update()方法总是返回0而不会抛出异常。

我尝试使用DataTableCopy()RejectChanges()方法,但它从未将数据插入表2。

一些代码:

var dataAdapter1 = new SqlDataAdapter
{
    UpdateBatchSize = updateBatchSize,
    InsertCommand = new SqlCommand(insertCommand1, dbConnection)
    {
        UpdatedRowSource = UpdateRowSource.None
    }
};
dataAdapter1 .InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id");  
dbConnection.Open();
dataAdapter1 .Update(dtSomeDataTable);
// This inserts data into table 1.
var dataAdapter2 = new SqlDataAdapter
{
    UpdateBatchSize = updateBatchSize,
    InsertCommand = new SqlCommand(insertCommand2, dbConnection)
    {
        UpdatedRowSource = UpdateRowSource.None
    }
};
var count = dataAdapter2.Update(dtSomeDataTable);
//This does not insert any records (or throws an exception) and variable count is always 0;

如何为多个SqlDataAdapter插入重用DataTable

看一下这篇MSDN文章来理解DataRow的概念。RowState: https://msdn.microsoft.com/en-us/library/ww3k31w0 (v = vs.110) . aspx

当你在第一个SqlAdapter上调用Update时,所有的行都被标记为Unchanged,随后的Update调用将不再考虑它们。

您可以尝试通过从其中一列读取一个值并设置相同的值来"触摸"每一行。这可能会导致RowState切换到Modified,以便第二次Update操作再次对所有行起作用。

也许尝试在每个DataRow上调用SetAdded,在第二次调用更新之前?

https://msdn.microsoft.com/en-us/library/system.data.datarow.setadded%28v=vs.110%29.aspx

通过保持原始DataTable不变并使用DataTable.Copy()方法创建每个所需更新的副本来解决…如果有更好的答案,我会接受。