我正在使用Python,尝试从SQL Server中读取表,然后将数据插入Access中的表中。我发现做到这一点的最佳方法是使用pandas数据框。我编写了一个程序,将SQL Server表读入数据帧,如下所示:
dataframe = pandas.read_sql(selectSql, srcConn)
它在约209MB的表上运行良好。当我在〜1,116MB的表上尝试时,会抛出一个没有描述的异常。我猜想这与它正在读取的表的大小有关(如果这样的话,那会很好)。我知道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。
更新:
我遵循了Gord的建议,现在我的代码如下:
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驱动程序] ODBC-连接到“ SQL ServerSERVERNAME的ODBC驱动程序13”失败。 (-2001)(SQLExecDirectW)“)
来源= 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:
事实证明我的访问权限是32位的。但这仍然不能解释为什么我最初使用32位Python 3.7时无法连接。
谢谢。
答案 0 :(得分:1)
我能够通过简单的操作使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:\__tmp\test.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")