指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配。 JAVA

Posted

技术标签:

【中文标题】指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配。 JAVA【英文标题】:The specified DSN contains an architecture mismatch between the Driver and Application. JAVA 【发布时间】:2012-02-12 07:51:45 【问题描述】:

我正在尝试使用 Java 连接到由 MS Access 创建的数据库,但我似乎无法管理。我正在使用 ODBC,但遇到了这个异常:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] 指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配

我的 Java:

package javaapplication2;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 *
 * @author Owner
 */
public class JavaApplication2 

    /**
     * @param args the command line arguments
     * 
     */


    public static void main(String[] args) 
        // TODO code application logic here
        try 
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String sourceURL = new String("jdbc:odbc:myDatabase");
            System.out.println(sourceURL);
            Connection dbConnection = DriverManager.getConnection(sourceURL,"admin","");

            Statement myStmt  = dbConnection.createStatement();

            String query = "INSERT INTO People(ID, Name, Surname, Age, Contact, Location, Course) VALUES"
                    + " (1007, 'Elroy', 'Smith', '33', 21366688, 'Somewhere', 'somecourse')";

            myStmt.executeUpdate(query);

            ResultSet results = myStmt.executeQuery("SELECT * FROM People");

            while(results.next())
            
                System.out.print(results.getString(1));
                System.out.print(results.getString(2));
                System.out.print(results.getString(3));
                System.out.println(results.getString(4));

            

            results.close();

        
        catch(ClassNotFoundException cnfe)
        
            System.out.println(cnfe);
        
        catch(SQLException sqle)
        
            System.out.println(sqle);
        
    

【问题讨论】:

您使用的是 64 位 jvm 吗?如果是这样,您需要一个 64 位 odbc 驱动程序。 是的,我想我是。我在 C:\Windows\SysWOW64 中找到了 64 位版本的 odbc,但它与控制面板打开的不是同一个。 无法安装 64 位驱动,因为我的其他办公产品都是 32 位的:/ 【参考方案1】:

这些都不适合我。我确实在 MSDN 上找到了答案。虽然有暗示。错误中的架构是指 32 位和 64 位。我的解决方案是找出我的应用程序在哪个 2010 为 32b 的 (Access) 下运行。我通过查看任务管理器的进程选项卡发现了这一点,其中所有 32b 进程的名称末尾都有 * 32。如前所述,控制面板将从此处启动 64 位版本的 ODBC

c:\windows\system32\odbcad32.exe

32 位版本在这里:

c:\windows\sysWOW64\odbcad32.exe(最容易复制并粘贴到运行对话框中)

因此,我在每个指向同一事物的相应 ODBC 控制面板(AKA Administrator)中设置了名称以 32 和 64 结尾的 DSN。然后,我根据使用它的应用程序是 32b 还是 64b 来选择/选择正确的。

【讨论】:

我试过64位版本并以管理员身份运行,还是不行!! 必须有位和谐。如果应用程序是 32,则必须有 32 位配置。如果应用程序是 64,则必须有一个 64。我没有尝试创建具有相同名称的配置,因为我不希望它们不同步(忘记同时更改两者)。您没有给我足够的信息来尝试提供建议。我希望你明白了。 (为什么他们不能做这么简单的事情,创建一个配置 64 位和 32 位环境的 64 位应用程序???) 如下所述但并不明显,所涉及的驱动程序也必须匹配(最好同时安装 32 和 64),但如果不是,我认为您无法选择驱动程序适当的架构。 这也帮助我理解了为什么我的 32 位 Excel 无法使用 64 位 Cloudea Hive ODBC 驱动程序连接到我们的 Hadoop Hive 服务器。一旦我切换到 32 位连接器,它就工作得很好! 所以要明确一点:您不能在 64 位系统上通过普通 Windows GUI 设置 32 位 PostgreSQL ODBC 连接。相反,您需要关闭 ODBC 数据源管理器(如果它当前已打开),运行 c:\windows\sysWOW64\odbcad32.exe 并从那里配置连接。然后您可以稍后在 32 位程序中使用该连接来访问数据库。【参考方案2】:

当 Access 的位版本(32 与 64)不匹配时,尝试从 MS-Access 连接到 mysql 数据库时,您会遇到完全相同的错误

    您正在使用的 ODBC 驱动程序的位版本 您用于设置的 ODBC 管理器的位版本。

