基于数据集的插入/更新中的事务处理

时间:2014-06-10 09:13:43

标签: c# sql-server ado.net

我正在尝试使用数据集在sql server数据库表中插入批量记录。但我无法进行交易处理。请帮我在下面的代码中应用交易处理。

我正在使用adapter.UpdateCommand.Transaction = trans;,但这一行给出了一个错误,即Object引用没有设置为对象的实例。

代码:

    string ConnectionString = "server=localhost\\sqlexpress;database=WindowsApp;Integrated Security=SSPI;";
            SqlConnection conn = new SqlConnection(ConnectionString);
            conn.Open();
            SqlTransaction trans = conn.BeginTransaction(IsolationLevel.Serializable);
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Test ORDER BY Id", conn);

            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
            adapter.UpdateCommand.Transaction = trans;

            // Create a dataset object
            DataSet ds = new DataSet("TestSet");
            adapter.Fill(ds, "Test");

            // Create a data table object and add a new row
            DataTable TestTable = ds.Tables["Test"];

            for (int i=1;i<=50;i++)
            {
                DataRow row = TestTable.NewRow();

                row["Id"] = i;

                TestTable .Rows.Add(row);
            }

            // Update data adapter
            adapter.Update(ds, "Test");

            trans.Commit();

            conn.Close();

2 个答案:

答案 0 :(得分:1)

如果数据适配器不能轻松传递事务,并且不在内部处理它,那么可能可以使用TransactionScope强制它相反 - 因为这是环境而非显性。

然而!我在这里的主要指导会更简单:停止使用数据集和数据适配器。它们基本上从.NET模式中解脱,并且在.NET的数据工具处于早期状态时非常方便。它不再处于那种状态。实际上任何其他数据访问工具都是首选。

答案 1 :(得分:0)

我无法测试您的代码,但我认为您还应该将trans对象的连接传递给您的适配器,如下例所示:

...
adapter.UpdateCommand.Connection = trans.Connection;
adapter.UpdateCommand.Transaction = trans;
...
祝你好运!

来源:CodeProject