OleDbException:条件表达式中的数据类型不匹配

Posted

技术标签:

【中文标题】OleDbException:条件表达式中的数据类型不匹配【英文标题】:OleDbException: Data type mismatch in criteria expression 【发布时间】:2009-03-16 12:44:40 【问题描述】:

我使用 C# 从 MS Access 读取数据。但是让 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=?

参数必须以正确的顺序添加到命令对象(我没有看到你在代码中添加参数)。

【讨论】:

根据它与之对话的底层数据库,Ole 允许命名参数但不使用名称:您仍然必须按顺序排列它们。 AFAIK ,OleDb 支持命名参数,但不完全支持。您可以为参数命名,但是,您确实需要以正确的顺序将它们添加到命令 - 对象中。 谢谢你,乔尔和弗雷德里克。我更改了 ExecuteReader(...) 中的参数顺序,它起作用了!【参考方案2】:

您在哪里定义/使用 SQL 字符串中的参数;我没有看到他们。

试试这个:

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

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

【讨论】:

[theDate] 和 [theFlat] 以及 @theDate 和 @theFlat 对我有用。【参考方案3】:

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

与前面的相反 文档错误描述, OleDbCommand 参数是位置参数 当它们与 Microsoft 一起使用时 SQL Server OLE DB 提供程序。名字 参数可以是任意的... 您输入的参数的顺序 添加到 OleDbParameterCollection 必须与参数的顺序匹配 在您的存储过程中。

【讨论】:

以上是关于OleDbException:条件表达式中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

OleDbException 未处理:查询表达式中的语法错误(缺少运算符)

条件表达式中的数据类型不匹配 (Access DB)

在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。

向 Access 数据库发送数据时出错

OleDbException:ORDER BY 子句中的语法错误

System.Data.OleDb.OleDbException:定义的字段太多