3

更新 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:

単一のテーブルと単一のクエリを含む新しいデータベースを作成し、C# を実行してテーブルを更新するときにアクセスが閉じられるようにすることで、可能性を絞り込もうとしました。

アップデートはまだ実行されていません。構文の問題だと思いますが (パーミッションの問題でもあるのでしょうか?)、エラー メッセージがなければデバッグはかなり困難です!

4

4 に答える 4

5

問題を解決しました-それはパラメータの命名でした-クエリ内のパラメータに他のフィールドと同じ名前を付けることはできないようです。

クエリの変更:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtg
WHERE tableName.key = ID;

に:

UPDATE tableName SET tableName.LastPolledDtg = LastPolledDtgArg
WHERE tableName.key = ID; 

...そして、呼び出し元のC#をパラメーター名の変更で更新すると、データベースに書き込まれます。

しかし、もう1つ厄介なことがありました。それは、C#のパラメーターの順序をそのままにして、データベースのLastPolledDtgフィールドを最小の日付(1899か何か)で更新することです。SQLでの発生に一致するように、OleDbCommandへのパラメーターの追加を並べ替えると、これが修正されました。

したがって、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();
}

アクセスが大好きな男。

于 2009-03-14T11:16:01.937 に答える
3

更新クエリは少し混乱します(LastPolledDtgフィールドおよびその値として使用しています)。列を定義するパラメーターを意味する場合、それは機能しません。

PARAMETERそれ以外の場合は、次のように構文を使用してAccessでクエリを書き直してみてください。

PARAMETERS LastPolledDtgArg Text ( 255 ), ID Long;
UPDATE tableName SET tableName.LastPolledDtg = [LastPolledDtgArg]
WHERE tableName.key = [ID];

それでも問題が解決しない場合は、保存されているクエリを実行するのではなく、C#から直接クエリにSQLを使用してみてください。

他の何か

パラメータを並べ替えて、クエリで定義されているのと同じ順序で渡されるようにします。これにより、 LastPolledDtArgbeforeの値が渡されますID

于 2009-03-14T10:36:47.257 に答える
1

ms-access では、パラメーターは SQL ステートメントと同じ順序にする必要があります

于 2013-08-28T11:34:54.047 に答える
0

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

それか、何らかの理由で、更新の影響を受ける行はありません。

于 2009-03-14T00:39:35.820 に答える