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 不能执行这个命令,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

OleDbCommand 在有效的命令文本上抛出异常

为啥休眠不能执行命令

为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?

为啥不能在多行执行 PSQL 元命令

为啥shell脚本中不能执行cd 命令

OleDbCommand 不会更新 MS Access 数据库,不会引发错误