win7 64bit 下mysql5.5.36(x86,64bit) ODBC qt5.2连接

来源:互联网 发布:coap协议java 开发 编辑:程序博客网 时间:2024/06/07 05:26
安装mysql 时自带了ODBC 驱动,在运行框里输入odbc ,添加数据源,可选的mysql驱动有
MySQL ODBC 5.2 Unicode Driver 和 MySQL ODBC 5.2 ANSI Driver,我选择了Unicode,配置数据源(mydsn_mysql),在配置界面Test成功,但是当用下面的程序访问时
    db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("mydsn_mysql");
    if(db.open())
    {
        model = new QSqlQueryModel(this);
        model->setQuery("SELECT * FROM city");
        ui->tableView->setModel(model);
    }
    else
    {
        QMessageBox::warning(this, "warning", db.lastError().text());
    }
报错“在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配",在网上查了之后,说64bit系统中默认用的是
C:\windows\system32\odbcad32.exe,应该用C:\Windows\SysWOW64\odbcad32.exe,
 我打开C:\Windows\SysWOW64\odbcad32.exe,发现并没有在驱动程序里没有MySQL 的驱动
(此处图片仅为示意图,我再解决问题前没有截图
后来看到有的是通过安装32bit 驱动解决的,我下载了mysql-connector-odbc-5.2.6-win32,选择modify 安装
安装完,在C:\windows\system32\odbcad32.exe的驱动里发现不仅是之前的mysql驱动没了,而是根本就没有mysql的驱动,
打开C:\Windows\SysWOW64\odbcad32.exe,发现驱动中有了mysql驱动
配置好数据源mydsn32_mysql
使用代码
    db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("mydsn32_mysql");
    if(db.open())
    {
        model = new QSqlQueryModel(this);
        model->setQuery("SELECT * FROM city");
        ui->tableView->setModel(model);
    }
    else
    {
        QMessageBox::warning(this, "warning", db.lastError().text());
    }
连接成功,读出表中的数据
对于System32 和SysWOW64
WoW64 (Windows 32-bits on Windows 64-bit)是一个Windows操作系统的子系统,能够运行32-bit应用程序,所有的64-bit的Windows系统都有,放的是32-bit应用程序文件;System32在64-bit的Windows系统中放的是64-bit应用程序文件。是不是觉得很奇怪呢?这是为了考虑兼容性。
(一下部分引用自http://blogs.msdn.com/b/tianlin/archive/2011/10/26/syswow64.aspx)

如果你写了一个很牛的32位的应用程序,现在,你想把它变成64位的应用程序,以更充分地利用64位处理器所带来的新的处理能力。你肯定觉得,这不就是让64位编译器编译一遍就完了的事儿么?可能你发现,这并不是骨感的现实。你突然发现,你的程序里,为了某些你已经想不起来的原因,把System32这个文件夹,写死在了你的程序里。而这个System32中的32,让你很不安。你尝试着运行了你的程序,却发现一切正常。为什么呢?因为这是Windows系统的另一个兼容性方面的努力:让一个已有的32位应用程序,不加修改或者尽可能少地加以修改,便可以被编译成64位应用程序并在64位Windows上运行。其实,把System32这样的路径,写死在程序里,并不是一个个案。所以,为了保证这些应用程序可以顺利地过渡到64位,Windows最后还是决定让64位的系统文件放在System32的文件夹下。而让32位的系统文件,搬到了SysWow64中去。

你肯定会想,那让32位搬到SysWow64中去以后,那些写死在32位应用程序中的System32怎么办?答:Windows会给他们转向到SysWow64中去。那让64位中的System32转向到System64不也是一样么?真的一样么?不一样么?真的一样么?不一样么?真的不一样。

作为64位Windows操作系统,当然是希望能充分发挥64位处理器的潜力,让应用程序更有效率地运行。如果在运行64位应用程序时,总要检查是否需要转向,势必影响程序运行效率。所以,不能给64位应用程序做没有必要的转向,如果说必须要转,那就只能转32位应用程序了。是的,没有办法,在64位操作系统中,32位应用程序要做一些小的牺牲。

此外,为了保证32位应用程序不与64位应用程序相冲突,除了System32文件夹外,注册表也需要为32位和64位提供两套,也需要让32位的应用程序在必要时重定向。

0 0
原创粉丝点击