为访问 mdb 文件创建 OdbcConnection 的 ConnectionString 是啥

Posted

技术标签:

【中文标题】为访问 mdb 文件创建 OdbcConnection 的 ConnectionString 是啥【英文标题】:What is the ConnectionString to create a OdbcConnection for an access mdb file为访问 mdb 文件创建 OdbcConnection 的 ConnectionString 是什么 【发布时间】:2013-01-28 17:02:50 【问题描述】:

我想使用 Odbc 从 c# 连接到 Access MDB 文件。

当我尝试执行时

OdbcConnection con = new OdbcConnection(
    "Driver=Microsoft Access Driver (*.mdb);DBQ=c:\\temp\\test.mdb;");

我得到以下异常:

exc System.Data.Odbc.OdbcException (0x80131937): ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
   at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection connection, OdbcConnectionString constr, OdbcEnvironmentHandle environmentHandle)
   at System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.Odbc.OdbcConnection.Open()
   :

这里有什么问题?它抱怨“找不到数据源名称并且没有指定默认驱动程序”,但我指定了一个驱动程序?

我在http://www.connectionstrings.com/access#net-framework-data-provider-for-odbc 的帮助下得到了连接字符串

【问题讨论】:

你能把c:\\temp\\test.mdb的路径替换成c:\temp\test.mdb吗?然后再试一次。 @Hiten004:在 C# 中,要么使用逐字字符串并使用简单的反斜杠,要么使用普通字符串并使用双反斜杠:@"c:\temp\test.mdb""c:\\temp\\test.mdb" 它可能是它无法识别的提供程序字符串 - 这可能有点不确定。在这里检查:connectionstrings.com/access-2007 看起来您必须使用Driver=,不确定这是否与Provider= 相同,但该站点似乎对 ODBC 进行了区分-也许您只是缺少驱动程序名称中的扩展名 Jet ODBC 提供程序只能由 32 位应用程序访问。如果您的 c# 项目的编译目标是 64 位(任何 cpu),请将其更改为 x86。 HansUp 是正确的,我刚刚发现自己并将其作为答案发布。 @Charleh:您将 Driver= 用于 Odbc,将 Provider= 用于 OldDB。它们的连接字符串不同,您不能将一个用于另一个。 【参考方案1】:

哦,我刚刚找到了问题的根源。我想其他人也可能会遇到它:

我正在编写一个 .net 应用程序,当操作系统是 32 位 Windows 时,它在 32 位 .net vm 中运行,而当操作系统是 64 位 Windows 时,它在 64 位 vm 中运行。在 syswow 和 system32 中使用 2 odbcad32.exe(是的,两者都被命名为 odbcad32.exe,即使 system32 中的那个是 64 位的,是的,这也是正确的)我发现我只为 odbc32 位安装了 Access MdB 驱动程序。所以当我的应用程序在 64 位 Windows 上运行时,.net 想要使用 64 位版本的 odbc 并且找不到驱动程序。

好的,所以现在我需要一个 64 位访问驱动程序,根据这个 enter link description here 不存在。好吧,帖子很旧,所以现在可能还有一个?

当我将项目设置中的平台强制为 x86 时,它可以工作。当然,这也迫使我的应用程序在 32 位 .net vm 中运行。

【讨论】:

没有 64 位 Jet 驱动程序。如果您想要 64 位,请使用 ACE 驱动程序而不是 Jet。 microsoft.com/en-us/download/details.aspx?id=13255 注意 ACE 驱动程序有 32 位和 64 位版本。 ACE 还向后兼容 --- 除了新的 ACCDB 格式外,它还支持旧的 Jet MDB 格式。 我需要使用DSN连接ODBC ..怎么写? 我遇到了同样的错误。但是32-64位的东西不是它的来源。对于 DB 驱动程序管理,使用准确的连接字符串 Driver=Microsoft Access Driver (*.mdb);DBQ=...;Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=...; 很重要【参考方案2】:

使用如下示例的网络配置设置

<add      name="ODBCDataConnectionString"   connectionString="Driver=ODBCDriver;server=ODBCServer;"   providerName="System.Data.Odbc"   />

【讨论】:

【参考方案3】:

您可以创建一个 udl 文件,创建您的连接,然后在记事本中打开该文件以查看连接字符串。这在过去帮助了我 -

http://msdn.microsoft.com/en-us/library/e38h511e%28v=vs.71%29.aspx

使用它,您可以像在 odbc 工具中一样创建常规连接并验证它是否有效。

希望对您有所帮助。

【讨论】:

这不是 OleDB 的吗?我想要 Odbc。 我认为这也适用于 odbc,只要机器上安装了提供程序。

以上是关于为访问 mdb 文件创建 OdbcConnection 的 ConnectionString 是啥的主要内容,如果未能解决你的问题,请参考以下文章

将 Mdb 转换为 Sql Server

如何在 python 中读取 .mdb 访问数据库文件?

访问 mdb 文件,数据库不断尝试连接到远程服务器

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

将悖论转换为 MDB

在 Windows 服务中打开 mdb 文件