1

Access データベースに接続する小さなプログラムがあり、編集フォームを使用して選択したレコードを更新 (編集) しようとしています。コードを実行すると、次のエラーが発生します。

System.Data.OleDb.OleDbException was unhandled
  Message=Syntax error (missing operator) in query expression '5346 S. Eubank blvd'.
  Source=Microsoft Access Database Engine
  ErrorCode=-2147217900

言うまでもなく、それは住所フィールド用です..

ここに私のコードブロックがあります:

private void saveChangeBtn_Click(object sender, EventArgs e)
{
    Customer.SetCustID(Convert.ToInt32(editIdTB.Text));
    Customer.SetFirstName(editFirstNameTB.Text);
    Customer.SetLastName(editFirstNameTB.Text);
    Customer.SetAddress(editAddressTB.Text);
    Customer.SetPhoneNum(editPhoneTB.Text);
    Customer.SetEmail(editEmailTB.Text);

    using (OleDbConnection connect = new OleDbConnection(connectionString))
    {
        OleDbCommand cmd = new OleDbCommand();
        connect.Open();

        cmd.Connection = connect;
        cmd.CommandText = "UPDATE Customers SET [Customer ID]=" + Customer.GetCustId() +
            ", [First Name]=" + Customer.GetFirstName() +
            ", [Last Name]=" + Customer.GetLastName() +
            ", [Address]=" + Customer.GetAddress() +
            ", [Phone Number]=" + Customer.GetPhoneNum() +
            ", [Email Address]=" + Customer.GetEmailAddress() + 
            ", WHERE [Customer ID]=" + editIdTB.Text + "";
        cmd.ExecuteNonQuery();
        connect.Close();
        MessageBox.Show("Changes made successfully!", "Success!", MessageBoxButtons.OK);
    }
    this.Close();
}
4

4 に答える 4

0

I think the problem you have is the comma before WHERE. Try remove that and give it a try.

It would be easier to diagnostics if you can capture the exact sql your executing, and try to run it in a query browser.

Also, I recommend you to use string.format when you are constructing the sql. For a better solution, try LINQ to SQL or Entity Framework.

于 2012-12-16T04:20:00.323 に答える
0

値を引用符で囲む必要があります。ここで主な問題を解決する必要があります。

ただし、ここには非常に大きなセキュリティ上の欠陥があります。Google で「SQL インジェクション」を検索すると、悪意のある人物が悪意のあるテキストを editIfTB テキストボックスに入力して、あなたの週を深刻に台無しにする可能性があることがわかります。

于 2012-12-16T04:37:04.857 に答える
0

セキュリティの脆弱性は別として、この方法でクエリを作成すると、安定性の問題が残ります。データ フィールドの 1 つにアポストロフィが含まれるとすぐに、SQL は再び壊れます (例: 姓 O'Neill)。ベスト プラクティスは、パラメーターを介してすべてのデータ値を指定することです。これらすべての一重引用符/アポストロフィで連結する必要がなくなり、データ値に敏感ではなく、セキュリティ上の脆弱性もありません。

于 2013-06-18T15:03:52.010 に答える
0

これを試して

cmd.CommandText = "UPDATE Customers SET [First Name]='" + Customer.GetFirstName() +
            "', [Last Name]='" + Customer.GetLastName() +
            "', [Address]='" + Customer.GetAddress() +
            "', [Phone Number]='" + Customer.GetPhoneNum() +
            "', [Email Address]='" + Customer.GetEmailAddress() + 
            "' WHERE [Customer ID]=" + editIdTB.Text;
于 2012-12-16T04:35:22.597 に答える