2017-03-27 39 views
0

Help!接続が閉じられていないと表示されます。接続の現在の状態はopeですが、私はそれを閉じました、pls助けてください?事前にありがとう接続が閉じられませんでした。接続の現在の状態は開いています

private void inserttransaction() 
    { 

     for (int i = 0; i < dataPOS.Rows.Count; i++) 
     { 
      con.Open(); 
      dataPOS.Rows[i].Selected = true; 
      cmd = new SqlCommand(@"INSERT INTO TRANSACTIONS (TransactionCode,TransactionDate,ItemCode,ItemName,Quantity,Price,Total) 
           VALUES 
            ('"+ dataPOS.SelectedRows[0].Cells[0].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[1].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[2].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[3].Value.ToString()+"' , '"+ dataPOS.SelectedRows[0].Cells[4].Value.ToString() +"' '"+ dataPOS.SelectedRows[0].Cells[5].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[6].Value.ToString() +"')", con); 
      cmd.ExecuteNonQuery(); 
      dataPOS.Rows[i].Selected = false; 
      con.Close(); 
     } 

    } 
+1

あなたの接続を 'using'ブロックに囲んで閉じてください。あなたの 'ExecuteNonQuery'が例外を投げた場合、どうなるでしょうか? –

+1

SQLインジェクションを避けるには、SqlCommandでSqlParametersを使用する必要があります。 SqlCommandはusing()ブロック内にある必要があります。接続を一度開いてください(まだ開いていない場合)*ループの外側で、ループを繰り返してから閉じてください。 –

+0

using(SqlConnection connection = new SqlConnection(connectionString)) { //ここにBLを入れてください。 }接続文字列に – Dutt93

答えて

3

すでに開いている接続を開くことはできません。

con.Open(); 

for (int i = 0; i < dataPOS.Rows.Count; i++) 
{ 
    dataPOS.Rows[i].Selected = true; 
    cmd = new SqlCommand(@"INSERT INTO TRANSACTIONS (TransactionCode,TransactionDate,ItemCode,ItemName,Quantity,Price,Total) 
         VALUES 
          ('"+ dataPOS.SelectedRows[0].Cells[0].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[1].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[2].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[3].Value.ToString()+"' , '"+ dataPOS.SelectedRows[0].Cells[4].Value.ToString() +"' '"+ dataPOS.SelectedRows[0].Cells[5].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[6].Value.ToString() +"')", con); 
    cmd.ExecuteNonQuery(); 
    dataPOS.Rows[i].Selected = false; 
} 

con.Close(); 

しかし、私はとにかくusing -statementを使用したい:

using(var con = new SqlConnection("connection-string..")) 
{ 
    con.Open(); 

    for (int i = 0; i < dataPOS.Rows.Count; i++) 
    { 
     dataPOS.Rows[i].Selected = true; 
     cmd = new SqlCommand(@"INSERT INTO TRANSACTIONS (TransactionCode,TransactionDate,ItemCode,ItemName,Quantity,Price,Total) 
          VALUES 
           ('"+ dataPOS.SelectedRows[0].Cells[0].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[1].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[2].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[3].Value.ToString()+"' , '"+ dataPOS.SelectedRows[0].Cells[4].Value.ToString() +"' '"+ dataPOS.SelectedRows[0].Cells[5].Value.ToString() +"' , '"+ dataPOS.SelectedRows[0].Cells[6].Value.ToString() +"')", con); 
     cmd.ExecuteNonQuery(); 
     dataPOS.Rows[i].Selected = false; 
    } 
} // con.Close() not necessary 

あなたはまた、代わりにSQLクエリを構築するために文字列を連結するパラメータ化クエリを使用する必要があります。それ以外の場合は、SQLインジェクション攻撃に対して脆弱です。

+0

?この新しいSqlConnection(@ "server = localhost \ SqlExpress;初期カタログ= CORNERFLAG;統合セキュリティ=真; – Pudge

+0

@pudge:はい、あなたの接続文字列がわかりません –

+0

私はこれを試してみます – Pudge

1

ループの前にusing節とopen connを追加してみてください。そして、私は、あなたのソースコレクション(SQLインジェクションリスク)から直接データを追加するためにSqlParameterを追加することを検討すべきだと思います。

  using (var con = new SqlConnection("your conn string")) 
      { 
       con.Open(); 
       SqlCommand cmd = new SqlCommand(); 
       cmd.CommandType = CommandType.Text; 
       cmd.Connection = con; 

       List<SqlParameter> sqlParams = new List<SqlParameter>(); 
       sqlParams.Add(new SqlParameter("@param0", null)); 
       sqlParams.Add(new SqlParameter("@param1", null)); 
       sqlParams.Add(new SqlParameter("@param2", null)); 
       sqlParams.Add(new SqlParameter("@param3", null)); 
       sqlParams.Add(new SqlParameter("@param4", null)); 
       sqlParams.Add(new SqlParameter("@param5", null)); 
       sqlParams.Add(new SqlParameter("@param6", null)); 

       cmd.Parameters.AddRange(sqlParams.ToArray()); 

       for (int i = 0; i < dataPOS.Rows.Count; i++) 
       { 
        cmd.Parameters["@param0"].Value = dataPOS.SelectedRows[0].Cells[0].Value.ToString(); 
        cmd.Parameters["@param1"].Value = dataPOS.SelectedRows[0].Cells[1].Value.ToString(); 
        cmd.Parameters["@param2"].Value = dataPOS.SelectedRows[0].Cells[2].Value.ToString(); 
        cmd.Parameters["@param3"].Value = dataPOS.SelectedRows[0].Cells[3].Value.ToString(); 
        cmd.Parameters["@param4"].Value = dataPOS.SelectedRows[0].Cells[4].Value.ToString(); 
        cmd.Parameters["@param5"].Value = dataPOS.SelectedRows[0].Cells[5].Value.ToString(); 
        cmd.Parameters["@param6"].Value = dataPOS.SelectedRows[0].Cells[6].Value.ToString(); 

        dataPOS.Rows[i].Selected = true; 
        cmd.CommandText = @"INSERT INTO TRANSACTIONS (TransactionCode,TransactionDate,ItemCode,ItemName,Quantity,Price,Total) 
             VALUES (@param0, @param1, @param2, @param3, @param4, @param5,@param6)"; 
        cmd.ExecuteNonQuery(); 
        dataPOS.Rows[i].Selected = false; 
       } 
      } 
+0

'con.Close()'を呼び出す必要はありません。 –

関連する問題