0

SQL ステートメントを再確認しましたが、SQL ステートメントがエラーのようです。なぜうまくいかないのかわかりません。私の SQL ステートメントは正しく、この OleDBException が発生しました。

ここにコードがあります

public void updateAccount(Int32 accountid, String username, String password, String isdisable)
{
     con.ConnectionString = db.konek();
     String sql = "UPDATE accounts SET username = @username, password = @password, isdisable = @isdisable WHERE accountid = @accountid";
     try
     {
         con.Open();
         OleDbCommand cmd = new OleDbCommand(sql, con);
         cmd.Parameters.AddWithValue("@username", username);
         cmd.Parameters.AddWithValue("@password", password);
         cmd.Parameters.AddWithValue("@isdisable", isdisable);
         cmd.Parameters.AddWithValue("@accountid", accountid);
         cmd.ExecuteNonQuery();
     }
     finally
     {
         con.Close();
     }
}

MS Access テーブルのスクリーンショット ここに画像の説明を入力

例外のスクリーンショット ここに画像の説明を入力

4

3 に答える 3

5

MICROSOFTJETの予約語PASSWORDを使用しています。
これが構文エラーの原因です。

SQLコマンドを角かっこでカプセル化する必要があります

 String sql = "UPDATE accounts SET username = @username, [password] = @password, "  + 
              "isdisable = @isdisable WHERE accountid = @accountid";

そして、名前付きパラメーターの問題について。
Microsoft Accessに関する限り、プロバイダーMicrosoft.ACE.OLEDB.12.0を使用すると、上記のSqlServerと互換性のある構文を使用できます。ただし、OleDbCommandのOleDbParameterコレクションにパラメーターを挿入するときは、パラメータープレースホルダーの正しい順序を尊重する必要があります。

于 2012-10-11T12:37:03.633 に答える
2

そのような名前付きパラメーターを追加すると、テキストは SQL クエリで置き換えられません。「?」を使用する必要があります。SQL文字列で、パラメータが置き換えられます:

string sql = "UPDATE accounts SET username = ?, password = ?, isdisable = ? WHERE accountid = ?"

名前付きパラメーターを使用してそこで行っていることは、テキストではなく、プロシージャに対してのみ機能します。

コマンドが次のように設定されている場合:

cmd.CommandType = CommandType.StoredProcedure

その後、名前付きパラメーターが機能します。ただし、デフォルトの CommandType.Text を使用しているため、「?」を使用する必要があります。OLEDB ドライバーにパラメーターを使用させるため。

于 2012-10-11T11:35:20.163 に答える