如何使用来自 Access VBA 的直通查询执行 SET IDENTITY_INSERT ON/OFF?

Posted

技术标签:

【中文标题】如何使用来自 Access VBA 的直通查询执行 SET IDENTITY_INSERT ON/OFF?【英文标题】:How to execute SET IDENTITY_INSERT ON/OFF with a pass-through query from Access VBA? 【发布时间】:2016-03-11 11:33:01 【问题描述】:

我有一个 Access db,它链接了几个表。现在我想在这些表上执行 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 之一。

我很确定这是可能的。 Here作者粘贴了调用Sub ExecutePassThru的示例代码,但是没有它的代码。

【问题讨论】:

你能仔细检查查询类型吗?此错误通常由 SELECT 查询返回,而不是 Pass-Throughs。 在哪里可以设置查询类型?我在 QueryDef 中没有找到这样的属性。 除了@GordThompson 的出色回答;您也可以手动检查。右键单击您的查询。从菜单中选择设计视图。确保选择了 Query Tools Design 功能区。功能区的查询类型部分有 9 个按钮:选择、制作表、追加、...、传递和数据定义。检查突出显示的内容。 我在设计视图中没有任何查询。我知道我可以在那里设置直通属性。我想在 vba 中构建一个查询并将其传递给 SQL Server。 【参考方案1】:

[It] 抱怨传递的字符串必须是 DELETE、INSERT、SELECT、PROCEDURE 或 UPDATE 之一。

Access 无法识别该查询是(打算是)直通查询,因为QueryDef.Connect 属性尚未设置为以“ODBC;”开头的字符串。您需要在设置.SQL 属性之前设置.Connect 属性。

由于您已经在数据库中定义了链接表,您只需复制它们的.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

【讨论】:

我尝试过并添加了 qdf.ReturnsRecords = False。当我调用执行时,它现在告诉我 Laufzeitfehler '3146' ODBC-Aufruf fehlgeschlagen。翻译成英文这意味着错误 3146 ODBC 调用失败。 啊,我的查询是 SET IDENTITY_INSERT [Account] ON。如果我在 SSMS 中运行它,它会告诉我表“帐户”没有身份属性。无法执行 SET 操作。我想我可以在复制之前在每张桌子上调用它。谢谢。

以上是关于如何使用来自 Access VBA 的直通查询执行 SET IDENTITY_INSERT ON/OFF?的主要内容,如果未能解决你的问题,请参考以下文章

刷新访问直通查询

MS Access 取消执行直通查询键盘快捷键

如何在 VBA 代码中的 ms-access 中执行查询?

Access 数据库直通查询?

如何使用 MySQl 的 ODBC 连接器在 MS Access 中的 VBA 中执行和查询?

来自 Access 的 Excel VBA SQL 没有结果