Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于数据集的插入/更新中的事务处理_C#_Sql Server_Ado.net - Fatal编程技术网

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

C# 基于数据集的插入/更新中的事务处理,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我正在尝试使用dataset在sql server数据库表中插入批量记录。但我不能做交易处理。请帮助我应用以下代码中的事务处理 我正在使用adapter.UpdateCommand.Transaction=trans但是这一行给了我一个对象引用未设置为对象实例的错误 代码: string ConnectionString = "server=localhost\\sqlexpress;database=WindowsApp;Integrated Security=SSPI;";

我正在尝试使用dataset在sql server数据库表中插入批量记录。但我不能做交易处理。请帮助我应用以下代码中的事务处理

我正在使用
adapter.UpdateCommand.Transaction=trans但是这一行给了我一个对象引用未设置为对象实例的错误

代码:

    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();
string ConnectionString=“server=localhost\\sqlexpress;database=WindowsApp;integratedsecurity=SSPI;”;
SqlConnection conn=新的SqlConnection(ConnectionString);
conn.Open();
SqlTransaction trans=conn.BeginTransaction(IsolationLevel.Serializable);
SqlDataAdapter=新的SqlDataAdapter(“根据Id从测试顺序中选择*”,conn);
SqlCommandBuilder=新的SqlCommandBuilder(适配器);
adapter.UpdateCommand.Transaction=trans;
//创建数据集对象
数据集ds=新数据集(“测试集”);
适配器。填充(ds,“测试”);
//创建数据表对象并添加新行
DataTable TestTable=ds.Tables[“Test”];

对于(int i=1;i如果数据适配器不便于传入事务,并且不在内部处理它,那么您可以使用
TransactionScope
强制它,因为这是环境而不是显式的


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

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

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


来源:

适配器。UpdateCommand
这里可能是
null
吗?哦,事实上,怎么可能更新SELECT SQL语句呢?:)@lhsan嗯,适配器可以从SELECT语句中推断出很多信息-但是,它没有设置
.UpdateCommand
.UpdateCommand
专门用于提供自定义更新