2009-03-16 17 views
0

私はC#を使用してMS Accessからデータを読み取ります。しかし、このようなクエリを実行しようとしているOleDbExceptionを取得:OleDbException:条件式でのデータ型の不一致が

SELECT * FROM Flats 
WHERE Flats.VersionStamp <= [theDate] AND Flats.Flat=[theFlat] 

OleDbException:他の側では

Data type mismatch in criteria expression. 

、次のクエリのいずれかが正常に動作します:

SELECT * FROM Flats 
WHERE Flats.VersionStamp <= [theDate] AND Flats.Flat=1 

SELECT * FROM Flats 
WHERE Flats.VersionStamp <= #1/1/2009# AND Flats.Flat=[theFlat] 

C#コード同じすべての時間をまま:

DbParameter theFlat = new OleDbParameter("theFlat", 1); 
DbParameter theDate = new OleDbParameter("theDate", new DateTime(2009, 1, 1)); 

using (DbDataReader reader = dbHelper.ExecuteReader(sqlText, theFlat, theDate)) 
{ } 

最後に、MS Access UIでクエリを正常に実行できます。

ここで何が間違っていますか?

答えて

1

私はわからないが、私はOLEDBクラスは名前付きパラメータをサポートしていないと思います。代わりに、次のSQLを試してみてください。

SELECT * FROM Flats WHERE Flats.VersionStamp <= ? AND Flats.Flat=? 

パラメータは(私はあなたのコード内のパラメータを追加表示されていない)正しい順序でコマンドオブジェクトに追加する必要があります。

+0

は、それがに話しdbの根底に応じて、オレは名前付きパラメータを使用できますが、名前だけを使用していません:あなたはまだ順序でそれらを整列する必要があります。 –

+0

AFAIK、OleDbは名前付きパラメータをサポートしますが、完全にはサポートしていません。パラメータに名前を付けることはできますが、コマンドオブジェクトに正しい順序で名前を追加する必要があります。 –

+0

ありがとう、Joel&Frederik。私はExecuteReader(...)でパラメータの順序を変更し、それは動作します! – alex2k8

0

はどこでSQL文字列内のパラメータを使用して/定義しています。私はそれらを見ない。

はこれを試してみてください:

SELECT * From Flats WHERE VersionStamp = @theDate AND Flat = @theFlat 

DbParameter = new OleDbParameter ("@theDate", someDate); 
+0

[theDate]と[theFlat]は、@theDateと@theFlatと同様に私の仕事です。 – alex2k8

0

http://support.microsoft.com/default.aspx?scid=kb;en-us;316744

前の ドキュメントのエラーが説明に反して、彼らは、Microsoft SQL ServerのOLE DBプロバイダで使用されている場合、 のOleDbCommandパラメータは 位置しています。パラメータの名前 は任意である...あなたがOleDbParameterCollection に追加 パラメータの 順序は、ストアドプロシージャ内のパラメータ の順序と一致する必要があります。

関連する問題