OleDbを介してAccessデータベースでUPDATEクエリを呼び出すことができないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/645063

  •  22-07-2019
  •  | 
  •  

質問

更新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ステートメントと同じ順序である必要があります

私はアクセスコーダーではありませんが、暗黙的なトランザクションが使用されているようです。つまり、データ変更コマンドを実行すると、トランザクションが自動的に開かれ、コードで明示的にコミット/ロールバックする必要があります。

更新の影響を受ける行がないか、何らかの理由で。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top