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

2022-08-31 11:07:47

我正在尝试使用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);
        }
    }
}

答案 1

这些都没有为我做这件事。我确实在MSDN上找到了答案。不过有一些暗示。错误中的体系结构是指 32 位与 64 位。我的解决方案是找出我的应用程序在(Access)下运行,哪个2010是32b。我通过在任务管理器的“进程”选项卡中查找这一点,其中所有32b进程的名称末尾都有* 32。如前所述,控制面板将从这里启动64位版本的ODBC

c:\windows\system32\odbcad32.exe

32位版本在这里:

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

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


答案 2

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

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

对于那些试图在64位Windows系统上将MS-Access连接到MySQL的人来说,我经历了纯粹的折磨,试图让它与MS-Access 2010和MS-Access 2013一起使用。终于让它工作了,以下是我一路上学到的教训:

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

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

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


  2. 我以前安装了Office 2013,我假设它是64位。但是在检查版本(文件,帐户,关于访问)时,我看到它是32位。Access 2010 和 2013 通常以 32 位版本的形式出售。

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

    “指定的 dsn 包含体系结构不匹配...”

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

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

  5. 您必须告诉“控制面板”中的 ODBC 管理器进行一次提升,并且必须使用在“开始”命令提示符处执行的以下命令显式调用 32 位 ODBC 管理器:

    c:\windows\sysWOW64\odbcad32.exe

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

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

    c:\windows\system32\odbcad32.exe

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


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


推荐