您的位置:首页 > 数据库 > MySQL

VC使用mysql.h的接口头文件进行连接mysql数据库开发的完整解决方案

2012-02-09 21:44 766 查看
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文件中,只要按上述配置就能运行。












#include <iostream>
#include <iomanip>
#include <winsock2.h> 

#include "include\mysql.h" 

//#pragma comment(lib,"libmysql.lib") //这句加了貌似没有用。 

using namespace std; 

int fetchsqldb(char *mysql_host);

int main()
{
         charinput_buf[256];
         charhost[256];
   while(cout<<"input a num, q for quit:"<<endl,gets(input_buf))
         {
                   switch(input_buf[0])
                   {
                   case'q': return 0;
                   case'1': 
                            cout<<"inputhost ip:"<<endl;
                            while(gets(host))
                            {
                                     fetchsqldb(host);
                                     break;
                            }
                            break;
                   case'2':
                            fetchsqldb("192.168.111.100");
                            break;
                   default:
                            cout<<"inputinvalid!"<<endl;
                   }
         }
         return0;
}

//查询函数,入参mysql_host 为数据库服务器的IP地址。
int fetchsqldb(char *mysql_host)
{
         intt = 0, i = 0;
         charquery_buf[2048];
         MYSQL_RES*res;
         MYSQL_ROWrow;
         MYSQL mysql;

   cout<<"fechsqldb starting..."<<endl;
         mysql_init(&mysql);
//root:MYSQL数据库服务器的用户名;aaapwd:为对应用户名的密码;mydbtest:是连接之后选择的的数据库,3306:是服务器端口号;
//后面参数的意义的可以查看mysql的官方手册,地址是:
//http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c
if(mysql_real_connect(&mysql,mysql_host, "root", "aaapwd", "mydbtest", 3306, NULL, 0))
         {
                   cout<<"connectsql server ok!"<<endl;
         }
         else
         {
                   mysql_errno(&mysql);
                   constchar *s = mysql_error(&mysql);
                   cout<<s<<endl;
                   return1;
         }
         strcpy(query_buf,"select * from mytable1");
         t= mysql_query(&mysql, query_buf);
         if(t)
         {
                   cout<<"Errorexecute query:"<<mysql_error(&mysql)<<endl;
                   return1;
         }
         else
         {
                   cout<<"Querysuccess!"<<endl;
         }
//获取数据集,并根据获取的行数和列数打印查询到的表的内容
res= mysql_use_result(&mysql);
   for(i = 0; ;i++) //mysql_field_count(&mysql),i<mysql_num_rows(res) 这个结果不对
         {
                   row= mysql_fetch_row(res);
                   if(row<= 0)
                       break;
                   for(t= 0; t < mysql_num_fields(res); t++)
                            cout<<setw(16)<<row[t]<<"";
                   cout<<""<<endl;
         }
   cout<<"fetch end!"<<endl;

         mysql_close(&mysql);
         return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: