如何在Node.js中使用ADODB获取MS Access数据库的所有列
在MS Access中通过ADODB获取表的所有列
你之前用的INFORMATION_SCHEMA.COLUMNS是SQL Server这类数据库的标准系统视图,但MS Access不支持这个。不过用ADODB有两种可靠的方式实现相同需求:
1. 用ADODB的OpenSchema方法(推荐)
这是ADO的标准接口,不需要依赖Access特定的系统表,兼容性更好,也不用处理权限问题。
下面是VBA里的示例代码:
Sub GetAccessTableColumns() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim targetTable As String targetTable = "你的表名" ' 替换成你要查的表名 ' 建立数据库连接 Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\你的数据库路径\数据库名.accdb;" ' 调用OpenSchema获取指定表的列信息 ' adColumns是Schema类型常量,筛选数组顺序是:目录、架构、表名、列名 Set rs = conn.OpenSchema(adColumns, Array(Empty, Empty, targetTable)) ' 遍历结果输出列名 Do While Not rs.EOF Debug.Print rs("COLUMN_NAME").Value ' 也可以把值存到变量或列表里 rs.MoveNext Loop ' 清理资源 rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub
如果是其他支持ADODB的语言(比如VB6),逻辑完全一样,只是语法细节可能略有不同。
2. 查询Access的系统表
Access自带MSysColumns(存列信息)和MSysObjects(存对象信息)两个系统表,关联它们就能查到列名,但默认普通用户没有这两个表的访问权限,需要先授权。
SQL查询语句如下:
SELECT MSysColumns.Name AS COLUMN_NAME FROM MSysColumns INNER JOIN MSysObjects ON MSysColumns.ObjectId = MSysObjects.Id WHERE MSysObjects.Name = '你的表名' AND MSysObjects.Type = 1 ' Type=1代表用户表 AND MSysColumns.Name NOT LIKE 'MSys%' ' 排除系统自带的列
用ADODB执行这个SQL的示例:
Sub GetColumnsFromSystemTables() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim targetTable As String Dim sqlStr As String targetTable = "你的表名" Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\你的数据库路径\数据库名.accdb;" ' 注意转义表名里的单引号,避免SQL注入 sqlStr = "SELECT MSysColumns.Name AS COLUMN_NAME " & _ "FROM MSysColumns INNER JOIN MSysObjects ON MSysColumns.ObjectId = MSysObjects.Id " & _ "WHERE MSysObjects.Name = '" & Replace(targetTable, "'", "''") & "' " & _ "AND MSysObjects.Type = 1 AND MSysColumns.Name NOT LIKE 'MSys%'" Set rs = conn.Execute(sqlStr) Do While Not rs.EOF Debug.Print rs("COLUMN_NAME").Value rs.MoveNext Loop rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub
如果运行时提示权限错误,需要打开Access数据库,依次操作:文件>选项>信任中心>信任中心设置>宏设置,勾选启用所有宏;然后通过工具>安全>用户与组权限给当前用户赋予MSysColumns和MSysObjects的读取权限。
内容的提问来源于stack exchange,提问作者Mohammed Saber
相关产品推荐
相关产品推荐

