我在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中对此进行了快速测试,并且可以正常工作。
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文件中。
问题内容: 我在遵循MySQL语法指南时遇到语法错误。 我的查询是: 从逻辑上讲,这应该选择,但是我得到了 问题答案: 您的查询仅在存储过程/函数上下文中有效。参见那里以供参考。
问题内容: 我不断收到CREATE TABLE语法错误,但是看不到错误!是什么导致错误? 我的SQL: 问题答案: 由于您的DDL语句包括,因此您必须使用ADO执行它。我将您的语句加载到字符串变量中,然后从Access 2007中执行该语句,如下所示: 的 工资 字段是小数精度8,尺度2和默认15000。 是Jet 4.0附带的Access SQL功能之一。这些功能不适用于从DAO执行的语句。如果
我们可以像这样使用if-field: 但是这里有一些问题,我不明白为什么。 > 如果我运行(count已定义),则会引发错误: 我们能不能先分配一个值? 当我运行count=1 if False else l.append(count 1)(注意:count=0,l=[])时,将引发一个错误: l的结果是。 使用相同的条件,如果使用if-else块,则不会出现错误。 你能解释一下区别吗?
目前遇到此语法错误,错误发布在代码下方。 上面的代码,无法找出if语句上的语法错误。错误消息将很快粘贴为注释
我需要帮助。我正在开发上传文本文件的应用程序。就在这一刻,我遇到了错误,我不能清楚地理解。下面是我的代码: 使用TextFilesDB; 创建表(int(11)NOT NULL AUTO_INCREMENT, varchar(45)NOT NULL,varchar(45)默认NULL,varchar(45)默认NULL,mediumblob,主键()))
真的需要这方面的帮助... *插入语句时的语法错误* 私有子按钮2_Click(发件人作为对象,e作为事件参数)处理按钮2.单击