OleDbCommand 不能执行这个命令,为啥?
Posted
技术标签:
【中文标题】OleDbCommand 不能执行这个命令,为啥?【英文标题】:OleDbCommand can't excute this command, Why?OleDbCommand 不能执行这个命令,为什么? 【发布时间】:2009-12-15 07:22:45 【问题描述】:我在 MS-Access 数据库中创建了一个名为“PathTable”的表。 表格是这样的:
------------------------------
| IP | Input | Output |
------------------------------
| 127.0.0.1 | XXXXX | YYYYYY |
------------------------------
当我编写这些程序时
String CommandString = "SELECT Input, Output FROM PathTable WHERE IP = '127.0.0.1'";
OleDbCommand CommandObj = new OleDbCommand( CommandString, m_Connection );
OleDbDataReader ReaderObj = CommandObj.ExecuteReader();
代码总是抛出OleDbException,ErrorDescription是E_FAIL(0x80004005),
但如果我将 commandString 替换为
SELECT * FROM PathTable WHERE IP = '127.0.0.1'
这个问题再也没有发生过。
所以,我的问题是:OleDbCommand 是否只执行“select *”?谢谢。
【问题讨论】:
【参考方案1】:也许这些是reserved 字。尝试引用它们:
SELECT [Input], [Output] FROM PathTable WHERE IP = '127.0.0.1'
【讨论】:
不会把它们当作字符串字面量达林吗? 谢谢你,达林。 “输入”和“输出”确实是 MS-Access 保留字。但我从来不知道。 方括号的替代方案(这是邪恶的,会破坏派生表的标准 Access SQL 89 实现)是否完全限定字段,即“SELECT PathTable.Input, PathTable.Output”? @David W. Fenton:Access 的 ANSI-89 查询模式对派生表的实现本身就是邪恶的。请注意,“SQL-89”指的是 SQL 标准,Access 用语是 ANSI-89。另请注意,标准 SQL 使用双引号(ascii 代码 0034)而不是方括号来转义关键字,因此此处暗指 SQL 标准是不恰当的。【参考方案2】:我正在向您发送 Microsoft 保留字列表,请检查,您使用的是保留关键字,这就是您遇到此问题的原因。
http://support.microsoft.com/kb/321266
【讨论】:
【参考方案3】:“输入”或“输出”可能是 Access SQL 中的保留字,因此请尝试在这些字段名称周围添加 [] 方括号。
【讨论】:
不仅访问 SQL,而且从 SQL-92 开始的 ODBC 和 ISO/ANSI 标准 SQL。【参考方案4】:输入和输出可能是关键字。尝试用方括号将它们括起来。即
[输入] [输出]
【讨论】:
【参考方案5】:找不到文件 - 此异常的另一个可能原因是您尝试加载/读取的文件不存在。
我发现在尝试打开文件之前执行“File.Exists”很有用,只是为了确保我的代码正确检测到“IErrorInfo.GetDescription failed with E_FAIL(0x80004005)”异常的具体原因。
【讨论】:
以上是关于OleDbCommand 不能执行这个命令,为啥?的主要内容,如果未能解决你的问题,请参考以下文章