对于那些试图在 64 位 Windows 系统上将 MS-Access 连接到 MySQL 的人,我经历了彻底的折磨,试图让它同时与 MS-Access 2010 和 MS-Access 2013 一起工作。终于让它工作了,以下是我在此过程中学到的经验教训:

我购买了一台新的 Windows 7 64 位笔记本电脑,并且我有一个使用 MySQL 表依赖于 MS-Access 的应用程序。

    我使用 All In One 软件包安装了最新版本的 MySQL 5.6。这允许您同时安装数据库和 ODBC 驱动程序。这很好,但它安装的 ODBC 驱动程序似乎是 64 位驱动程序,因此它不适用于 32 位 MS-Access。它似乎也有点马车 - 不确定那个。当您在 ODBC 管理器中添加新的 DSN 时,此驱动程序将显示为“Microsoft ODBC For Oracle”。我无法让这个工作。我必须安装 32 位的,如下所述。

    安装后 MySQL 工作正常。我以通常的方式恢复了我的应用程序 MySQL 数据库。现在我想使用 MS-Access 连接到它。

    我之前安装了 Office 2013,我认为它是 64 位的。但在检查版本(文件、帐户、关于访问)后,我发现它是 32 位的。 Access 2010 和 2013 最常以 32 位版本出售。

    我的机器是 64 位机器。因此,默认情况下,当您为 MS-Access 设置 DSN,并以通常的方式通过控制面板、管理选项进入 ODBC 管理器时,您将获得 64 位 ODBC 管理器。你没有办法知道!你就是说不出来。这是一个巨大的陷阱!从那里设置 DSN 并成功连接到 MS Access 32 位是不可能的。你会得到可怕的错误:

    “指定的 dsn 包含架构不匹配...”

    您必须从 MySQL 下载并安装 32 位 ODBC 驱动程序。我用的是3.5.1版

    http://dev.mysql.com/downloads/connector/odbc/3.51.html

    您必须告诉控制面板中的 ODBC 管理器进行加息,并且必须使用在“开始”命令提示符处执行此命令来显式调用 32 位 ODBC 管理器:

    c:\windows\sysWOW64\odbcad32.exe

    我在我的桌面上创建了一个快捷方式。从这里,使用此管理器构建您的 DSN。重要的一点:将它们构建为系统 DSNS,而不是用户 DSNS!这让我绊倒了一段时间。

    顺便说一下,64 位版本的 ODBC 管理器也可以显式运行为:

    c:\windows\system32\odbcad32.exe

    从 MySql 安装 32 位 ODBC 驱动程序后,当您在 ODBC 管理器中单击添加时,您将看到列出的 2 个驱动程序。选择“MySQL ODBC 5.2 ANSI 驱动程序”。我没有尝试 UNICODE 驱动程序。


这样就行了。在 32 位 ODBC 管理器中定义 DSN 后,您可以在 Access 中以通常的方式连接到 MySQL - 外部数据、ODBC 数据库、链接到数据库、选择机器数据源以及您创建的 DSN 到 MySQL数据库将在那里。

【讨论】:

我认为您切换了两个 ODBC 管理器 32 bit: c:\windows\system32\odbcad32.exe 64 bit: c:\windows\sysWOW64\odbcad32.exe 的路径 @Jrgns 不,他们没有切换。 sysWOW64 实际上是 32 位目录。 Windows 喜欢让人困惑。您将知道您使用的是哪个版本,因为它将在 ODBC 数据源管理器的标题栏中显示(32 位)或(64 位)。【参考方案3】:

架构不匹配。您的 JDBC 驱动程序和 JDK 应该具有相同的体系结构。如果您使用的是 32 位驱动程序,而您的 JDK 是 64 位,则会出现该错误。

见this

修复:取决于您的架构。

如果您的 Java 是 64 位,您将需要 64 位驱动程序。

下载: http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en

【讨论】:

我已经下载并尝试了说明中指定的新连接字符串,但仍然无法正常工作。也许我做错了什么?【参考方案4】:

要解决这个问题,首先要确定你的java软件应该是32位版本,如果是64位版本的话,会显示不匹配的错误,所以尝试重新安装32位的java版本并在命令中执行java程序c:\windows\sysWOW64\odbcad32.exe(最容易复制并粘贴到运行对话框中)你的程序肯定可以工作

【讨论】:

【参考方案5】:

我看到了这个答案,它对我有用。 https://msdn.microsoft.com/en-us/library/ms712362%28v=vs.85%29.aspx

