1.VS项目配置
使用的是API方式,使用Mysql的数据库资源,所以需要包含头文件、连接Lib和获取相应的dll文件。
首先,在VS2010下新建项目,设置项目的属性:
a.属性->C++目录->包含目录->设置..\MySQL\MySQL Server 5.5\include;
b.属性->C++目录->库目录->设置..\MySQL\MySQL Server 5.5\lib;lib文件夹下还有个debug目录,debug目录下也有个mysqlclient.lib(lib下也有,但比较下),建议添加设置..\MySQL\MySQL Server 5.5\lib\debug;
c.属性->链接器->输入->附加依赖项->添加libmysql.lib;
然后,在项目的头文件中添加
#include "winsock.h"
#include "mysql.h"
最后,运行项目,如果报错“缺少libmysql.dll”,把MySQL\MySQL Server 5.5\lib下的libmysql.dll复制到Debug文件夹下(Debug模式)。
2.程序实现
程序实现比较简单,代码如下:
#include <iostream>
#include "winsock.h"
#include "mysql.h"
//#pragma comment(lib,"libmySQL.lib")
using namespace std;
bool main()
{
//connection params
char *host = "localhost";
char *user = "root";
char *pass = "lffw";
char *db = "datatest"; //已经建立的数据库
unsigned int port = 3306; //server port
MYSQL *sock;
MYSQL_RES *res;
MYSQL_FIELD * fd;
MYSQL_ROW row;
char szSqlText[500]="";
int i = 0;
int tcreate = 1;
sock=mysql_init(0);
if(sock &&mysql_real_connect(sock,host,user,pass,db,port,NULL,0))
{
cout<<"connect mysql succeed!"<<endl;
//mysql_set_character_set(sock,"utf8");
mysql_query(sock, "set names gb2312");
//mysql_query(sock, "SET NAMESGBK"); //设置编码格式,否则在cmd下无法显示中文,具体还未弄清
if(tcreate)
{
sprintf(szSqlText,
"create table datatable(id int(3) not null primary key,address varchar(20),year date) CHARACTER SET utf8");//构造SQL语句,新建一张表
cout<<"Create table!"<<endl;
tcreate = 1;
if(mysql_query(sock,szSqlText))
{
cout<<"can't create table:"<<mysql_error(sock)<<endl;
mysql_close(sock);
return FALSE;
}
}
sprintf(szSqlText,
"insert into datatable values(1,'深圳一中','2010-10-08')");
cout<<"Insert data to table!"<<endl;
if(mysql_query( sock, szSqlText))
{
cout<<"Can't insert data to table"<<mysql_error(sock)<<endl;
mysql_close( sock);
return FALSE ;
}
sprintf(szSqlText, "select* from datatable");
cout<<"select* from datatable!"<<endl;
if(mysql_query( sock, szSqlText))
{
mysql_close( sock);
return FALSE ;
}
else
{
cout<<"mysql_store_result!"<<endl;
res=mysql_store_result(sock) ;//取得查询结果,保存查询到的数据到res
i = (int)mysql_num_rows(res ) ;//取得有效记录数
cout<<"Query:"<<szSqlText<<"\n"<<i<<" records found:"<<endl;
for( i = 0 ; fd =mysql_fetch_field( res ); i++ )//获取列名
cout<<fd->name<<"\t";
cout<<endl;
while(row =mysql_fetch_row( res))//依次读取各条记录
cout<<row[0]<<"\t"<<row[1]<<"\t"<<row[2]<<endl;
mysql_free_result(res); //释放结果资源
}
}
else
{
cout<<"cannot connect to the sock sever "<<mysql_error(sock)<<endl;
mysql_close(sock);
return FALSE;
}
mysql_close(sock);
system("pause");
return TRUE;
}
3.C++关键代码
a.#pragma comment(lib,"XXX.lib")表示链接Ws2_32.lib这个库。和在工程设置里写上链入XXX.lib的效果一样,不过这种方法写的 程序别人在使用你的代码的时候就不用再设置工程settings了。在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。常用的:
#pragma region 名称
...
#pragma endregion
//常用于大程序的区域分割
#pragma message("消息文本")
Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。
#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式
#pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。常用的lib关键字,可以帮我们连入一个库文件。
b.int mysql_query(MYSQL *mysql, const char *stmt_str)
这个函数,在mysql文档上看到“Zero if the statement was successful. Non-zero if an error occurred. ”