现在的位置: 首页 > 综合 > 正文

VC连接mysql数据库开发的与64位win7不兼容解决方案

2014年04月05日 ⁄ 综合 ⁄ 共 4435字 ⁄ 字号 评论关闭

VC++6.0连接MySQL的配置过程

VC使用mysql.h的接口头文件进行连接mysql数据库开发

 

摘要:前几天搞一个VC程序,目的是连接MYSQL服务器,做查询数据,等各种操作。我没有选择ADO,也没有使用ODBC这样的方式,貌似ODBC还需要配置服务端的ODBC设置,所以觉得很麻烦,不适合我追求完美的个性。于是找了MSYQL提供的官方API,不得不承认,他们的东西真的做的不错。但是,由于第一次使用,网上的参考资料又不完整,还不能解决我遇到的所有问题。不过,最终在我的各种奇思异想之下,还是解决了,现把完整的步骤和遇到的问题的解决办法给写出来,以求能帮助到遇到问题的朋友。共享精神嘛!大家好,才是真的好!呵呵

 

    用C连接MySQL,在Win7下用VC++6.0连接MySQL数据库,可能发生的错误:

……\libmysql.lib : fatalerror LNK1113: invalid machine type。

发生这个错误的原因是,我在win7上安装的是64bit的mysql服务器(因为之前想在64bit的win7上安装64bit的程序会看起来好些;实际上64bit的win7系统上对32bit的应用程序兼容还可以的),而我编译32位的VC程序,连接的是64位的libmysql.lib库,所以会产生 “无效的机器类型(invalid machine type)”的错误提示。

对于这个“error LNK1113”错误的解决方案是:

   下载32位的mysql的zip包,大概100多M的那个。解压出来,把lib目录按照,第5步定位lib。这样的话,我们的32位程序编译的时候,链接的就是32位的库,就不会出现上面的链接错误了。也不必换到xp系统上去操作了。

环境说明:

操作系统:windows 7

开发工具:VC++6.0

开发的exe:32位程序

数据库服务器:64位的mysql-5.5.20-winx64.msi(33M),运行在win7上,即localhost,

引用的数据库lib:32位的mysql-5.5.20-win32.zip(146M)的lib文件夹。

 

步骤如下:

1.  到官网www.mysql.com下载MySQL安装包:

mysql-essential-5.1.52-win32.msi

当然你也可以下载安装mysql*.zip,这个要配置my.ini配置文件,会比较麻烦,生手不一定会在短时间内配置成功。

2.  安装mysql,在安装过程中如(如果是.msi安装),一定要选上C Include Files / Lib Files,这样在安装后才能在mysql的安装文件夹中找到include和lib文件夹,这些文件夹将在下面的操作用会用到。

3.  把[MySQL安装目录]\MySQL Server 5.5\bin下的libmySQL.dll复制并拷贝到C:\WINDOWS\system32下。(这一步我没有做,一样可以编译通过,我是在WIN7下验证的,不知在XP或是win-NT中是否需要这一步)。

4.  在VC++6.0建立一个工程,打开:工具(tools)->选项(options),在弹出的“选项”对话框中,点击“目录(directories)”标签,可以看到一个:“显示目录为”的下拉框,选择“include files”选项,在其中加入:[MySQL安装目录]\MySQLServer 5.5\include\ 这个目录,如图1。这样在编译时就可以使用 #include
<mysql.h>
 找到mysql.h文件。

图1

当然,你也可以不进行第4步,直接把 “[MySQL安装目录]\MySQLServer 5.0\include\” 文件夹拷贝到当前工程目录。然后在程序中使用 #include"include\mysql.h" 包含头文件。

 

5.  设置步骤4后,只是保证编译通过,但是连接出错。连接时需要用到lib文件,lib文件一般是函数定义编译后的库文件,必须使程序链接时找到这个文件。打开:工具->选项菜单,找到“目录”标签,可以看到有一个:“显示目录为”的下拉框,选择Library files选项,在其中加入: 【32位的mysql zip解压文件夹】\MySQLServer 5.5\lib\,如图2。

