OleDbを介してAccessデータベースでUPDATEクエリを呼び出すことができないのはなぜですか?
質問
更新2:これを解決しました。答えをご覧ください。
OleDbを使用してC#からMicrosoft Accessデータベースでクエリを呼び出していますが、更新クエリを機能させることができません。
エラーはスローされませんが、更新はデータベースに保持されません。
誰でもこれに何か光を当てることができますか?
データベース内のSQLクエリ:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
C#:
OleDbCommand command = new OleDbCommand();
SetCommandType(command, CommandType.StoredProcedure, "NameOfQueryInAccessDatabase");
AddParamToSQLCmd(command, "@ID", OleDbType.Integer, 4, ParameterDirection.Input, id);
AddParamToSQLCmd(command, "@LastPolledDtg", OleDbType.Date, 4, ParameterDirection.Input, DateTime.Now);
using (OleDbConnection connection = new OleDbConnection("connectionString"))
{
command.Connection = connection;
connection.Open();
result = command.ExecuteNonQuery();
}
接続文字列:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\Administrator\\Desktop\\dev\\src\\Website\\App_Data\\tracking.mdb"
更新1:
1つのテーブルと1つのクエリを含む新しいデータベースを作成し、C#を実行してテーブルを更新するときにアクセスが閉じられるようにして、可能性を絞り込みました。
更新はまだ実行されていません。構文の問題だと思いますが(パーミッションの問題でしょうか?)、エラーメッセージがなければ、デバッグするのはかなり困難です!
解決
この問題は解決しました-パラメータの名前付けでした-クエリのパラメータにどのフィールドとも同じ名前を付けることはできないようです。
クエリの変更元:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;
to:
UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtgArg
WHERE tableName.key = ID;
...パラメータ名を変更して呼び出し側のC#を更新すると、データベースに書き込みが行われます。
しかし、もう少し厄介なことがありました: C#のパラメーターの順序をそのままにすると、データベースのLastPolledDtgフィールドが最小日付(1899など)で更新されました。 OleDbCommandへのパラメーターの追加を並べ替えて、SQLでの出現に一致するように修正しました。
したがって、C#は次のようになります。
OleDbCommand command = new OleDbCommand();
SetCommandType(command, CommandType.StoredProcedure, "NameOfQueryInAccessDatabase");
AddParamToSQLCmd(command, "@LastPolledDtgArg", OleDbType.Date, 4, ParameterDirection.Input, DateTime.Now);
AddParamToSQLCmd(command, "@ID", OleDbType.Integer, 4, ParameterDirection.Input, id);
using (OleDbConnection connection = new OleDbConnection("connectionString"))
{
command.Connection = connection;
connection.Open();
result = command.ExecuteNonQuery();
}
Accessが大好きな男性。
他のヒント
更新クエリは少しわかりにくいです(フィールドとして LastPolledDtg
を使用し、値として を使用しています)。
列を定義するパラメーターを意味する場合、それは機能しません。
それ以外の場合、 PARAMETER
構文を使用してAccessでクエリを書き換えてみてください。例:
PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long;
UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg]
WHERE tableName.key = [ID];
それでもうまくいかない場合は、保存されたクエリを実行するのではなく、C#から直接クエリにSQLを使用してみてください。
他の何か
ID
の前に LastPolledDtArg
の値を渡すように、クエリで定義されているのと同じ順序でパラメーターが渡されるようにパラメーターを並べ替えます。
ms-accessでは、パラメーターはSQLステートメントと同じ順序である必要があります。
私はアクセスコーダーではありませんが、暗黙的なトランザクションが使用されているようです。つまり、データ変更コマンドを実行すると、トランザクションが自動的に開かれ、コードで明示的にコミット/ロールバックする必要があります。
更新の影響を受ける行がないか、何らかの理由で。