为何SSMS能使用本地未安装的驱动导入.mdb?如何在Python中复用?
问题背景
我有一个存储为.mdb文件的MS Access数据库,通过Microsoft SQL Server Management Studio(SSMS)将其完整导入现有SQL数据库,操作步骤如下:
- 右键点击数据库名称,选择「工具」→「导入数据」
- 选择Microsoft Jet驱动并选中目标
.mdb文件 - 选择目标数据库并命名架构
执行时的摘要信息(已移除敏感信息,实际为直接执行流程而非保存至文件):
Click Finish to perform the following actions: Source Location : C:\Users\myname\directorypaths\accessdatabasefilename.mdb Source Provider : Microsoft.Jet.OLEDB.4.0 Destination Location : servername Destination Provider : SQLNCLI11 Copy rows from `Table1` to [SchemaName].[Table1] The new target table will be created. Copy rows from `Table2` to [SchemaName].[Table2] The new target table will be created. Copy rows from `Table3` to [SchemaName].[Table3] The new target table will be created. Copy rows from `Table4` to [SchemaName].[Table4] The new target table will be created. The package will be saved to the package file "C:\Users\myname\Documents\myfilename.dtsx". The package will not be run immediately. Provider mapping file : C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\CommonExtensions\Microsoft\SSIS\150\MappingFiles\JetToMSSql9.xml
我希望直接在Python中提取.mdb文件的数据进行处理,而非通过SQL Server,但pyodbc仅列出以下驱动:
['SQL Server', 'SQL Server Native Client 11.0', 'ODBC Driver 17 for SQL Server']
核心疑问
- 为何SSMS会列出本地未安装的驱动?
- 它是如何不依赖该驱动将.mdb数据导入SQL数据库的?
- 我能否利用此方法在Python中获取.mdb数据?
解答
1. SSMS为何能列出未安装的驱动?
SSMS的导入数据功能基于SQL Server Integration Services(SSIS)组件,它会预先枚举所有官方支持的数据源驱动/提供程序,该列表是SSIS内置的配置项,并非检测本地已安装驱动后生成的,所以会出现本地未安装却能看到的情况。
2. SSMS如何完成.mdb数据导入?
它并非完全不依赖驱动,只是驱动可能随SSMS/SSIS静默安装了:
- 若你在64位系统上运行SSMS,而Jet驱动仅32位,SSIS会自动调用32位执行引擎(
DTEXEC.exe的32位版本),SSMS安装时会附带32位Jet驱动组件用于兼容,只是你没手动安装过,也不会在系统ODBC数据源管理器中显示。 - 本质上还是依赖对应驱动完成数据读取与导入,只是驱动的安装和调用被SSIS封装了。
3. 能否在Python中复用该方法?
不行。SSIS的驱动调用逻辑是封装在自身运行时中的,没有开放给Python直接调用的接口。要在Python中读取.mdb文件,有两种可行方案:
- 安装ACE OLEDB驱动(支持32/64位,兼容.mdb和.accdb文件),或者32位的Microsoft Jet OLEDB 4.0驱动(需搭配32位Python),之后用pyodbc或
win32com.client连接读取。 - 使用跨平台第三方库
mdbtools,通过pymdbtools等封装库读取.mdb文件内容,无需安装微软驱动。
内容的提问来源于stack exchange,提问作者user91
相关产品推荐
相关产品推荐

