在Excel VBA项目中,我使用.accdb Access数据库,以及ADODB.Connection执行查询等。我的系统有MS Office 2007(英语),但客户端的系统是Office 2010(西班牙语)。
我在我的机器上测试过,查询,插入等都运行正常。但是当我在客户端的机器上测试时,我收到了以下错误:
错误-2147217904,没有特别关注al algunos delosparámetrosrequeridos。
可以大致翻译为“没有为某些必需参数指定值。”
使用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对象库”的引用,而客户端是14.0,而Microsoft ActiveX Data Objects 6.0库,而客户端是6.1(我认为)。对于Access数据库引擎对象库,我的是12.0,客户端是14.0。
任何人都知道有任何潜在的原因吗?
答案 0 :(得分:2)
正如问题评论中所建议的那样,这似乎是参数化查询将使代码更易于管理(以及更安全)的另一个示例。在这种情况下,代码看起来像这样:
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