Как выполнить SET IDENTITY_INSERT ON/OFF с помощью сквозного запроса из Access VBA?

У меня есть доступ к базе данных, которая имеет несколько связанных таблиц. Теперь я хотел бы выполнить SET IDENTITY_INSERT ON/OFF для этих таблиц. Я погуглил и нашел такие вещи

Private mDb As Database
Public Sub SetIdentityInsert(strTableName As String, strOnorOff As String)
 Dim qdf As QueryDef
 Dim strSQL As String

 On Error GoTo Proc_Err

 Set qdf = mDb.QueryDefs("qryIDENTITY_INSERT")

 strSQL = "SET IDENTITY_INSERT " & strTableName & " " & strOnorOff
 qdf.SQL = strSQL
 qdf.Execute

Proc_Exit:
 On Error Resume Next
 Set qdf = Nothing
 Exit Sub

Proc_Err:
 Resume Proc_Exit
 Resume
End Sub

с https://social.msdn.microsoft.com/Forums/sqlserver/en-US/063270f6-0bb6-4630-85f5-b5b3a72e5295/turning-identityinsert-on-from-ms-access?forum=sqldataaccess

Однако, если я сделаю это

Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs("Passthru")

Я жалуюсь, что переданная строка должна быть одной из: DELETE, INSERT, SELECT, PROCEDURE или UPDATE.

Я уверен, что это возможно как-то. Здесь автор вставляет пример кода, вызывающего Sub ExecutePassThru, но код для него отсутствует.

1 ответ

Решение

[Он] жалуется, что переданная строка должна быть одной из: DELETE, INSERT, SELECT, PROCEDURE или UPDATE.

Access не распознает, что запрос является (должен быть) транзитным запросом, потому что .Connect собственность QueryDef не была установлена ​​строка, которая начинается с "ODBC;" Вам нужно установить .Connect свойство, прежде чем установить .SQL имущество.

Поскольку у вас уже есть связанные таблицы, определенные в базе данных, вы можете просто скопировать одну из их .Connect свойства, как это:

Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.QueryDefs("Passthru")
qdf.Connect = cdb.TableDefs("YourExistingLinkedTableName").Connect
qdf.ReturnsRecords = False
qdf.SQL = "SET IDENTITY_INSERT " & TheRestOfYourSqlCommand
Другие вопросы по тегам