0

ms access DBファイルに接続して、JET OLEDB接続を使用してC#で次の更新クエリを実行します。クエリはフィールドの変更に失敗し、正しく実行されますが、0 行しか変更されません。

問題は、パラメータがどのように処理され、DB と比較されるかだと思いますが、それを修正する方法がわかりません。

「ユーザー」列はテキストとして設定されます。パラメータと同じように完全に設定された挿入ステートメントがあります。

com.CommandText = "UPDATE [ExamMaster] SET [User] =  (DLookup('LName', 'Users', 'ID' = '@correctUser') WHERE [User] = '@user'";

com.Parameters.AddWithValue("@correctUser", correctUser);
com.Parameters.AddWithValue("@user", userName);

where句にパラメータを使用せず、次のようにコマンド文字列に挿入するだけの場合:

WHERE [User] = '"+userName+"'";</code>

DBをうまく更新します。ここで何が欠けていますか?更新:一重引用符の有無にかかわらず違いはなく、パラメーターの順序を並べ替えても機能しません。

4

2 に答える 2

1

順序が重要です。DLOOKUP関数が原因で、クエリuserの前に最初に呼び出されていると「思います」 。correctUser

com.Parameters.AddWithValue("@user", userName);
com.Parameters.AddWithValue("@correctUser", correctUser);

パラメータを一重引用符で囲む必要はありません。

WHERE [User] = @user";

また、フィールド名にスペースが含まれているか、予約語 ([User] の可能性がある) の場合は、[角かっこ] だけで、DLOOKUP にも単一引用符は必要ないと思います。

于 2013-02-20T18:10:04.030 に答える
0

少し変更する必要があります。試してください:

OleDbConnection cn = new OleDbConnection(aconnectionstring);
cn.Open();

//testing
int correctUser = 1;
string userName = "1";

OleDbCommand com = new OleDbCommand();
com.Connection = cn;

//You cannot have a parameter in DLookUp
com.CommandText = "UPDATE [ExamMaster] SET [User] = " +
   "DLookup('LName', 'Users', 'ID = " + correctUser + "') WHERE [User] = @user";

com.Parameters.AddWithValue("@user", userName);

//You must execute the query
com.ExecuteNonQuery();
于 2013-02-21T00:04:30.013 に答える