2009-03-16 2 views
0

Я прочитал данные из MS Access с помощью C#. Но получить 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] 

С # код остается неизменным все время:

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.

Что здесь не так?

ответ

1

Я не уверен, но я не думаю, что классы OleDb поддерживает именованные параметры. Попробуйте следующий SQL вместо:

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

Параметры должны быть добавлены к объекту команды в правильном порядке (я не вижу, что вы добавления параметров в коде).

+0

В зависимости от базового db, с которым он ведет переговоры, Ole разрешает именованные параметры, но просто не использует имена: вам все равно придется выстраивать их по порядку. –

+0

AFAIK, OleDb поддерживает именованные параметры, но не полностью. Вы можете дать имена параметрам, но вам действительно нужно добавить их в правильном порядке в command-object. –

+0

Спасибо, Джоэл и Фредерик. Я изменил порядок параметров в 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

Вопреки тому, что описано в предыдущем ошибки документации, в параметры OleDbCommand позиционны , когда они используются с Microsoft поставщика SQL Server OLE DB. Имена параметров могут быть произвольными ... Порядок параметров, которые вы добавить в OleDbParameterCollection , должен соответствовать порядку параметров в вашей хранимой процедуре.

Смежные вопросы