Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我可以从Python使用Access数据库中的本地表和ODBC链接表吗?_Sql Server_Ms Access_Odbc_Pyodbc_Pypyodbc - Fatal编程技术网

Sql server 我可以从Python使用Access数据库中的本地表和ODBC链接表吗?

Sql server 我可以从Python使用Access数据库中的本地表和ODBC链接表吗?,sql-server,ms-access,odbc,pyodbc,pypyodbc,Sql Server,Ms Access,Odbc,Pyodbc,Pypyodbc,PyODBC如何连接到.accdb数据库中的链接表?这到底是可能的,还是pyodbc的局限性 我需要将MS Acess.accdb数据库中的数据输入Python。这非常有效,我可以使用pyodbc访问.accdb数据库中定义的表和查询。但是,数据库也有链接到外部SQL Server的表。访问此类链接表时,pyodbc抱怨无法连接到SQL server test.accdb包含两个表:test(本地表)和cidb\u ain(链接SQL表) 以下Python 3代码是我访问数据的尝试: impor

PyODBC如何连接到.accdb数据库中的链接表?这到底是可能的,还是pyodbc的局限性

我需要将MS Acess.accdb数据库中的数据输入Python。这非常有效,我可以使用
pyodbc
访问.accdb数据库中定义的表和查询。但是,数据库也有链接到外部SQL Server的表。访问此类链接表时,
pyodbc
抱怨无法连接到SQL server

test.accdb
包含两个表:
test
(本地表)和
cidb\u ain
(链接SQL表)

以下Python 3代码是我访问数据的尝试:

import pypyodbc as pyodbc

cnxn = pyodbc.connect(driver='Microsoft Access Driver (*.mdb, *.accdb)',
                      dbq='test.accdb',
                      readonly=True)

cursor = cnxn.cursor()

# access to the local table works
for row in cursor.execute("select * from Test"):
    print(row)

print('----')

# access to the linked table fails
for row in cursor.execute("select * from cidb_ain"):
    print(row)
输出:

(1, 'eins', 1)
(2, 'zwei', 2)
(3, 'drei', 3)
----
Traceback (most recent call last):
  File "test_02_accdb.py", line 14, in <module>
    for row in cursor.execute("select * from cidb_ain"):
  File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 1605, in execute
    self.execdirect(query_string)
  File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 1631, in execdirect
    check_success(self, ret)
  File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 986, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
  File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 964, in ctrl_err
    raise Error(state,err_text)
pypyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC-Treiber für Microsoft Access] ODBC-Verbindung zu 'SQL Server Native Client 11.0SQLHOST' fehlgeschlagen.")
考虑到(1)MS Access(以及Matlab)可以使用.accdb文件中包含的信息来查询链接表,以及(2)SQL Server是可访问的,我假设问题与
pyodbc
有关。(在错误消息中,驱动程序名和主机名被篡改成
“SQL Server Native Client 11.0SQLHOST”
的方式似乎也有点可疑。)


我以前没有Access方面的经验,因此如果我遗漏了对我来说似乎不必要的重要信息,请耐心告诉我……

首先,MS Access是一种独特的数据库应用程序类型,与其他RDM(例如SQLite、MySQL、PostgreSQL、Oracle、DB2)有所不同因为它附带了一个默认的后端关系引擎(顺便说一下,它不是一个访问限制组件,而是一种通用的Microsoft技术)和一个前端GUI界面和报告生成器。本质上,访问是对象的集合

链接表在某种程度上是MS Access前端的一项功能,用于替换另一个后端数据库(特别是SQL Server)的默认Jet/ACE数据库(即本地表)。此外,链接表本身就是ODBC/OLEDB连接!您甚至必须使用DSN、驱动程序或提供程序在MS Access文件中建立和创建链接表

因此,任何连接到MS Access数据库[
driver='Microsoft Access driver(*.mdb,*.accdb)
]的外部客户端(这里是您的Python脚本)实际上都在连接到后端Jet/ACE数据库。客户端/脚本从不与前端对象交互。在您的错误中,Python读取链接表的ODBC连接,并且由于SQL Server驱动程序/提供程序[
SQL Server Native Client 11.0SQLHOST
]从未在脚本中调用,因此脚本失败

总之,要解决您的问题,您必须将Python直接连接到SQL Server数据库(而不是使用MS Access作为介质)以连接到任何本地表,这里是
cidb_ain
。只需使用Access链接表的连接字符串:

