红联Linux门户
Linux帮助

关于Linux下mysql的C/C++基础编程笔记

发布时间:2016-06-29 15:24:18来源:linux网站作者:坤哥玩CSDN

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; 

运行效果截图:

关于Linux下mysql的C/C++基础编程笔记


本文永久更新地址:http://www.linuxdiyf.com/linux/21942.html