从 IronPython 访问 MS Access 的问题

Posted

技术标签:

【中文标题】从 IronPython 访问 MS Access 的问题【英文标题】:Issue accessing MS Access from IronPython 【发布时间】:2016-01-12 19:26:02 【问题描述】:

我正在尝试在 Spotfire 中使用 IronPython 在 MS Access 中运行脚本。到目前为止,我什至无法连接到 MS Access。

这是我的连接代码:

import clr
import System
clr.AddReference("System.Data")

from System.Data import DataSet
from System.Data.Odbc import OdbcConnection, OdbcDataAdapter

connectString = (
    "Driver=Microsoft Access Driver (*.mdb, *.accdb);"
    "Dbq=\\\olgwfap1\Data\Development Division\Res Surv Eng\Personal Folders\Pruet\Data Team\SPOTFIRE\TIDELANDS\Tidelands_Spotifre.accdb;"
    "Uid=Admin;PWd=;"
)

query = "Select * From FOP_Calc"


connection = OdbcConnection(connectString)
adaptor = OdbcDataAdapter(query, connection)
dataSet = DataSet()
connection.Open()
adaptor.Fill(dataSet)
connection.Close()

执行此操作,我收到以下错误:

System.Data.Odbc.OdbcException (0x80131937): 错误 [IM002] [Microsoft][ODBC Driver Manager] 数据源名称未找到且无 指定的默认驱动程序 System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode) 在 System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection 连接, OdbcConnectionString constr, OdbcEnvironmentHandle environmentHandle) 在 System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo, DbConnectionPool 池,DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions 用户选项)在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions)在 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection 外部连接,DbConnectionFactory 连接工厂)在 System.Data.Odbc.OdbcConnection.Open() at stub$296##296(Closure , CallSite , CodeContext , Object )在 Microsoft.Scripting.Actions.MatchCaller.Call2[T0,T1,Tret](Func4 target, CallSite site, Object[] args) at Microsoft.Scripting.Actions.CallSite1.UpdateAndExecute(Object[] args) 在 Microsoft.Scripting.Actions.UpdateDelegates.Update2[T,T0,T1,Tret](CallSite 站点,T0 arg0,T1 arg1)在 $287##287(关闭,范围, 语言上下文)在 Spotfire.Dxp.Application.ScriptSupport.IronPythonScriptEngine.ExecuteForDebugging(字符串 scriptCode,Dictionary2 scope, Stream outputStream) at Spotfire.Dxp.Application.Scripting.ScriptService.ExecuteForDebugging(String scriptCode, Dictionary2 范围,流输出流)在 Spotfire.Dxp.Application.Scripting.ScriptManager.c__DisplayClass14.b__f() 在 Spotfire.Dxp.Framework.Commands.CommandHistory.Transaction(执行器 executor, Boolean visible, Boolean sticky, Guid stickyGuid) at Spotfire.Dxp.Framework.Commands.CommandHistory.Transaction(字符串 displayName, Executor 执行者)在 Spotfire.Dxp.Framework.DocumentModel.DocumentNode.Transaction(字符串 displayName, Executor 执行者)在 Spotfire.Dxp.Application.Scripting.ScriptManager.ExecuteScriptForDebugging(字符串 scriptCode、Dictionary`2 scriptArguments、String& 输出)在 Spotfire.Dxp.Forms.Framework.Scripting.ScriptEditDialog.RunButton_Click(对象 发件人,EventArgs e)

文件名绝对正确,所以我假设它是给它带来麻烦的默认驱动程序。

如果有什么不同的话,我的 SpotFire(托管 IronPython)是 64 位安装的,我使用的是 32 位 MSOffice(不过我确实安装了 64 位和 32 位 MS Access ODBC 驱动程序)。

任何帮助表示赞赏, 谢谢。

【问题讨论】:

Provider= 用于 OleDb 连接。对于 ODBC,您需要类似 Driver=Microsoft Access Driver (*.mdb, *.accdb); 的东西。见Microsoft Access accdb ODBC Driver connection strings 好电话,我进行了更改,但仍然收到相同的错误:connectString = ( "Driver=Microsoft Access Driver (*.accdb);" "Dbq=\\\olgwfap1\Data \Development Division\Res Surv Eng\Personal Folders\Pruet\Data Team\SPOTFIRE\TIDELANDS\Tidelands_Spotifre.accdb;" ) 疯了!不幸的是,我的 Python 生锈了,而且我根本没有做过 IronPython,所以我现在不知道出了什么问题。我想知道的一点……您确定您同时安装了 32 位和 64 位 Access 驱动程序吗?我知道这不是 MS 支持的配置。 你是对的,我以为我做到了,但尝试实际配置 64 位版本会引发错误,提示“指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配”。所以可能是驱动问题? 是的,我确实尝试了 *.mdb、*.accdb 和 *.accdb 【参考方案1】:

如果您的 IronPython 脚本在 64 位环境中运行,那么您需要安装 64 位版本的 Access 数据库引擎。或者相反,如果您安装了 32 位版本的 Access 数据库引擎(因为您有 32 位 Office),那么您的 IronPython 脚本需要在 32 位环境中运行。

可能强制 32 位和 64 位版本的 Access 数据库引擎驻留在同一台计算机上,但不建议这样做。它可能会导致 Office 出现问题,并且不是受支持的配置。

【讨论】:

以上是关于从 IronPython 访问 MS Access 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Oracle 访问 MS Access 数据库?

从 JAVA 访问存储在 MS-Access 数据库中的日期/时间数据

从 Web 应用程序访问 MS Access DB

MS SQL + Python (IronPython) 超时

从 MS Access 访问 .mdb 文件中的后端表

如何使用 MYSQL 查询访问 Ms-Access 数据库