从驱动程序的安装程序安装 ODBC 驱动程序后,您可以为其定义一个或多个数据源。数据源名称 (DSN) 应提供数据的唯一描述;例如,工资单或应付帐款。为所有当前安装的驱动程序定义的用户和系统数据源在 ODBC 数据源管理器对话框的用户 DSN 或系统 DSN 选项卡中列出。给定目录中的文件数据源列在“文件 DSN”选项卡中;要显示的目录在“文件 DSN”选项卡的“查找范围”框中输入。 System_CAPS_noteNote

要管理连接到 64 位平台下的 32 位驱动程序的数据源,请使用 c:\windows\sysWOW64\odbcad32.exe。要管理连接到 64 位驱动程序的数据源,请使用 c:\windows\system32\odbcad32.exe。在 64 位 Windows 8 操作系统的管理工具中,有 32 位和 64 位 ODBC 数据源管理器对话框的图标。

如果您使用 64 位 odbcad32.exe 配置或删除连接到 32 位驱动程序的 DSN,例如 Driver do Microsoft Access (*.mdb),您将收到以下错误消息:

指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配

要解决此错误,请使用 32 位 odbcad32.exe 配置或删除 DSN。

数据源将特定的 ODBC 驱动程序与您希望通过该驱动程序访问的数据相关联。例如,您可以创建一个数据源以使用 ODBC dBASE 驱动程序来访问在您的硬盘或网络驱动器的特定目录中找到的一个或多个 dBASE 文件。使用 ODBC 数据源管理器,您可以添加、修改和删除数据源,如下表所述。

【讨论】:

嗨 Bineesh Kumar 能否简单解释一下【参考方案6】:

默认情况下,命令提示符连接到 System32。运行 64 位命令提示符,即 C:\WINDOWS\SYSWOW64\CMD.EXE。在那里,编译并运行你的 java 应用程序。

【讨论】:

【参考方案7】:

您面临的问题可能是因为:您使用的是 32 位的 Office 和 64 位的命令提示符。 要解决此问题,您需要执行 2 个步骤:

    使用以下命令打开 DSN 的 ODBC 管理器: C:\Windows\SysWOW64\odbcad32.exe 这将打开 32 位版本的 ODBC 数据管理器,您将看到所有数据库驱动程序。

    之后,您需要使用以下命令打开 32 位命令提示符: C:\Windows\SysWOW64\cmd.exe 这将打开 32 位版本的命令提示符。在这个新的 CMD 中,请重新编译您的 Java 程序并运行您的程序。

希望这会有所帮助。

【讨论】:

【参考方案8】:

有点晚了,但由于我遇到了同样的问题,在你的确切情况下,我想我会添加我的解决方案。

我有 Windows 7(64 位)和 Office 2010(32 位)。我尝试使用无 DSN 连接字符串:

jdbc:odbc:Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=I:/TeamForge/ORS/CTFORS.accdb

我尝试了 DSN 连接,同时使用了 System32 和 SysWOW64 版本的 ODBC Admin,但都不起作用。

最终奏效的是,将 Java 的位版本与 Office 的位版本相匹配。一旦我这样做了,我就可以使用 DSN 或 DSNless 连接模式,而无需大惊小怪。

【讨论】:

我从 Mob 的回答中暗示了这一点,但感谢您的确认。真是一团糟!【参考方案9】:

您是否首先在“控制面板”>“管理工具”>“ODBC”>“系统 DSN”中创建了 DSN。 将其命名为“myDatabase”,如果我要求查找数据库/访问文件,请使用浏览选项指定路径。 成功创建您的 DSN 后,您将可以轻松访问您的数据库。

【讨论】:

我使用在 C:\Windows\SysWOW64 中找到的 ODBC 创建了我的 DSN...控制面板中的驱动程序几乎没有驱动程序,而是为 sql server 保存驱动程序。 那么您必须安装驱动程序,因为没有这些驱动程序您将无法进行 ODBC 连接。 您有这些驱动程序的链接吗?我已经尝试安装了一些,但它们没有用。 microsoft.com/download/en/details.aspx?id=13255, microsoft.com/download/en/details.aspx?id=23734 我下载了这些并替换了连接字符串: Connection dbConnection = DriverManager.getConnection("Driver=Microsoft Access Driver(*.mdb, *.accdb);DBQ=C:\\Users\ \Owner\\Documents\\myDatabase.mdb","admin","");但它仍然给我带来麻烦。也许我需要更改代码中的其他内容?【参考方案10】:

