2011-06-20 10 views
2

予期しない結果を伴うSQLの単純なDELETE文に問題があります。リストに単語を追加するようです。愚かなものでなければならない!しかし、私はそれを見ることができない、それはいくつかの異なる方法を試してみました。同じ結果が非常に混乱しています。SQL削除コマンド?

public void IncludeWord(string word) 
{ 
    // Add selected word to exclude list 
    SqlConnection conn = new SqlConnection(); 
    String ConnectionString = "Data Source = dev\\SQLEXPRESS ;" + "Initial Catalog=sml;" + "User id=** ;" + "Password =*;" + "Trusted_Connection=No"; 

    using (SqlConnection sc = new SqlConnection(ConnectionString)) 
    { 
     try 
     { 
      sc.Open(); 

      SqlCommand Command = new SqlCommand(
       "DELETE FROM excludes WHERE word='@word'" + 
       conn); 


      Command.Parameters.AddWithValue("@word", word); 
      Command.ExecuteNonQuery(); 
     } 
     catch (Exception e) 
     { 
      Box.Text = "SQL error" + e; 
     } 
     finally 
     { 
      sc.Close(); 
     } 
     ExcludeTxtbox.Text = ""; 

     Box.Text = " Word : " + word + " has been removed from the Exclude List"; 

     ExcludeLstBox.AppendDataBoundItems = false; 
     ExcludeLstBox.DataBind(); 
    } 
+0

そのコードは、エントリを削除するのではなく、追加しません。あなたの問題は他の場所にあります。このメソッドとの接合で呼び出される相対ビットを投稿してください。 –

答えて

11

一重引用符を削除してみてください。また、なぜ接続オブジェクト(.. word='@word'" + conn)とあなたのSQL文字列を連結していますか?

次のように試してみてください:接続はあなたがfinally文でそれを閉じる必要はありません使用してブロック内にラップされているためということも

try 
{ 
    using (var sc = new SqlConnection(ConnectionString)) 
    using (var cmd = sc.CreateCommand()) 
    { 
     sc.Open(); 
     cmd.CommandText = "DELETE FROM excludes WHERE word = @word"; 
     cmd.Parameters.AddWithValue("@word", word); 
     cmd.ExecuteNonQuery(); 
    } 
} 
catch (Exception e) 
{ 
    Box.Text = "SQL error" + e; 
} 
... 

注意してください。 Disposeメソッドは、自動的に.Closeメソッドを呼び出します。このメソッドは、ADO.NET接続プールに接続を戻して再利用できるようにします。

もう1つの注意点は、このIncludeWordメソッドは多くのことを実行することです。それは、レコードを削除するSQLクエリを送信する、それはGUI上のいくつかのテキストボックスを更新し、いくつかのリストをバインドする=>このようなメソッドは、それぞれのメソッドが独自の特定の責任を持つように別々に分割する必要があります。さもなければ、このコードはメンテナンスの面での単純な悪夢です。 1つの特定のタスクだけを行うメソッドを記述することを強くお勧めします。そうしないと、コードはすぐに完全な混乱になります。

+0

ありがとう私はすべての私のコードの周りに戻って、それは私が呼び出すことは決して望んでいない関数から分岐していることがわかりました。私は削除機能とそのすべての作業を書き直しました!ヒントのおかげで。 – user685590

1

@Wordは、SQLクエリでは引用符で囲まないでください。

なぜSQLクエリの最後に接続を追加しようとしているのかわかりません。

2
SqlCommand Command = new SqlCommand(
        "DELETE FROM excludes WHERE word='@word'" + 
        conn); 

この

SqlCommand Command = new SqlCommand(
        "DELETE FROM excludes WHERE [email protected]", 
        conn); 
0

のような他の人によって提案されまたSqlCommandオブジェクト上のCommandTextを調べ、これをデバッグするには、単一引用符を削除することで試す

SqlCommand Command = new SqlCommand(
        "DELETE FROM excludes WHERE word='@word'", 
        conn); 

に置き換える必要があります。さらに読む前に、これを試してみてください。

問題は、パラメータ化された文字列の周りに単一引用符を追加することで発生します。一重引用符を削除し、人生は美しいです。 :-)

ああ、あなたのconnはオブジェクトで、+ではなくカンマが必要です。

0

プライベートvoid button4_Click(オブジェクト送信者、EventArgs e) { String st = "DELETE FROMサプライヤWHERE supplier_id =" + textBox1.Text;

 SqlCommand sqlcom = new SqlCommand(st, myConnection); 
     try 
     { 
      sqlcom.ExecuteNonQuery(); 
      MessageBox.Show("delete successful"); 
     } 
     catch (SqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 


    private void button6_Click(object sender, EventArgs e) 
    { 
     String st = "SELECT * FROM supplier"; 

     SqlCommand sqlcom = new SqlCommand(st, myConnection); 
     try 
     { 
      sqlcom.ExecuteNonQuery(); 
      SqlDataReader reader = sqlcom.ExecuteReader(); 
      DataTable datatable = new DataTable(); 
      datatable.Load(reader); 
      dataGridView1.DataSource = datatable; 
     } 
     catch (SqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
関連する問題