2009-03-14 7 views
3

更新2:私はこれを解決しました。私の答えを見てください。OleDb経由でAccessデータベースでUPDATEクエリを呼び出すのが機能しないのはなぜですか?


私は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#を実行すると、アクセスが閉じられている確保することによって可能性を絞り込むしようとしました。

更新はまだ実行されていません。私はそれが構文上の問題(パーミッションの問題かもしれない)だと思うが、どんなエラーメッセージもなく、デバッグするのはかなり難しい!

+0

+1素晴らしい!永続性が報われ、答えを共有してくれてありがとう。 – Sung

答えて

5

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

からのクエリを変更する:に

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

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

...とパラメータ名の変更で呼び出すのC#を更新するには、データベースへの書き込みです。

しかし、一つの他の少し厄介だった:あるとしては、C#でのパラメータの順序を残すには、最小の日付(1899か何か)で更新されるデータベースにLastPolledDtgフィールドを引き起こしました。 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(); 
} 

マン。

+0

+1アクセスは、私がそれを嫌うやり方で本当に愛好家です。 – Sung

+0

Jetに実際に渡しているSQLにはパラメータがないため、これはAccess/Jetの問題ではありません。 –

+0

ああ、私はこれで少なくとも1時間を過ごしました。 – stimms

0

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

いずれか、または何らかの理由で更新プログラムによって影響を受ける行がありません。

3

あなたの更新クエリはちょっと混乱しています(LastPolledDtgを値としてとして使用しています)。 列を定義するパラメータを意味する場合は、機能しません。

それ以外の場合は、例えば、PARAMETER構文を使用してAccessでクエリを書き換えしよう:

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

問題が解決しない場合は、C#のから直接、クエリのSQLを使用しての代わりに、実行しようとしてみてください格納されたクエリ

何か他

再ため、あなたのパラメータ彼らはあなたがIDLastPolledDtArgに値を渡すように、それらがクエリで定義されているのと同じ順序で渡されるようにします。

+0

ありがとう、私はそれを行ってあげるよ。 – Ben

1

ms-accessでは、のパラメータは、SQL文と同じ順序でなければなりません。