如果您使用的是netbeans,请转到工具-> java 平台,将指向 c:/programfiles/java/jdk1_7 的 jdk_home 更改为 c:programFiles(x86)/java/jdk1_6_21

如果不可编辑 找到 netbeans.cnf 并按照上述 jdk_home 的说明进行更改。重新启动 netbeans 以及它是如何工作的 我有同样的问题,但我工作了。

【讨论】:

【参考方案11】:

我在使用 MS Access 2010 从运行 Windows 7 的 64 位笔记本电脑链接到 MySQL 时遇到了很多麻烦。我发现上一篇文章很有帮助,但仍然无法使用 odbc 3.5.1 进行连接。由于我之前使用 Connector/ODBC 5.1.13 链接了一台 32 位计算机,因此我下载了该版本并使用上述说明进行设置。成功。答案似乎是尝试不同版本的 Connector.odbc。

【讨论】:

【参考方案12】:

如果您使用 32 位驱动程序从 64 位平台连接,则运行可执行文件 C:\Windows\SysWOW64\odbcad32.exe 并创建 DSN。它会起作用的。

【讨论】:

【参考方案13】:

我在升级到带有一些旧 CLASP 应用程序的 Windows 7 服务器时遇到了这个问题。尝试在 64 位机器上运行 32 位应用程序。

尝试将应用程序池 32 位兼容性设置为 True 和/或创建 32 位和 64 位的 dsn。

从运行框中打开两个版本的 odbc 数据源窗口。 C:\Windows\SysWOW64\odbcad32.exe C:\Windows\system32\odbcad32.exe

【讨论】:

【参考方案14】:

转到此链接并下载适用于 64 位操作系统的 ODBC 驱动程序。

http://www.microsoft.com/en-us/download/details.aspx?id=13255

【讨论】:

【参考方案15】:

我确实遇到了这个问题。这是由于您使用的计算机架构和数据库架构造成的。

如果您使用的是 32 位操作系统,那么一切正常,因为您只能安装 32 位软件。使用 64 位操作系统时会出现问题。

为了解决这个问题很简单——我花了很长时间才发现这个问题。

    知道您的操作系统是 64 位,但您的 Microsoft Office 是 32 位。 因此,为了让您使用 NetBean IDE 访问您的数据库(假设您正在使用它),您需要安装 32 位 JDK。如果你安装了 64 位,你必须卸载它并安装 32 位。

您无法访问您的数据库,因为您的 64 位 JVM 与 32 位 JVM 不同。

将数据库添加到系统中 1.控制面板 2. 管理员工具 3.数据源(ODBC) 右键单击它,将目标更改为 \sysWOW64\odbcad32.exe 将开始更改为 r%\SysWOW64

那你应该可以跑了。如果您对此有任何问题,请告诉我。

谢谢!

【讨论】:

【参考方案16】:

我已经修复了错误。

按照以下步骤操作:

    安装32bt版本的JDK 安装 MS-Office 2007

    配置控制面板: 一种。控制面板 B.管理员工具 c.数据源 (ODBC)

    右键单击它,将目标更改为\sysWOW64\odbcad32.exe,将开始更改为r%\SysWOW64

执行它并祝你好运。适用于 Windows 7 和 8

如果问题仍然存在,请删除较新版本的 MS-Office 并仅安装 MS-Office 2007

【讨论】:

【参考方案17】:

要解决这个问题首先要确保你的java软件应该是32位版本,如果是64位版本,会显示不匹配的错误,所以尝试重新安装32位的java版本 并在命令中执行java程序 c:\windows\sysWOW64\odbcad32.exe(最容易复制并粘贴到运行对话框中) 够了,你的程序肯定可以工作

【讨论】:

【参考方案18】:

我认为这也会更有帮助。

对于架构未匹配,

我只是从 32 位文件 C:\Program Files (x86)\Java\jdk1.7.0_71 复制 jdk 文件并将其粘贴到 64 位文件 C:\Program Files\Java\jdk1.7.0 _10,然后重命名文件以匹配您替换的文件以避免IDE错误(netbeans)

那么你很好。

注意: 你应该备份你的 64 位文件,这样当你想创建 64 位应用程序时,你可以将它返回到它的位置

【讨论】:

以上是关于指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配。 JAVA的主要内容,如果未能解决你的问题,请参考以下文章

指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配。 JAVA

例外:[Microsoft][ODBC Driver Manager] 指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配“[重复]

指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

windows 2008 64位在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

QODBC连接字符串