Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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
Python 是否可以使用pyodbc读取Paradox gui中打开的Paradox表?_Python_Odbc_Pyodbc_Paradox - Fatal编程技术网

Python 是否可以使用pyodbc读取Paradox gui中打开的Paradox表?

Python 是否可以使用pyodbc读取Paradox gui中打开的Paradox表?,python,odbc,pyodbc,paradox,Python,Odbc,Pyodbc,Paradox,我在一个管理非常糟糕的遗留Paradox数据库系统的环境中工作。(我不是管理员。)我一直在胡乱使用pyodbc与我们的表进行交互,基本功能似乎可以正常工作。以下是一些(工作)测试代码: import pyodbc LOCATION = "C:\test" cnxn = pyodbc.connect(r"Driver={{Microsoft Paradox Driver (*.db )\}};DriverID=538;Fil=Paradox 5.X;DefaultDir={0};Dbq={0}

我在一个管理非常糟糕的遗留Paradox数据库系统的环境中工作。(我不是管理员。)我一直在胡乱使用pyodbc与我们的表进行交互,基本功能似乎可以正常工作。以下是一些(工作)测试代码:

import pyodbc

LOCATION = "C:\test"

cnxn = pyodbc.connect(r"Driver={{Microsoft Paradox Driver (*.db )\}};DriverID=538;Fil=Paradox 5.X;DefaultDir={0};Dbq={0};CollatingSequence=ASCII;".format(LOCATION), autocommit=True, readonly=True)
cursor = cnxn.cursor()
cursor.execute("select last, first from test")
row = cursor.fetchone()
print row
问题是,我们的大多数重要表几乎在任何时候都会在某个人的Paradox GUI中打开。每当我尝试从这些表中选择一个时,就会出现此错误:

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Paradox Driver] Could not lock 
table 'test'; currently in use by user '(unknown)' on machine '(unknown)'. (-1304) 
(SQLExecDirectW)")
显然,这是因为pyodbc在调用
cursor.execute()
时试图锁定表。这种行为非常合理,因为
cursor.execute()
运行任意SQL代码,并且可能会更改表

然而,Paradox本身(通过其gui)似乎可以很好地处理多个用户。只有在人们使用表时尝试重新构造表时,才会出现类似的错误

有没有办法让pyodbc使用某种只读模式,这样在我执行
select
等操作时就不必锁定表?或者说,锁定是它工作原理中的一个基本部分,而我无法绕过它


使用其他模块的解决方案也很好。

确保您拥有最新版本的
pyobdc
(3.0.6),根据他们的说法

添加了Cursor.commit()和Cursor.rollback()。现在可以使用 代码中只有一个光标,而不是跟踪连接 和一个光标

添加了只读关键字以连接。如果设置为True,则SQLSetConnectAttr SQL属性访问模式设置为SQL模式只读。这可能提供 对于某些驱动程序,具有更好的锁定语义或速度

修复了读取长度超过4K的SQL Server XML数据类型时出现的错误

另外,我已经在paradox服务器上使用
readonly
对此进行了测试,它确实有效


希望这有帮助

好吧,我终于明白了

显然,odbc不喜欢没有主键的Paradox表。在任何情况下都不能更新没有主键的表,也不能读取没有主键的表,除非您是尝试访问该表的唯一用户

如果不提供密码,则从受密码保护的表中获得的错误消息基本相同

所以我在两个不同的表上测试我的脚本,其中一个表既有密码又有主键,另一个表既没有密码也没有主键。我假设错误消息有相同的根本原因,但实际上是两个不同的问题,有不同的解决方案


如果表在某人的GUI中打开,似乎仍然无法访问没有主键的表,但这是一个较小的问题。

我刚刚发布了一个Python库,用于通过pxlib C库读取Paradox数据库文件:。这在文件级别上运行,因此还应允许您独立于当前正在访问数据库的其他人来读取数据库。因为它不同步读/写访问,所以您必须小心

你是否可以创建一个具有较低凭据(只读权限)的新帐户?这就是我希望“readonly=True”参数可以做到的,但它对我不起作用。你有什么版本的pyobdc?哦,伙计,好问题。我以为我有最新版本,但实际上我正在使用与PortablePython捆绑的任何东西。我将不得不尝试手动获取最新版本,看看这是否有帮助。这并不是问题所在(请参阅我的另一篇文章),但我将为你提供奖励,让我思考正确的事情。