2017-11-20 24 views
0

データベースにデータを追加しようとしていますが、「接続が閉じられていません」という例外メッセージが表示されることがあります。 私はすでにいくつかの解決策の一例 c#接続が閉じられていない、接続の現在の状態が開いている

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
//etc... 
} 

を検索しかし、それは動作しません。

はここ

SqlConnection con = new SqlConnection(@"connecting string"); 

private void btnAdd_Click(object sender, EventArgs e) 
{  
    try 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     //cmd.CommandText = " insert into Manipulate values('" + txtICNO.Text + "','" + txtName.Text + "','" + txtDisease.Text + "','" + txtContact.Text + "','" + txtHistory.Text + "','" + txtAddress.Text + "')"; 
     cmd.CommandText = "insert into Manipulate (ICNO,Name,Disease,Contact,History,Address,Gender) values(@ICNO,@Name,@Disease,@Contact,@History,@Address,@Gender)"; 
     cmd.Parameters.Clear(); 
     cmd.Parameters.AddWithValue("@ICNO", txtICNO.Text); 
     cmd.Parameters.AddWithValue("@Name", txtName.Text); 
     cmd.Parameters.AddWithValue("@Disease", txtDisease.Text); 
     cmd.Parameters.AddWithValue("@Contact", txtContact.Text); 
     cmd.Parameters.AddWithValue("@History", txtHistory.Text); 
     cmd.Parameters.AddWithValue("@Address", txtAddress.Text); 

     if (rdbMale.Checked) 
      cmd.Parameters.AddWithValue("@gender", "Male"); 
     else 
      cmd.Parameters.AddWithValue("@gender", "Female"); 
     cmd.ExecuteNonQuery(); 
     displayData(); 
     MessageBox.Show("record add successfully"); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
     con.Close(); 
    } 
} 
+0

ここで例外/エラーが発生していますか? – maccettura

+3

'using()'は動作し、接続を安全に処理/終了するための推奨される方法です。 *実際のコードと、その呼び出しスタックを含む完全な例外文字列を送信します。これにより、例外が実際に発生した場所が示されます。これは 'Exception.ToString()'で簡単に得ることができます。私は、あなたのコードがグローバル接続を使い、それを正しく閉じるのを忘れているか、 'displayData()'が接続自体を開こうとしていると思います。 –

+0

'displayData()はINSERT文の後にデータをリフレッシュするために同じ接続を使用しようとしていますか? *接続フィールドを使用する代わりに、接続を 'displayData'のパラメータ、つまり' displayData(con) 'に渡します。あなたは同じことを読むために2つの接続を開くことを避けるこのように –

答えて

0

あなたの接続がbtnAdd_Clickのどこかに開閉されるコードです。 また、displayData()で発生することはわかりません。
新しい接続宣言をbtnAdd_Click内に移動し、 すべての新しいオブジェクトインスタンスを{using}ブロックで囲みます。
次に、displayData()の内部を見てください。

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"connecting string")) 
     { 
     con.Open(); 
     using (System.Data.SqlClient.SqlCommand cmd = con.CreateCommand()) 
     { 
      cmd.CommandType = System.Data.CommandType.Text; 
      cmd.CommandText = "insert into Manipulate (ICNO,Name,Disease,Contact,History,Address,Gender) " + 
           "values(@ICNO,@Name,@Disease,@Contact,@History,@Address,@Gender)"; 
      cmd.Parameters.Clear(); 
      cmd.Parameters.AddWithValue("@ICNO", txtICNO.Text); 
      cmd.Parameters.AddWithValue("@Name", txtName.Text); 
      cmd.Parameters.AddWithValue("@Disease", txtDisease.Text); 
      cmd.Parameters.AddWithValue("@Contact", txtContact.Text); 
      cmd.Parameters.AddWithValue("@History", txtHistory.Text); 
      cmd.Parameters.AddWithValue("@Address", txtAddress.Text); 

      if (rdbMale.Checked) 
       cmd.Parameters.AddWithValue("@gender", "Male"); 
      else 
       cmd.Parameters.AddWithValue("@gender", "Female"); 
      cmd.ExecuteNonQuery(); 
     } 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
     return; 
    } 

     displayData(); 
     MessageBox.Show("record add successfully"); 

} 
0

次のような条件を追加することができます。これは、接続を再開しません

if(con.State==ConnectionState.Close) 
{ 
    con.Open(); 
} 

関連する問題