VBA ADODB 错误 -2147217904 - 未为某些必需参数指定值
Posted
技术标签:
【中文标题】VBA ADODB 错误 -2147217904 - 未为某些必需参数指定值【英文标题】:VBA ADODB Error -2147217904 - Values were not specified for some of the required parameters 【发布时间】:2014-02-13 11:51:16 【问题描述】:在 Excel VBA 项目中,我使用 .accdb Access DB 以及 ADODB.Connection 来执行查询等。我的系统有 MS Office 2007(英语),但客户的系统是 Office 2010(西班牙语)。
我已经在我的机器上进行了测试,查询、插入等都可以正常工作。但是当我在客户端的机器上测试时,我得到了以下错误:
错误 -2147217904,No se han especificado valores para algunos de los parametros requeridos。
这可以粗略地翻译为“没有为某些必需的参数指定值。”
给我问题的语句如下,使用conn.Execute sql, numRowsAffected
执行:
INSERT INTO SomeTable
(COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9, COL10, COL11, COL12, COL13, COL14)
VALUES (1, 'TEXT', 5163, 8482, 103, Verdadero, 3, -1, 'Blanco', 3, 33, 40, 29, 1);
我更改了列名以缩短代码。另外,Verdadero
在西班牙语中是 True
,以防有人想知道。
我在网上搜索过这个错误,但找不到太多有用的信息。 One forum(西班牙语)提到该错误通常意味着字段名称错误,例如表列名称从“Persona”更改为“Person”,但查询仍然引用“Persona”。我仔细检查过,我认为这里不是这种情况。此外,查询在我的系统上完美执行,如果是这样的问题,情况就不会如此。
还值得注意的是,其他插入成功执行(在客户端机器上),并且只有在执行此特定语句时才会遇到错误。此外,SomeTable
的 AUTOINCREMENT
PK ID 值未包含在上述 SQL 语句中。
我认为 2007 VBA 将与 2010 兼容,并且客户的计算机具有西班牙版本的 Office 并不重要,但现在我有疑问。我正在使用对“Microsoft Office 12.0 Object Library”的引用,而客户端是 14.0,以及 Microsoft ActiveX Data Objects 6.0 Library,而客户端是 6.1(我认为)。 Access数据库引擎对象库也是一样,我的是12.0,客户端是14.0。
有人知道任何潜在的原因吗?
【问题讨论】:
看起来问题出在Verdadero
上,它没有用单引号括起来,因此被认为是一个参数......事实上,你没有在代码中给它任何值。用单引号括起来,就像你已经包装了其他字段一样,将修复错误。
如果 col6 是布尔字段 @ShadowWizard 则不...在这种情况下,不应本地化布尔到字符串的转换。
在 conn.execute 上,您不能提供参数集合中的值而不是构建 sql(因为我认为这就是您正在做的)吗?
COL6 是一个布尔(位)字段。在该方法中,分配的值来自 VBA Boolean
数据类型。在我的机器上它显示为True
(无引号)...在客户端的机器上它显示为Verdadero
无引号。这仍然是一个问题吗?
Access SQL 忽略其他区域设置,如日期格式、数字格式(小数分隔符等),因此如果它也忽略语言设置,我不会感到惊讶。西班牙语版本的 Access 可能会将 True
本地化为 Veradero
for VBA,但如果 Access SQL 只“说英语”并且不知道 Veradero
的意思,我一点也不感到惊讶。
【参考方案1】:
正如问题的 cmets 所建议的,这似乎是另一个示例,说明 参数化查询 将使代码更易于管理(并且更安全)。在这种情况下,代码将如下所示:
Option Compare Database
Option Explicit
Sub InsertTest()
Dim con As ADODB.Connection, cmd As ADODB.Command
Const Veradero = True ' to simulate Spanish VBA environment
Set con = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = _
"INSERT INTO SomeTable (TextField, YesNoField) VALUES (?,?)"
cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255, "TEXT")
cmd.Parameters.Append cmd.CreateParameter("?", adBoolean, adParamInput, , Veradero)
cmd.Execute
Set cmd = Nothing
con.Close
Set con = Nothing
End Sub
【讨论】:
以上是关于VBA ADODB 错误 -2147217904 - 未为某些必需参数指定值的主要内容,如果未能解决你的问题,请参考以下文章