我在excel中有一个子例程,我想将数据写入Access表。我正在尝试更新表中的行(如果已存在),如果不存在则添加它。将要去关建议由耶利米克拉克这个MSDN博客给出的,我有我的查询,我会从我的Excel的VBA子程序执行:
UPDATE tblName SET [Column1] = 'text', ...(other values)... [ColumnN] = 1234 WHERE ([Column1] = 'text' AND [Column2] = 'text2') If @@ROWCOUNT = 0 INSERT INTO tblName VALUES ( [Column1] = 'text', ...(other values)... [ColumnN] = 1234 )
它给我的错误是:
Syntax error (missing operator) in query expression '([Column1] = 'text' AND [Column2] = 'text2') If @@ROWCOUNT = 0 INSERT INTO tblName VALUES ( [Column1] = 'text', ...(other values)...'.
我对SQL还是很陌生,但是尝试了各种方法将IF行括起来(用括号括起来),以防评估顺序不符合我的预期,但是这样做毫无用处。查询的第一部分是否未评估,因此无法正确执行@@ ROWCOUNT?
Edit1 :如果重要,请使用Access 2003。
解决方案: 根据bluefeet的建议(请参阅他的完整回复):
objDB.Execute sqlStrSelect recordset.Source = sqlStrSelect recordset.Open , , adOpenDynamic, adLockOptimistic If recordset.Fields(0) = 0 Then objDB.Execute sqlStrInsert Else objDB.Execute sqlStrUpdate End If
这依赖于修改后的SELECT查询来获取Access以返回记录的Count:
sqlStrSelect = "SELECT Count(id) FROM table1 WHERE id = 3"
HansUp正确地推测出我正在使用ADO连接,因此执行代码的方式必须不同于bluefeet最初的建议。
该@@ROWCOUNT用于SQL服务器无法访问,但由于使用的是VBA你可以做一些类似的。基本上,将SQL语句创建为字符串,并放入要检查的值。然后首先对表运行查询以查看记录是否存在,如果存在,则执行记录,否则UPDATE执行INSERT。我在MS Access 2003中对此进行了快速测试,并且可以正常工作。
@@ROWCOUNT
VBA
UPDATE
INSERT
Public Sub test() Dim sqlStrUpdate As String Dim sqlStrSelect As String Dim sqlStrInsert As String Dim recordSet As recordSet sqlStrUpdate = "UPDATE table1 SET Field1 = " & 5 & " WHERE id = 3" sqlStrSelect = "SELECT id FROM table1 WHERE id = 3" sqlStrInsert = "INSERT INTO table1 (id, Field1, Field2, Field3) VALUES (3, 5, 0, 0)" Set recordSet = CurrentDb.OpenRecordset(sqlStrSelect) If recordSet.RecordCount > 0 Then DoCmd.RunSQL (sqlStrUpdate) ElseIf recordSet.RecordCount = 0 Then DoCmd.RunSQL (sqlStrInsert) End If End Sub
编辑:正如HansUp指出的那样,您正在从Excel查询,您的代码可能与此类似:
Public Sub test_new() Dim cDir_Database As String Dim DB_Conn As New ADODB.Connection 'Access Connection Dim DB_RSet As New ADODB.recordSet 'Access Record Set Dim sqlStrUpdate As String Dim sqlStrInsert As String cDir_Database = ".\.\.AccessBD.mdb " sqlStrUpdate = "UPDATE table1 SET Field1 = " & 10 & " WHERE id = 4" sqlStrInsert = "INSERT INTO table1 (id, Field1, Field2, Field3) VALUES (4, 5, 0, 0)" DB_Conn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};" & _ "DBQ=" & cDir_Database & ";" DB_Conn.Open DB_Conn.BeginTrans DB_RSet.Open "SELECT id FROM table1 WHERE id = 4", DB_Conn, adOpenStatic, adLockReadOnly If DB_RSet.RecordCount > 0 Then DB_Conn.Execute (sqlStrUpdate) ElseIf DB_RSet.RecordCount = 0 Then DB_Conn.Execute (sqlStrInsert) End If DB_RSet.Close DB_Conn.CommitTrans DB_Conn.Close End Sub
这已经从Excel 2003到Access 2003进行了测试,并且可以正常工作。您需要将引用添加到Microsoft ActiveX数据对象的Excel文件中。