通过 ODBC 确定 SQL 服务器 table 是否具有来自 MS Access VBA 的 IDENTITY 列
Determining if a SQL Server table has IDENTITY column from MS Access VBA over ODBC
我有一个 MS Access 程序,它构建一个 SQL INSERT
语句,将 Access table 中的行插入链接的 SQL 服务器 table具有相同的 table 结构。 SQL 服务器 table 可能有也可能没有 IDENTITY
主键。
MS Access 源 table 已预填充其相应的主键,这些值必须插入 SQL 服务器 table 以供参考。 SQL 服务器不允许这样做,除非我切换 IDENTITY_INSERT
属性,但要决定是否需要切换,我需要确定是否有 IDENTITY
列第一名。
所以在 MS Access 的 VBA 中,我需要确定链接的 SQL 服务器 table 是否有一个 IDENTITY
列。
此问题已涵盖 here 但对于 Transact-SQL。
我其实可以通过pass-thru查询得到我需要的东西,所以是可行的。
- 创建对 SQL 服务器数据库的直通查询。
在 SQL 视图中输入
SELECT OBJECTPROPERTY(OBJECT_ID(N'table_name'), 'TableHasIdentity') AS 'HasIdentity'
并执行,如果 table 有一个 IDENTITY
列,它 returns 一个包含列 HasIdentity
且值为 1 的 1 行数据表。
问题是在 VBA 中我无法获取此数据表。鉴于来自 MS Access 的查询 运行s OK 我认为数据表必须对应于一个记录集,并且以下代码应该有效。
Public Function metaODBCExecuteSQL(ByVal pstrConn As String) As Recordset
Dim qdf As QueryDef
Dim rst As Recordset
Set qdf = CurrentDb.CreateQueryDef("ODBC Execute")
qdf.ReturnsRecords = True
qdf.Connect = pstrConn
qdf.SQL = "SELECT OBJECTPROPERTY( OBJECT_ID(N'table_name'), 'TableHasIdentity') AS 'HasIdentity'"
Set rst = qdf.OpenRecordset(, dbSeeChanges)
qdf.Close
Set metaODBCExecuteSQL = rst
END Function
取而代之的是 set rst
行 returns 运行-时间错误 3219 无效操作(有或没有 dbSeeChanges
,我认为这是使用 tables IDENTITY
).
谁能指出我如何从 SELECT OBJECTPROPERTY
查询中检索结果集?我的代码有什么问题,或者有其他方法。
毕竟如果 MS Access UI 可以做到,那一定有办法。
如果我创建并保存 查询,这在这里很有效:
? metaODBCExecuteSQL("")(0)
' Returns 0 or 1.
使用此函数并将 table_name 调整为某个有效的 table 名称:
Public Function metaODBCExecuteSQL(ByVal pstrConn As String) As Recordset
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Set qdf = CurrentDb.QueryDefs("ODBC Execute")
qdf.SQL = "SELECT OBJECTPROPERTY( OBJECT_ID(N'table_name'), 'TableHasIdentity') AS 'HasIdentity'"
Set rst = qdf.OpenRecordset()
qdf.Close
Set metaODBCExecuteSQL = rst
End Function
我有一个 MS Access 程序,它构建一个 SQL INSERT
语句,将 Access table 中的行插入链接的 SQL 服务器 table具有相同的 table 结构。 SQL 服务器 table 可能有也可能没有 IDENTITY
主键。
MS Access 源 table 已预填充其相应的主键,这些值必须插入 SQL 服务器 table 以供参考。 SQL 服务器不允许这样做,除非我切换 IDENTITY_INSERT
属性,但要决定是否需要切换,我需要确定是否有 IDENTITY
列第一名。
所以在 MS Access 的 VBA 中,我需要确定链接的 SQL 服务器 table 是否有一个 IDENTITY
列。
此问题已涵盖 here 但对于 Transact-SQL。
我其实可以通过pass-thru查询得到我需要的东西,所以是可行的。
- 创建对 SQL 服务器数据库的直通查询。
在 SQL 视图中输入
SELECT OBJECTPROPERTY(OBJECT_ID(N'table_name'), 'TableHasIdentity') AS 'HasIdentity'
并执行,如果 table 有一个
IDENTITY
列,它 returns 一个包含列HasIdentity
且值为 1 的 1 行数据表。
问题是在 VBA 中我无法获取此数据表。鉴于来自 MS Access 的查询 运行s OK 我认为数据表必须对应于一个记录集,并且以下代码应该有效。
Public Function metaODBCExecuteSQL(ByVal pstrConn As String) As Recordset
Dim qdf As QueryDef
Dim rst As Recordset
Set qdf = CurrentDb.CreateQueryDef("ODBC Execute")
qdf.ReturnsRecords = True
qdf.Connect = pstrConn
qdf.SQL = "SELECT OBJECTPROPERTY( OBJECT_ID(N'table_name'), 'TableHasIdentity') AS 'HasIdentity'"
Set rst = qdf.OpenRecordset(, dbSeeChanges)
qdf.Close
Set metaODBCExecuteSQL = rst
END Function
取而代之的是 set rst
行 returns 运行-时间错误 3219 无效操作(有或没有 dbSeeChanges
,我认为这是使用 tables IDENTITY
).
谁能指出我如何从 SELECT OBJECTPROPERTY
查询中检索结果集?我的代码有什么问题,或者有其他方法。
毕竟如果 MS Access UI 可以做到,那一定有办法。
如果我创建并保存 查询,这在这里很有效:
? metaODBCExecuteSQL("")(0)
' Returns 0 or 1.
使用此函数并将 table_name 调整为某个有效的 table 名称:
Public Function metaODBCExecuteSQL(ByVal pstrConn As String) As Recordset
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Set qdf = CurrentDb.QueryDefs("ODBC Execute")
qdf.SQL = "SELECT OBJECTPROPERTY( OBJECT_ID(N'table_name'), 'TableHasIdentity') AS 'HasIdentity'"
Set rst = qdf.OpenRecordset()
qdf.Close
Set metaODBCExecuteSQL = rst
End Function