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 未处理:查询表达式中的语法错误(缺少运算符)
在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。