2014-06-10 27 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'專門用於*提供自定義更新* –