图2

然后在:工程->设置,找到link选项卡,在对象/库模块下面的输入框中的库列表的最后面加入:libmysql.lib。如图3。

图3

6.  编译链接,运行即可。

运行之前还有关键的一点:必须把32位 mysql的lib目录下的libmysql.dll 这个动态链接库,复制到当前工程的debug目录。也就是说,这个动态库必须和运行的exe程序放在一起。假如你要这个exe程序放到别处运行,那么你也必须一起复制libmysql.dll 。

7.  下面是一个可以运行的小例子,只要建立win32 consoleAplication工程,建一个C文件,把代码复制到C文件中,只要按上述配置就能运行。

 

 

 

 

 

 

  1.    
  2.   
  3. #include <iostream>  
  4. #include <iomanip>  
  5. #include <winsock2.h>   
  6.   
  7. #include "include\mysql.h"   
  8.   
  9. //#pragma comment(lib,"libmysql.lib") //这句加了貌似没有用。   
  10.   
  11. using namespace std;   
  12.   
  13. int fetchsqldb(char *mysql_host);  
  14.   
  15.   
  16. int main()  
  17. {  
  18.          charinput_buf[256];  
  19.          charhost[256];  
  20.    while(cout<<"input a num, q for quit:"<<endl,gets(input_buf))  
  21.          {  
  22.                    switch(input_buf[0])  
  23.                    {  
  24.                    case'q'return 0;  
  25.                    case'1':   
  26.                             cout<<"inputhost ip:"<<endl;  
  27.                             while(gets(host))  
  28.                             {  
  29.                                      fetchsqldb(host);  
  30.                                      break;  
  31.                             }  
  32.                             break;  
  33.                    case'2':  
  34.                             fetchsqldb("192.168.111.100");  
  35.                             break;  
  36.                    default:  
  37.                             cout<<"inputinvalid!"<<endl;  
  38.                    }  
  39.          }  
  40.          return0;  
  41. }  
  42.   
  43. //查询函数,入参mysql_host 为数据库服务器的IP地址。  
  1. int fetchsqldb(char *mysql_host)  
  2. {  
  3.          intt = 0, i = 0;  
  4.          charquery_buf[2048];  
  5.          MYSQL_RES*res;  
  6.          MYSQL_ROWrow;  
  7.          MYSQL mysql;  
  8.   
  9.    cout<<"fechsqldb starting..."<<endl;  
  10.          mysql_init(&mysql);  
  1. //root:MYSQL数据库服务器的用户名;aaapwd:为对应用户名的密码;mydbtest:是连接之后选择的的数据库,3306:是服务器端口号;  
  1. //后面参数的意义的可以查看mysql的官方手册,地址是:  
  1. //<a href="http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c">http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c</a>  
  1. if(mysql_real_connect(&mysql,mysql_host, "root""aaapwd""mydbtest", 3306, NULL, 0))  
  2. {  
  3.           cout<<"connectsql server ok!"<<endl;  
  4. }  
  5. else  
  6. {  
  7.           mysql_errno(&mysql);  
  8.           constchar *s = mysql_error(&mysql);  
  9.           cout<<s<<endl;  
  10.           return1;  
  11. }  
  12. strcpy(query_buf,"select * from mytable1");  
  13. t= mysql_query(&mysql, query_buf);  
  14. if(t)  
  15. {  
  16.           cout<<"Errorexecute query:"<<mysql_error(&mysql)<<endl;  
  17.           return1;  
  18. }  
  19. else  
  20. {  
  21.           cout<<"Querysuccess!"<<endl;  
  22. }  
  1. //获取数据集,并根据获取的行数和列数打印查询到的表的内容  
  1.       res= mysql_use_result(&mysql);  
  2. for(i = 0; ;i++) //mysql_field_count(&mysql),i<mysql_num_rows(res) 这个结果不对  

抱歉!评论已关闭.