2011-07-30 3 views
1

나는 두 개의 SQL 테이블과 문자열의 장소에 삽입해야하는 경우는 다음과 같습니다 : 당 SQL 삽입의 두 개의 서로 다른 문자열이있는여러 SQL 삽입 문자열과 캐치 (예외)으로 롤백

// Single Record Insert 
String AA=”Insert into aa(date)values(@date)”; 

//Multiple Record Insert with datagridview1 
For(int i=0;i<datagridview1.rows.count-1;i++) 
{ 
String BB= “insert into bb(name,amount)values(@name,@amount)”; 
} 

경우 버튼 클릭 이벤트에서 단일 및 다중 삽입으로 위와 같이 답장보다 하나의 SQL 명령으로 처리 할 수 ​​있습니까?

하지만 하나의 SqlCommand로는 불가능하다고 생각합니다. 그렇다면 롤백 및 커밋을 위해 SqlTransaction 클래스를 조정하는 것이 매우 큰 문제입니다. try와 catch 블록 EventHandller

나는 하나의 Button1_Click 이벤트에서 위와 같이 여러 개의 SQL 문을 삽입하는 데 정말 고심하고있다. 적절한 해결책이나 적절한 방법, 기술을 제안 해주십시오.

답변

4

명시 적으로 트랜잭션을 ADO.NET 코드에 정의 할 수 있습니다.

private void button1_Click(object sender, EventArgs e) 
    { 
     SqlConnection db = new SqlConnection("constring"); 
     SqlCommand com = new SqlCommand(); 
     SqlCommand com2 = new SqlCommand(); 
     SqlTransaction tran; 
     db.Open(); 
     tran = db.BeginTransaction(); 
     try 
     { 
      //Run all your insert statements here here 
      com.CommandText = "Insert into a(Date) Values(@Date)"; 
      com.Connection = db; 
      com.Transaction = tran; 
      com.Parameters.Add("@Date", SqlDbType.DateTime); 
      com.Parameters["@Date"].Value = DateTime.Now; 
      com.ExecuteNonQuery(); 

      com2.CommandText = "Insert into bb(name,amount) values(@name, @amount)"; 
      com2.Connection = db; 
      com2.Transaction = tran; 
      com2.Parameters.Add("@name", SqlDbType.VarChar, 25); 
      com2.Parameters.Add("@amount", SqlDbType.Decimal); 

      for (int i = 0; i < datagrid.Rows.Count; i++) 
      { 
       //on each loop replace @name value and @amount value with appropiate 
       //value from your row collection 
       com2.Parameters["@name"].Value = datagrid.Rows[i].Cells["Name"].Value; 
       com2.Parameters["@amount"].Value = datagrid.Rows[i].Cells["Amount"].Value; 
       com2.ExecuteNonQuery(); 
      } 
      tran.Commit(); 
     } 
     catch (SqlException sqlex) 
     { 
      tran.Rollback(); 
     } 
     finally 
     { 
      db.Close(); 
     } 
    } 
+0

멋지긴하지만 루프 블록 용으로 여러 레코드 삽입 문장이 누락되었다고 생각합니다. 단일 삽입에 첫 번째 문자열을, 다중 행 삽입에 다른 문자열을 원합니다. 만약 Datagridview1이 10 행을 가지고 있지 않다면 10 행을 삽입하고 싶습니다. – mahesh

+0

그래서 두 번째 insert 문은 단순히 10 개의 행을 삽입하려고하거나 1 개의 SQL 문만을 사용하여 10 개의 행을 삽입하려고합니까? 하나의 SQL 문을 사용하려는 경우 단일 문이어야하는 이유는 무엇입니까? – Ronnie

+0

보기 단지 10 행의 예입니다. 그것은 10,20, 또는 5보다 적을 수 있습니다 고정 아니에요, 그 이유는 for 루프가 행을 수집하여 여러 레코드를 삽입하는 데 필요합니다. – mahesh