#(USING DSN)
db = pypyodbc.connect('DSN=dsn name;')

cur = db.cursor()
cur.execute("SELECT * FROM dbo.cidb_ain")

for row in cur.fetchall()
  print(row)

cur.close()
db.close()


# (USING DRIVER)
constr = 'Trusted_Connection=yes;DRIVER={SQL Server};SERVER=servername;' \
         'DATABASE=database name;UID=username;PWD=password'
db = pypyodbc.connect(constr)

cur = db.cursor()
cur.execute("SELECT * FROM dbo.cidb_ain")

for row in cur.fetchall()
  print(row)

cur.close()
db.close()
更新:

事实证明,解决此问题的方法非常简单,只需在建立与Access数据库的连接之前设置
pyodbc.pooling=False

导入pyodbc
# ... 也可以将“导入pyodbc作为pyodbc”使用
pyodbc.pooling=False#这可以防止出现错误
cnxn=pyodbc.connect(r“驱动程序={Microsoft Access驱动程序(*.mdb,*.accdb)};DBQ=…”)

(先前的答复)

pyodbc和pyodbc似乎都无法从Access数据库中读取SQL Server链接表。然而,.NET中的
System.Data.Odbc
也可以这样做

为了验证,我在SQL Server中创建了一个名为[Foods]的表

id客人食品
--  -------  ----
11个馅饼
2 2汤
我在Access中创建了一个名为[dbo_Foods]的ODBC链接表,该表指向SQL Server上的该表

我还创建了一个名为[Guests]的本地访问表

id firstName
--  ---------
1戈德
2詹
。。。和一个名为[qryGuestPreferences]的已保存访问查询

选择Guests.firstName,dbo_Foods.food
从来宾内部加入来宾上的dbo_Foods.id=dbo_Foods.guestId;
在IronPython中运行以下脚本

导入clr
导入系统
clr.AddReference(“系统数据”)
从System.Data.Odbc导入OdbcConnection,OdbcCommand
连接字符串=(
r“驱动程序={Microsoft Access驱动程序(*.mdb,*.accdb)}
r“DBQ=C:\Users\Public\Database1.accdb
)
conn=ODBC连接(连接字符串)
康涅狄格州公开赛
query=”“”\
选择名字,食物
来自qryGuestPreferences
"""
cmd=OdbcCommand(查询,连接)
rdr=cmd.ExecuteReader()
而rdr.Read():
打印(“{0}喜欢{1}.”格式(rdr[“firstName”],rdr[“food”]))
康涅狄格州关闭
。。。返回

Gord喜欢馅饼。
詹喜欢喝汤。

事实上,我很惊讶,除了Access(此处:Matlab)之外的任何东西都可以通过Access数据库处理链接表。为什么不使用与SQL Server的直接连接?access数据库由其他人维护,并且经常会发生更改(外部链接、新查询等)。我希望避免在添加新的外部表时更改Python代码。谢谢您的回答。也许你能多帮点忙。。。在Access中,您可以创建存储在.accdb中的查询。可以像使用表一样使用Python中的这些查询。但是,如果这样的查询包含外部链接,则这不起作用(因为,如上所述,它不能跟随该连接)。知道如何解决这种情况吗?同样,Python将只使用已建立的数据库连接中的表。在连接源表的数据库之前,它无法看到任何其他数据。我不知道您所说的外部链接是什么意思-使用超链接数据类型的表字段?如果是这样,这将在Python中作为字符串导入。如果查询使用表单控件、报表控件或模块函数,Python将无法使用它,因为看不到前端对象,只有后端表。@kazemakase-可以执行您描述的操作。有关详细信息,请参阅。感谢您的回复
#(USING DSN)
db = pypyodbc.connect('DSN=dsn name;')

cur = db.cursor()
cur.execute("SELECT * FROM dbo.cidb_ain")

for row in cur.fetchall()
  print(row)

cur.close()
db.close()


# (USING DRIVER)
constr = 'Trusted_Connection=yes;DRIVER={SQL Server};SERVER=servername;' \
         'DATABASE=database name;UID=username;PWD=password'
db = pypyodbc.connect(constr)

cur = db.cursor()
cur.execute("SELECT * FROM dbo.cidb_ain")

for row in cur.fetchall()
  print(row)

cur.close()
db.close()