2011-07-30 11 views
1

は以下の通りです:複数の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のINSERTの二つの異なる文字列がある場合上記のように、ボタンのクリックイベントでは単一または複数の挿入で処理されます。これは、単一のsqlコマンドで処理することは可能ですか?

しかし、1つのSqlCommandでは不可能だと思っていますが、それが真である場合、ロールバックとコミットのためにSqlTransactionクラスを調整するのに非常に大きな問題があります。イベントハンドラのブロックを試してキャッチして

私は本当に1つの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

いいですが、ループブロックの複数のレコードを挿入するステートメントがありません。私は最初の文字列を1つの挿入にし、別の文字列を複数の行に挿入したい。 Datagridview1がコレクションで10行を持っていて、10行を1つだけ挿入したいと思っているとします。 – mahesh

+0

2番目のinsert文では、単に10個の行を挿入したいのですか、1つのSQL文だけを使って10個の行を挿入しようとしていますか? 1つのSQL文を使用しようとしている場合、その文が1つの文でなければならない理由は何ですか? – Ronnie

+0

これは10行の例です。固定されていないので、10,20、または5未満です。そのため、forループでは、行数の収集によって複数のレコードを挿入する必要があります。 – mahesh