2014-06-10 24 views
-1

我想在使用数据集的sql服务器数据库表中插入批量记录。但我无法做交易处理。请帮助我在下面的代码中应用事务处理。基于数据集的事务处理插入/更新

我正在使用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(); 
+4

是'adapter.UpdateCommand'或许'null'在这里? –

回答

1

如果数据适配器没有可以很容易在交易中通过,而不会在内部处理它,那么你可能能够迫使它通过使用TransactionScope来代替 - 因为这是环境而非明确的。

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

0

我无法测试你的代码,但我想你也应该通过trans对象的连接到您的适配器就像下面这个例子:

... 
adapter.UpdateCommand.Connection = trans.Connection; 
adapter.UpdateCommand.Transaction = trans; 
... 

祝你好运!

来源:CodeProject

+0

我怀疑更大的问题是,有没有更新命令* ... –

+0

哦,的确,如何才能更新SELECT SQL语句? :) – Ihsan

+0

@lhsan那么,适配器可以从select语句中推断出很多内容 - 但它不会设置'.UpdateCommand'; '.UpdateCommand'专门用于*提供自定义更新* –