使用Python,我试图从SQL Server读取一个表,然后在Access中将数据插入到一个表中。我发现最好的方法是使用pandas数据帧。我编写了一个程序,可以将SQL Server表读取到数据帧中,如下所示:
dataframe = pandas.read_sql(selectSql, srcConn)
它在约209MB的表上运行良好。当我在~1116MB的表上尝试它时,它会抛出一个没有描述的异常。我猜这与它正在阅读的桌子的大小有关(如果它这么说就好了)。我知道Access只能容纳2GB,但它还有足够的空间,而且它甚至没有到达在抛出错误之前写入Access的部分。
有什么方法可以为较大的桌子解决这个问题吗?有没有更好的方法可以使用Python将表从SQL Server 2008 R2复制到Access 2016?我在Win10 64位上有16GB的RAM,所以这应该不是问题。我尝试过32位Python 3.7和64位Python 3.6,但都没有成功。我先尝试了SSIS,但每当我尝试打开一个连接到Access的包时,它都会使我的整个Visual Studio崩溃。
更新:
我遵循了戈尔德下面的建议,现在我的代码看起来是这样的:
access_cnxn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=' + access_db + ';'
)
sqls_cnxn_str = (
r'DRIVER=ODBC Driver 13 for SQL Server;'
r'SERVER=' + sqls_server + ';'
r'DATABASE=' + sqls_db + ';'
r'UID=' + sqls_username + ';'
r'PWD=' + sqls_password + ';'
)
这种连接本身起作用:
sqls_cnxn = pyodbc.connect(sqls_cnxn_str)
这种连接本身就起作用:
pyodbc.pooling = False
access_cnxn = pyodbc.connect(access_cnxn_str, autocommit = True)
但这是一个错误:
access_cnxn.execute(f"SELECT * INTO {access_table} FROM [ODBC;{sqls_cnxn_str}].{sqls_table}")
抛出的错误:
Message=('HY000',"[HY000][Microsoft][ODBC Microsoft Access Driver]ODBC--连接到"SQL ServerSERVERNAME的ODBC驱动程序13"失败。(-2001)(SQLExecDirectW)")
Source=C:\Users\bruescm\Source\repos\DB_Test\DB_Test\SyncAllTests.py
StackTrace:文件"C:\Users\bruescm\source\repos\DB_Test\DB_Test\SyncAllTests.py",第行57,在sync_table中dest_cnxn.execute(f"SELECT*INTO{access_table}FROM[ODBC;{sqls_cnxn_str}].{sqls_table}")文件"C:\Users\bruescm\source\repos\DB_Test\DB_Test\SyncAllTests.py",第行121,主要sync_table('',sqls_table,get_access_cnxn(),access_table)文件"C:\Users\bruescm\source\repos\DB_Test\DB_Test\SyncAllTests.py",第行124,英寸main()
错误中的SERVERNAME是SQL server所在服务器的名称。不知道为什么它会把它和错误中的司机名字挤在一起。
有什么想法吗?
更新2:
原来我的Access是32位的。这仍然不能解释为什么它不会连接,因为我最初使用的是Python 3.7 32位。
谢谢。
我能够让Access数据库引擎从SQL Server中提取一个表,并通过简单的在Access数据库中创建一个副本
pyodbc.pooling = False # required
cnxn = pyodbc.connect("DSN=myAccessDb", autocommit=True)
cnxn.execute("SELECT * INTO access_tbl FROM [ODBC;DSN=SQLmyDb].sql_server_tbl")
其中SQLmyDb
是我的SQL Server实例的ODBC DSN。
更新
刚刚测试以确认无DSN连接字符串也能工作:
pyodbc.pooling = False # required
access_cnxn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=C:__tmptest.accdb;'
)
cnxn = pyodbc.connect(access_cnxn_str, autocommit=True)
sql_cnxn_str = (
r'DRIVER=ODBC Driver 17 for SQL Server;'
r'SERVER=(local)SQLEXPRESS;'
r'DATABASE=myDb;'
r'Trusted_Connection=Yes;'
)
cnxn.execute(f"SELECT * INTO access_tbl FROM [ODBC;{sql_cnxn_str}].sql_server_tbl")