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


85

我正在尝试连接到使用Java的MS Access制造的数据库,但似乎无法管理。我正在使用ODBC,但出现此异常:

java.sql.SQLException:[Microsoft] [ODBC驱动程序管理器]指定的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);
        }
    }
}

2
您是否正在使用64位jvm?如果是这样,则需要一个64位odbc驱动程序。
dogbane 2012年

1
是的,我想我是。我在C:\ Windows \ SysWOW64中找到了odbc的64位版本,但与控制面板打开的版本不同。
user1028408 2012年

无法安装64bit驱动程序,因为我的其他办公产品为32bit:/
DavidVdd

Answers:


128

这些都不对我有用。我确实在MSDN上找到了答案。虽然有暗示。错误中的体系结构是指32位和64位。我的解决方案是找出我的应用程序在(Access)下运行的是32b。我通过在任务管理器的“进程”选项卡中查找所有32b进程的名称末尾带有* 32的字符来发现此问题。如前所述,控制面板将从此处启动64位版本的ODBC

c:\windows\system32\odbcad32.exe

这里是32位版本:

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

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


我曾经尝试过64位版本并以管理员身份运行它,但它也不起作用!
Fatima Zohra

2
必须有位和谐。如果应用程序为32,则必须为其配置32位。如果应用程序是64,则必须有一个64。我没有尝试创建具有相同名称的配置,因为我不希望它们不同步(忘记同时更改两者)。您没有给我足够的信息来尝试提供建议。我希望你知道了。(为什么他们不能做这么简单的事情,并创建一个可同时配置64位和32位环境的64位应用程序??)
Pecos Bill

而且,如下所述但还不很明显,所涉及的驱动程序也必须匹配(最好同时安装32和64),尽管我认为如果架构不合适,您不可以选择该驱动程序。
Pecos Bill

这也帮助我理解了为什么我的32位Excel无法使用64位Cloudea Hive ODBC驱动程序连接到我们的Hadoop Hive Server的原因。一旦我切换到32位连接器,它就很棒了!
Mark Vickery 2014年

2
需要明确的是:您不能通过64位系统上的常规Windows GUI建立32位PostgreSQL ODBC连接。相反,您需要关闭ODBC数据源管理器(如果当前已打开),c:\windows\sysWOW64\odbcad32.exe然后从那里运行并配置连接。然后,您以后可以在32位程序中使用该连接来访问数据库。
Ajedi32

26

当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。这使您可以同时安装数据库和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。要点:将它们构建为系统DSNS,而不是用户DSNS!这使我绊了一会儿。

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

    c:\ windows \ system32 \ odbcad32.exe

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


做到了。在32位ODBC管理器中定义了DSN之后,您可以通过访问-外部数据,ODBC数据库,链接到数据库,选择计算机数据源以及您在MySQL中创建的DSN的常规方式连接到MySQL。数据库将在那里。


2
我认为您已切换了两个ODBC管理器的路径32 bit: c:\windows\system32\odbcad32.exe 64 bit: c:\windows\sysWOW64\odbcad32.exe
Jrgns 2014年

3
@Jrgns不,它们没有切换。sysWOW64实际上是32位目录。Windows令人困惑。您将知道使用的是哪个版本,因为它将在ODBC数据源管理器的标题栏中显示(32位)或(64位)。
蒂姆·叶

8

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

看到这个

修复:取决于您的体系结构。

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

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


我已经下载了它,并按照说明中的说明尝试了新的连接字符串,但仍然无法正常工作。也许我做错了什么?
user1028408 2012年

2

我看到了这个答案,它为我工作。 https://msdn.microsoft.com/zh-CN/library/ms712362%28v=vs.85%29.aspx

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

要管理在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,能否请您解释breafly
Raj Kumar,

2

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


2

要解决此问题,请首先确保您的Java软件应该是32位版本(如果它是64位版本),则显然会显示不匹配错误,因此请尝试重新安装32位的Java版本,然后在c:\命令中执行Java程序Windows \ sysWOW64 \ odbcad32.exe(最容易复制并粘贴到运行对话框中)足以确保程序正常运行


1

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

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

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

希望这会有所帮助。


1

有点晚了,但是由于遇到了同样的问题,在您的实际情况下,我认为我会添加解决方案。

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

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

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

最终有效的方法是将Java的位版本与Office的位版本进行匹配。一旦这样做,我就可以使用DSN或DSN较少的连接模式,而不必大惊小怪。


我从Mob的答案中暗示了这一点,但感谢您的确认。真是一团糟!
Kevin Bowersox 2014年

0

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


我用在C:\ Windows \ SysWOW64中找到的ODBC创建了我的DSN ...控制面板中的一个几乎没有驱动程序,用于保存sql server的驱动程序。
user1028408 2012年

那么您必须安装驱动程序,因为没有这些驱动程序就无法建立ODBC连接。
Ankur Jain 2012年

您是否有这些驱动程序的链接?我试过安装一些,但是没有用。
user1028408 '01


我下载了这些文件并替换了连接字符串:Connection dbConnection = DriverManager.getConnection(“ Driver = {Microsoft Access Driver(*。mdb,* .accdb)}; DBQ = C:\\ Users \\ Owner \\ Documents \\ myDatabase .mdb“,” admin“,”“)); 但它仍然给我带来麻烦。也许我需要更改代码中的其他内容?
user1028408 2012年

0

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

如果不是可编辑的,请找到netbeans.cnf并按照jdk_home的说明进行更改。重新启动neatbeans及其工作方式我遇到了同样的问题,但是我工作了。


0

使用MS Access 2010从运行Windows 7的64位笔记本电脑链接到MySQL时,我遇到了很多麻烦。因为我以前使用Connector / ODBC 5.1.13链接了32位计算机,所以我下载了该版本并按照上面的说明进行了设置。成功。答案似乎是尝试使用不同版本的Connector.odbc。


0

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


0

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

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

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


0

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

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

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

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

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

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

然后,您应该可以运行了。如果您对此有任何疑问,请通知我。

谢谢!


0

我已修复错误。

按照步骤:

  1. 安装32bt版本的JDK
  2. 安装MS-Office 2007
  3. 配置控制面板:控制面板b。管理员工具c。资料来源(ODBC)

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

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

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


0

要解决此问题,请先确保您的Java软件应该是32位版本(如果它是64位版本),则显然会显示不匹配错误,因此请尝试重新安装32位的Java版本,然后在 c:\windows\sysWOW64\odbcad32.exe(最容易执行复制并粘贴到运行对话框中),这足以使您的程序正常工作


0

我认为这也将更有帮助。

对于架构错过比赛,

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

那么你的好去。

注意:您应该对64位文件进行存储,以便在要创建64位应用程序时可以将其返回到其位置


Hacky McHack Hack :(
Gareth

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.