2009-03-16 4 views
0

Ich lese Daten aus MS Access mit C#. Aber bekommen die OleDbException versuchen, eine solche Abfrage auszuführen:OleDbException: Datentyp stimmt nicht in Kriterienausdruck überein

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

OleDbException:

Data type mismatch in criteria expression. 

Auf der anderen Seite, eine der folgenden Abfragen funktioniert:

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

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

Der C# -Code bleibt die ganze Zeit gleich:

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

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

Schließlich kann die Abfrage erfolgreich direkt in der MS Access UI ausgeführt werden.

Was ist hier falsch?

Antwort

1

Ich bin nicht sicher, aber ich glaube nicht, die OleDb Klassen benannte Parameter unterstützen. Versuchen Sie, die folgenden SQL statt:

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

Die Parameter für das Befehlsobjekt in der richtigen Reihenfolge hinzugefügt werden muss (ich sehe nicht, dass Sie die Parameter im Code hinzufügen).

+0

Abhängig von der zugrundeliegenden Datenbank, mit der es redet, erlaubt Ole benannte Parameter, verwendet aber nur die Namen nicht: Sie müssen sie immer noch in der Reihenfolge aufreihen. –

+0

AFAIK, OleDb unterstützt benannte Parameter, aber nicht vollständig. Sie können den Parametern Namen geben, aber Sie müssen sie in der richtigen Reihenfolge zum Befehlsobjekt hinzufügen. –

+0

Danke, Joel & Frederik. Ich habe die Reihenfolge der Parameter in ExecuteReader (...) geändert und es funktioniert! – alex2k8

0

Wo definieren/verwenden Sie die Parameter in Ihrer SQL-Zeichenfolge? Ich sehe sie nicht.

Versuchen Sie folgendes:

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

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

[theDate] und [theFlat] funktioniert für mich sowie @theDate und @theFlat. – alex2k8

0

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

Im Gegensatz zu dem, was der vorhergehenden Dokumentationsfehler beschreibt, die OleDbCommand Parameter sind Positions , wenn sie mit dem Microsoft SQL Server OLE DB-Provider verwendet werden. Die Namen der Parameter können beliebig sein ... Die Reihenfolge der Parameter, die Sie hinzufügen, um die OleDbParameterCollection muss die Reihenfolge der Parameter in Ihrer gespeicherten Prozedur übereinstimmen.

Verwandte Themen