2014-06-10 2 views
-1

데이터 집합을 사용하여 SQL Server 데이터베이스 테이블에 대량 레코드를 삽입하려고합니다. 그러나 나는 거래 처리를 할 수 없다. 아래 코드에서 트랜잭션 처리를 적용하도록 도와주십시오.데이터 집합 기반 삽입/업데이트에서의 트랜잭션 처리

나는이을 사용하고 있지만이 줄은 객체 참조가 객체의 인스턴스로 설정되지 않았다는 오류를 제공합니다.

코드 : 데이터 어댑터가 트랜잭션을 전달하기 쉽게하지 않으며, 내부적으로 처리하지 않는 경우

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 용 데이터 도구가 초기 상태 였을 때 편리했습니다. 그것은 더 이상 그 상태가 아닙니다. 사실상 다른 어떤 데이터 액세스 도구가 바람직합니다.

0

난 당신의 코드를 테스트 할 수 있습니다,하지만 난 당신이 또한 다음 예에서와 같이 어댑터에 trans 개체의 연결을 통과해야한다고 생각 :

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

행운을 빕니다!

출처 : CodeProject

+0

더 큰 문제는 거기에 * 업데이트 명령이 없다는 것입니다 ... ... –

+0

아, 실제로 어떻게 SELECT SQL 문을 업데이트 할 수 있습니까? :) – Ihsan

+0

@lhsan 글쎄, 어댑터는 select 문으로부터 많은 것을 유추 할 수 있습니다. 그러나, 그것은 .UpdateCommand'를 설정하지 않습니다; '.UpdateCommand'는 특별히 커스텀 업데이트를 제공합니다 * –

관련 문제