1.在Linux下编译连接mysql数据库的程序时,需要使用安装Mysql数据库时自带的mysql_config脚本。它会为你编译MySQL客户端,并连接到MySQL服务器提供有用的信息需要使用下面两个选项:
--libs 选项 - 连接MySQL客户端函数库所需要的库和选项.
[Jiakun@Kunge C++Practice]$ mysql_config --libs
-rdynamic -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lssl -lcrypt
--cflags 选项 - 使用必要的include文件的选项等等.
[plain] view plain copy
print?
[Jiakun@Kunge C++Practice]$ mysql_config --cflags
需要将上面两个选项加入到对源文件的编译命令中. 所以要编译程序,需使用类似下面的命令:
[Jiakun@Kunge C++Practice]$ g++ ./MysqlTest.cpp -o MysqlTest $(mysql_config --cflags) $(mysql_config --libs)
2.常用的Mysql函数API:
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。如果连接成功,一个 MYSQL*连接句柄。如果连接失败则为NULL。对一个成功的连接,返回值与第一个参数值相同,除非你传递NULL给该参数。其各个参数意义:
mysql: 是一个现存MYSQL结构的地址。在调用mysql_real_connect()之前,你必须调用mysql_init()初始化MYSQL结构。通过mysql_options()调用,可更改多种连接选项。
host: 值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
user: 包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。
passwd:如果passwd是NULL,只有在user表中对于有一个空白口令字段的用户的条目将被检查一个匹配。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
db: 数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
port: 如果port不是0,值对于TCP/IP连接将用作端口号。注意host参数决定连接的类型。
unix_socket: 如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
client_flag:值通常是0,别的取值见百度百科.
int mysql_select_db(MYSQL *mysql, const char *db)
使由db指定的数据库成为由mysql指定的连接上的默认数据库(当前数据库)。在后续查询中,该数据库将是未包含明确数据库区分符的表引用的默认数据库。返回值:若成功则为零。如果发生一个错误为非零。
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
执行由query指向的SQL查询,它应该是一个length个字节的字符串。查询必须由一个单个的SQL语句组成。你不应该在语句后增加一个终止的分号(“;”)或\g。
对于包含二进制数据的查询,你必须使用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因为它不会在查询字符串上调用strlen()。如果查询成功,函数返回零。如果发生一个错误,函数返回非零
MYSQL_RES *mysql_store_result(MYSQL *mysql)
将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集。如果希望了解查询是否应返回结果集,也可使用mysql_field_count()进行检查。
返回值:若返回值不是Null指针可调用mysql_num_rows()来找出结果集中的行数。如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。一旦完成了对结果集的操作,必须调用mysql_free_result()。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
检索一个结果集合的下一行。当在mysql_store_result()之后使用时,如果没有更多的行可检索时或出现错误时,mysql_fetch_row()返回NULL。
在行中列的数量由mysql_num_fields(result)给出。如果变量row保存了对mysql_fetch_row(result)调用返回的值,指向该值的指针作为row[0]到row[mysql_num_fields(result)-1]来存取。在行中的NULL值由NULL指针指出。
在行中字段值的长度可以通过调用下面即将提到的mysql_fetch_lengths()获得。空字段和包含NULL的字段长度都是 0;你可以通过检查该值的指针区分他们。如果指针是NULL,字段是NULL;否则字段是空的。
unsigned long * mysql_fetch_lengths(MYSQL_RES *result)
以数组返回上一次用 mysql_fetch_row() 取得的行中每个字段的长度,如果出错返回 FALSE(?)。
mysql_fetch_lengths() 将上一次 mysql_fetch_row(),mysql_fetch_array() 和 mysql_fetch_object() 所返回的每个列的长度储存到一个数组中,偏移量从 0 开始。
3.简单的代码示例:
//测试学习mysql使用的基础知识
#include <iostream>
#include <string>
#include <mysql.h>
#include<iomanip>
//编译时要使用 $(mysql_config --cflags) $(mysql_config --libs)
using namespace std;
int main(int argc,char *argv[])
{
MYSQL * con;
MYSQL_RES *res;
MYSQL_ROW row;
MYSQL_FIELD * field=NULL;//字段指针
int fieldcount;//保存行中列的数量
string temp;
//database configuartion
string dbuser="Liujiakun";
string dbpasswd="132133";
string dbip="localhost";
string dbname="FirstExample";
string tablename="student";
int rt;//return value
int t=0;
con=mysql_init((MYSQL*)0);
if(con!=NULL&&mysql_real_connect(con,dbip.c_str(),dbuser.c_str(),dbpasswd.c_str(),NULL,3306/*TCP IP端口*/,NULL/*Unix Socket 连接类型*/,0/*运行成ODBC数据库标志*/))
{
if(!mysql_select_db(con,dbname.c_str()))
{
cout<<"Select successfully the database!"<<endl;
con->reconnect=1;
//temp="select * from "+tablename;
temp="describe student";
rt=mysql_real_query(con,temp.c_str(),temp.size());
if(rt)
{
cout<<"Error making query: "<<mysql_error(con)<<endl;
}
else
{
cout<<temp<<" executed!!!"<<endl;
}
res=mysql_store_result(con);//将结果保存在res结构体中
fieldcount=mysql_num_fields(res);
for(unsigned int i=0;i<fieldcount;i++)//逐个遍历字段指针,打印出列名
{
field=mysql_fetch_field_direct(res,i);
cout<<setiosflags(ios::left)<<setw(11)<<field->name<<"\t";
}
cout<<endl;
while(row=mysql_fetch_row(res))
{
unsigned long *lengths=mysql_fetch_lengths(res);//在行中字段值的长度可以通过调用mysql_fetch_lengths()获得。
for(t=0;t<fieldcount;t++)//mysql_num_fields(res):获取行中列的数量
{
if(row[t]==NULL)//在行中列值为的NULL值由NULL指针指出
cout<<setiosflags(ios::left)<<setw(11)<<"NULL"<<"\t";
else if(lengths[t]==0)
cout<<setiosflags(ios::left)<<setw(11)<<"0"<<"\t";
else
cout<<setiosflags(ios::left)<<setw(11)<<row[t]<<"\t";
}
cout<<endl;
}
cout<<"number of rows:"<<mysql_num_rows(res)<<endl;//获得行数
temp="insert into "+tablename+" values('','坤哥','男','1989-11-03')";
rt=mysql_real_query(con,temp.c_str(),temp.size());
if(rt)
{
cout<<"insert failed: "<<mysql_error(con)<<endl;
}
else
{
cout<<temp<<"executed!!!"<<endl;
}
cout<<"mysql_free_result..."<<endl;
//释放结果集 关闭数据库
mysql_free_result(res);
mysql_close(con);
}
else
{
cout<<"mysql_select_db failed: "<<mysql_error(con)<<endl;
}
}
else
{
cout<<"Unable to connect the database,check your configuration!"<<endl;
}
}
运行效果截图: