如何为多个 SqlDataAdapter 插入重用 DataTable
How to reuse DataTable for multiple SqlDataAdapter inserts
如果 DataTable
加载了一些数据,如何使用不同的 SqlDataAdapter.Update()
方法重复使用它来对不同的 SQL 服务器数据库 table 执行多次插入?
使用DataTable
插入记录到table1后,不同的SqlDataAdapter
不会插入数据到table2和Update()
方法总是returns 0 不抛出异常。
我尝试使用 DataTable
的 Copy()
和 RejectChanges()
方法,但它从未将数据插入 table 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;
看看这个 MSDN post 来理解 DataRow.RowState 的概念:https://msdn.microsoft.com/en-us/library/ww3k31w0(v=vs.110).aspx
当您在第一个 SqlAdapter 上调用更新时,所有行都标记为未更改,后续更新调用将不再考虑它们。
您可以尝试 "touching" 每行,方法是从其中一列读取值并设置相同的值。也许这会导致 RowState 切换到 Modified,以便第二次更新操作再次作用于所有行。
也许在第二次调用 Update 之前尝试在每个 DataRow 上调用 SetAdded ?
https://msdn.microsoft.com/en-us/library/system.data.datarow.setadded%28v=vs.110%29.aspx
通过保持原始 DataTable
不变并为使用 DataTable.Copy()
方法创建的每个必需更新处理副本来解决...如果发布更好的答案我会接受。 .
如果 DataTable
加载了一些数据,如何使用不同的 SqlDataAdapter.Update()
方法重复使用它来对不同的 SQL 服务器数据库 table 执行多次插入?
使用DataTable
插入记录到table1后,不同的SqlDataAdapter
不会插入数据到table2和Update()
方法总是returns 0 不抛出异常。
我尝试使用 DataTable
的 Copy()
和 RejectChanges()
方法,但它从未将数据插入 table 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;
看看这个 MSDN post 来理解 DataRow.RowState 的概念:https://msdn.microsoft.com/en-us/library/ww3k31w0(v=vs.110).aspx
当您在第一个 SqlAdapter 上调用更新时,所有行都标记为未更改,后续更新调用将不再考虑它们。
您可以尝试 "touching" 每行,方法是从其中一列读取值并设置相同的值。也许这会导致 RowState 切换到 Modified,以便第二次更新操作再次作用于所有行。
也许在第二次调用 Update 之前尝试在每个 DataRow 上调用 SetAdded ?
https://msdn.microsoft.com/en-us/library/system.data.datarow.setadded%28v=vs.110%29.aspx
通过保持原始 DataTable
不变并为使用 DataTable.Copy()
方法创建的每个必需更新处理副本来解决...如果发布更好的答案我会接受。 .