IF @@ Rowcount = 0 - ошибка синтаксиса SQL в Access - PullRequest
1 голос
/ 02 августа 2011

У меня есть подпрограмма в excel, которую я хотел бы записать в таблицу Access. Я пытаюсь обновить строку в таблице, если она уже существует, добавить ее, если она не существует. Исходя из предложения , данного Джеремией Кларком в этом блоге MSDN, у меня есть запрос, который я выполню из подпрограммы VBA в Excel:

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, чтобы получить доступ для возврата количества записей:

sqlStrSelect = "SELECT Count(id) FROM table1 WHERE id = 3"

HansUp правильно предположил, что я использовал соединение ADO, поэтому выполнение кода должно было выполняться не так, как первоначально предлагал bluefeet.

1 Ответ

3 голосов
/ 02 августа 2011

@@ROWCOUNT используется для SQL Server, а не для доступа, но так как вы используете 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 и работал,Вам необходимо добавить ссылки в ваш файл Excel для объектов данных Microsoft ActiveX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...