Mysql数据库函数
Mysql数据库函数
1.MYSQL *mysql_init(MYSQL *mysql) 分配或初始化与mysql_real_connect()相适应的MYSQL对象.
如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。
如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
在内存不足的情况下,返回NULL。
例:MYSQL mysql; mysql_init(&mysql); 或 MYSQL *mysql = mysql_init(NULL);
一般定义 MYSQL *mysql,避免取地址操作出错。
注:涉及数据库操作时编译加-L/usr/lib64/mysql -lmysqlclient_r 也可以是-lmysqlclient
2.MYSQL *mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd) 现已不用
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 *为mysql_init函数返回的指针
host主机地址,user/passwd/db用户名和密码.数据库,port 数据库端口
unix_socket使用unix连接方式 unix_socket一般为NULL,表明不使用socket或管道机制
client_flag参数经常设置为0
注:host为null或localhost时链接的是本地的计算机
当mysql默认安装在系统中,root账户是没有密码的,因此用户名使用root,密码为NULL.
当db为空的时候,函数链接到默认数据库,在进行mysql安装时会存在默认的test数据库,因此此处可以使用test数据库名称,port端口为0
返回:当连接成功时,返回MYSQL连接句柄,失败,返回NULL。
当成功时,返回值与第一个参数值是相同的。
例:MYSQL mysql; mysql_real_connect(&mysql,"192.168.1.6","root","","Cacti_Data",atoi("3306"),NULL,0)
MYSQL *mysql; mysql_real_connect(mysql,"localhost","root",NULL,"test",0,NULL,0);
详见:http://www.wang48.com/jishubaodianview/?jsd_id=13553
2.int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。
应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
选项参量指的是你打算设置的选项。arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。
详见:http://www.wang48.com/jishubaodianview/?jsd_id=13550
3.int mysql_query(MYSQL *mysql, const char *query)
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
执行由“query”指向的SQL查询,它应是字符串长度字节“long”。
正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号";"或“\\g”。
如果允许多语句执行,字符串可包含由分号隔开的多条语句。
如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查.
如果查询成功,返回0。如果出现错误,返回非0值。
错误代码:
CR_COMMANDS_OUT_OF_SYNC 以不恰当的顺序执行了命令。
CR_SERVER_GONE_ERROR MySQL服务器不可用。
CR_SERVER_LOST 在查询过程中,与服务器的连接丢失。
CR_UNKNOWN_ERROR 出现未知错误。
注:对于包含二进制数据的查询,必须使用mysql_real_query(),因为二进制数据可能会包含‘\\0’字符。
此外,mysql_real_query()比mysql_query()快,因为它不会在查询字符串上调用strlen()。
例:string tmp = "set names \'gbk\'"; mysql_real_query(mysql,tmp.c_str(),tmp.length());
string sln("tom"); string sql = "select ID,PID,VID from Table1 where Name = \'" + sln + "\'";
mysql_query(mysql, sql.c_str());
4.MYSQL_RES *mysql_store_result(MYSQL *mysql)返回查询结果集,0没有结果集,非0具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
MYSQL_RES *mysql_use_result(MYSQL *mysql)启动查询返回MYSQL_RES结构
int mysql_num_rows (MYSQL_RES *res) 返回结果集的行数
unsigned int mysql_field_count(MYSQL *mysql) 返回结果集中行的列数
unsigned int mysql_num_fields(MYSQL_RES *res) 同上。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *res) 从结果集中取得下一行,返回下一行的MYSQL_ROW结构。如果没有更多的行可检索或如果出现一个错误,NULL。
unsigned long *mysql_fetch_lengths(MYSQL_RES *res) 返回在结果集合内的当前行的列长度
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res) 返回行光标当前的偏移量.
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *res, MYSQL_ROW_OFFSET offset) 设置行光标.返回行光标先前的值
void mysql_free_result(MYSQL_RES *res)释放为一个结果集合分配的内存
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()来释放内存。
如果成功,mysql_store_result()将复位mysql_error()和mysql_errno()。
注:mysql_store_result() 立即从服务器上检索结果集,并为之分配内存,存储到客户机中
而mysql_use_result()只是启动查询,通过mysql_fetch_row()来调用
mysql_fetch_row()调用即取得一行数据,每个结果的列储存在一个数组的单元中,偏移量从0开始,依次调用取得下一行。
例: MYSQL_RES *res = mysql_store_result(&mysql); MYSQL_ROW *row = mysql_fetch_row(res); mysql_free_result(res);
unsigned long *lengths; lengths = mysql_fetch_lengths(res);
5.void mysql_close(MYSQL *mysql) 关闭一个以前打开了的连接,释放被mysql指向的连接句柄.
string mysql_error(MYSQL *mysql); 返回最近一次MySQL函数的执行状态
unsigned int mysql_errno(MYSQL *mysql)返回最近调用的API函数的错误代码
例:string err_str = mysql_error(mysql); 常用于数据库断开重连,下例执行SQl语句过程中出错重连。
if(err_str == "Lost connection to MySQL server during query" || err_str == "Malformed packet")
{mysql_close(mysql); mysql = NULL; return Reconnect(...);}
1.MYSQL *mysql_init(MYSQL *mysql) 分配或初始化与mysql_real_connect()相适应的MYSQL对象.
如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。
如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
在内存不足的情况下,返回NULL。
例:MYSQL mysql; mysql_init(&mysql); 或 MYSQL *mysql = mysql_init(NULL);
一般定义 MYSQL *mysql,避免取地址操作出错。
注:涉及数据库操作时编译加-L/usr/lib64/mysql -lmysqlclient_r 也可以是-lmysqlclient
2.MYSQL *mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd) 现已不用
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 *为mysql_init函数返回的指针
host主机地址,user/passwd/db用户名和密码.数据库,port 数据库端口
unix_socket使用unix连接方式 unix_socket一般为NULL,表明不使用socket或管道机制
client_flag参数经常设置为0
注:host为null或localhost时链接的是本地的计算机
当mysql默认安装在系统中,root账户是没有密码的,因此用户名使用root,密码为NULL.
当db为空的时候,函数链接到默认数据库,在进行mysql安装时会存在默认的test数据库,因此此处可以使用test数据库名称,port端口为0
返回:当连接成功时,返回MYSQL连接句柄,失败,返回NULL。
当成功时,返回值与第一个参数值是相同的。
例:MYSQL mysql; mysql_real_connect(&mysql,"192.168.1.6","root","","Cacti_Data",atoi("3306"),NULL,0)
MYSQL *mysql; mysql_real_connect(mysql,"localhost","root",NULL,"test",0,NULL,0);
详见:http://www.wang48.com/jishubaodianview/?jsd_id=13553
2.int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。
应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
选项参量指的是你打算设置的选项。arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。
详见:http://www.wang48.com/jishubaodianview/?jsd_id=13550
3.int mysql_query(MYSQL *mysql, const char *query)
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
执行由“query”指向的SQL查询,它应是字符串长度字节“long”。
正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号";"或“\\g”。
如果允许多语句执行,字符串可包含由分号隔开的多条语句。
如果希望知道查询是否应返回结果集,可使用mysql_field_count()进行检查.
如果查询成功,返回0。如果出现错误,返回非0值。
错误代码:
CR_COMMANDS_OUT_OF_SYNC 以不恰当的顺序执行了命令。
CR_SERVER_GONE_ERROR MySQL服务器不可用。
CR_SERVER_LOST 在查询过程中,与服务器的连接丢失。
CR_UNKNOWN_ERROR 出现未知错误。
注:对于包含二进制数据的查询,必须使用mysql_real_query(),因为二进制数据可能会包含‘\\0’字符。
此外,mysql_real_query()比mysql_query()快,因为它不会在查询字符串上调用strlen()。
例:string tmp = "set names \'gbk\'"; mysql_real_query(mysql,tmp.c_str(),tmp.length());
string sln("tom"); string sql = "select ID,PID,VID from Table1 where Name = \'" + sln + "\'";
mysql_query(mysql, sql.c_str());
4.MYSQL_RES *mysql_store_result(MYSQL *mysql)返回查询结果集,0没有结果集,非0具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
MYSQL_RES *mysql_use_result(MYSQL *mysql)启动查询返回MYSQL_RES结构
int mysql_num_rows (MYSQL_RES *res) 返回结果集的行数
unsigned int mysql_field_count(MYSQL *mysql) 返回结果集中行的列数
unsigned int mysql_num_fields(MYSQL_RES *res) 同上。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *res) 从结果集中取得下一行,返回下一行的MYSQL_ROW结构。如果没有更多的行可检索或如果出现一个错误,NULL。
unsigned long *mysql_fetch_lengths(MYSQL_RES *res) 返回在结果集合内的当前行的列长度
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res) 返回行光标当前的偏移量.
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *res, MYSQL_ROW_OFFSET offset) 设置行光标.返回行光标先前的值
void mysql_free_result(MYSQL_RES *res)释放为一个结果集合分配的内存
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()来释放内存。
如果成功,mysql_store_result()将复位mysql_error()和mysql_errno()。
注:mysql_store_result() 立即从服务器上检索结果集,并为之分配内存,存储到客户机中
而mysql_use_result()只是启动查询,通过mysql_fetch_row()来调用
mysql_fetch_row()调用即取得一行数据,每个结果的列储存在一个数组的单元中,偏移量从0开始,依次调用取得下一行。
例: MYSQL_RES *res = mysql_store_result(&mysql); MYSQL_ROW *row = mysql_fetch_row(res); mysql_free_result(res);
unsigned long *lengths; lengths = mysql_fetch_lengths(res);
5.void mysql_close(MYSQL *mysql) 关闭一个以前打开了的连接,释放被mysql指向的连接句柄.
string mysql_error(MYSQL *mysql); 返回最近一次MySQL函数的执行状态
unsigned int mysql_errno(MYSQL *mysql)返回最近调用的API函数的错误代码
例:string err_str = mysql_error(mysql); 常用于数据库断开重连,下例执行SQl语句过程中出错重连。
if(err_str == "Lost connection to MySQL server during query" || err_str == "Malformed packet")
{mysql_close(mysql); mysql = NULL; return Reconnect(...);}