IF @@Rowcount = 0 -- SQL Syntax Error in Access
I have a subroutine in excel that I would like to write data to an Access table. I am trying to update a row in the table if it alr开发者_如何学Ceady exists, add it if it does not. Going off of the suggestion given on this MSDN blog by Jeremiah Clark, I have my query that I will execute from my Excel's VBA subroutine:
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 )
The error it gives me is:
Syntax error (missing operator) in query expression '([Column1] = 'text' AND [Column2] = 'text2')
If @@ROWCOUNT = 0
INSERT INTO tblName
VALUES ( [Column1] = 'text', ...(other values)...'.
I'm pretty new to SQL, but have tried various ways of bracketing (parentheses-ing) the IF line in case the evaluation order was not what I expected, but that was to no avail. Is the first part of the query not being evaluated and thus @@ROWCOUNT cannot be executed properly?
Edit1: Using Access 2003 if that matters.
Solution: Based on bluefeet's suggestion (see his entire response):
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
This relies on a modified SELECT query to get Access to return the Count of the records:
sqlStrSelect = "SELECT Count(id) FROM table1 WHERE id = 3"
HansUp correctly surmised that I was using an ADO connection, so executing the code had to be done differently from what bluefeet originally suggested.
The @@ROWCOUNT
is used for SQL Server not Access but since you are using VBA
you could do something similar to this. Basically create your SQL statements as strings putting in your values that you are checking for. Then run query against the table first to see if the record exists, if it does then do the UPDATE
if not then do the INSERT
. I quickly tested this in MS Access 2003 and it works.
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
EDIT: As HansUp pointed out you are querying from Excel, your code could be similar to this:
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
This has been tested from Excel 2003 to Access 2003 and worked. You need to have the references added to your Excel file for the Microsoft ActiveX Data Objects.
精彩评论