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”。我仔细检查过,我认为这里不是这种情况。此外,查询在我的系统上完美执行,如果是这样的问题,情况就不会如此。

还值得注意的是,其他插入成功执行(在客户端机器上),并且只有在执行此特定语句时才会遇到错误。此外,SomeTableAUTOINCREMENT 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 - 未为某些必需参数指定值的主要内容,如果未能解决你的问题,请参考以下文章

VBA 将整个 ADODB.Recordset 插入表中

excel vba 调用ADODB 问题?

VBA - ADODB.Connection - 使用参数和检索受影响的记录数

vba adodb读取文本文件

VBA ADODB 查询返回 -1

共享模块VBA之间的adodb连接