SQLの単純なDELETEステートメントで予期しない結果が発生する問題があります。Wordがリストに追加されているようです。ばかげているに違いない!しかし、私はそれを見ることができません、それをいくつかの異なる方法で試しました。すべて同じ結果がとても混乱しています。
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();
}
一重引用符を削除してみてください。また、SQL文字列を接続オブジェクト(.. Word='@Word'" + conn
)???
このようにしてみてください:
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;
}
...
接続はusingブロックでラップされているため、finally
ステートメントで接続を閉じる必要がないことにも注意してください。 Disposeメソッドは自動的に.Closeメソッドを呼び出し、接続をADO.NET接続プールに返して再利用できるようにします。
もう1つの注意点は、このIncludeWord
メソッドは多くのことを実行するということです。 SQLクエリを送信してレコードを削除し、GUIのいくつかのテキストボックスを更新し、いくつかのリストをバインドします=>このようなメソッドは、各メソッドが独自の特定の責任を持つように別々に分割する必要があります。それ以外の場合、このコードはメンテナンスの面で単に悪夢です。特定のタスクを1つだけ実行するメソッドを作成することを強くお勧めします。そうしないと、コードがすぐに完全に混乱してしまいます。
SqlCommand Command = new SqlCommand(
"DELETE FROM excludes WHERE Word='@Word'" +
conn);
に置き換える必要があります
SqlCommand Command = new SqlCommand(
"DELETE FROM excludes WHERE Word='@Word'",
conn);
また、このような他の人が提案しているように、一重引用符を削除してみてください
SqlCommand Command = new SqlCommand(
"DELETE FROM excludes WHERE Word=@Word",
conn);
@Word
はSQLクエリで引用符で囲むべきではありません。
SQLクエリの最後に接続を追加しようとしている理由もわかりません。
以下のコードを参照してください。
private void button4_Click(object sender, EventArgs e)
{
String st = "DELETE FROM supplier 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);
}
}
これをデバッグするには、SqlCommandオブジェクトのCommandTextを調べます。さらに読む前に、これを試してみてください。
この問題は、パラメーター化された文字列を一重引用符で囲むことにあります。一重引用符を削除すると、人生は美しいです。 :-)
ああ、あなたのconnはオブジェクトであり、+ではなくコンマが必要です。
以下のコードを参照してください。
String queryForUpdateCustomer = "UPDATE customer SET cbalance=@txtcustomerblnc WHERE cname='" + searchLookUpEdit1.Text + "'";
try
{
using (SqlCommand command = new SqlCommand(queryForUpdateCustomer, con))
{
command.Parameters.AddWithValue("@txtcustomerblnc", txtcustomerblnc.Text);
con.Open();
int result = command.ExecuteNonQuery();
// Check Error
if (result < 0)
MessageBox.Show("Error");
MessageBox.Show("Record Update of Customer...!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
con.Close();
loader();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
con.Close();
}