标签:建立连接 结束 主机名 sock 路径 commit list lis offset
头文件:#include<mysql.h>
C API数据类型:
下面是mysql.h头文件中的C API数据类型列表:
MYSQL
mysql_init()创建的数据库句柄结构,可以使用mysql_close()释放内存。
MYSQL_RES
从SQL查询语句获取的查询结果集的结构。取回函数会用到这个数据类型,可以使用mysql_free_result()释放内存。
MYSQL_ROW
该结构用于存放结果集的行数据。使用函数mysql_fetch_row()可检索该结构中的数据。
MYSQL_FIELD
该结构用于存放结果集中的字段信息。通过函数mysql_fetch_field()可以创建存放字段信息的数组。数组元素包括缺省的name、table以及def。
MYSQL_FIELD_OFFSET
该类型用于记录结果集指针偏移位置。函数mysql_row_tell()可取得偏移量,函数mysql_row_seek()可以这个数据类型。
my_ulonglong
可变类型,用于存放从以下函数获取的行数,如MySQL_ffected_rowsa()、mysql_num_rows()以及mysql_insert_id()。可使用这个类型打印变量的值,将值复制到其他的无符号长整型变量中。
C函数API
1、mysql_affected_rows():
my_ulonglong mysql_affected_rows(MYSQL*mysql);
返回最近查询中受影响的记录行数。INSERT、UPDATE、DELETE语句执行后,可以使用该函数获取上述语句受影响的行数。对于不涉及到行数的语句,函数返回值为0.如果发生错误,返回-1.
2、mysql_autocommit()
my_bool mysql_autocommit(MYSQL* mysql,my_bool mode);
使用该函数可以启用或禁止自动提交模式。函数第二个参数的值为1,则启动服务器的自动提交模式,值为0则禁用自动提交模式。自动提交模式可令服务器在每个INSERT、UPDATE或DELETE语句的事务执行完毕后自动更新数据库。默认启用自动提交模式。
3、mysql_change_user()
my_bool mysql_change_user(MYSQL* mysql,const char* uer,const char* password,const char* database);
使用该函数可以将当前MYSQL回话用户修改为第二参数指定的用户。由于该函数执行成功的同时会终止当前会话,所以需要重置默认数据库。因此,在函数的第四个参数中指定新连接使用的数据库。
4、mysql_character_set_name()
const char* mysql_character_set_name(MYSQL* mysql);
该函数返回服务器正在使用的默认字符集名称
5、mysql_close()
void mysql_close(MYSQL*mysql);
该函数关闭当前回话的数据库
6、mysql_commit()
my_bool mysql_commit(MYSQL* mysql);
该函数可以提交事务,函数执行后,INSERT、UPDATE以及DELETE语句的执行结果会被保存到数据库中,函数mysql_roolback()也不能取消这些操作。
函数执行成功返回0,失败返回一个非零值。
7、mysql_connect()
MYSQL* mysql_connect(MYSQL*mysql, const char* host,const char* user,const char* password);
该函数与mysql_real_connect()有所不同。
8、mysql_create_db()
int mysql_create_db(MYSQL* mysql,const char* database);
该函数用于在MySQL句柄上创建一个新的数据库,函数第二参数给出新的数据库的名称。
不建议使用该函数,建议在查询语句中创建数据库或表。
9、mysql_data_seek()
void mysql_data_sek(MYSQL_RES* result, my_ulonglong offset);
该函数可以与mysql_store_result()以及取回结果集的函数(如mysql_fetch_row())结合使用,将取回结果的当前指正移动到函数第二个参数指定的偏移位置。
mysql_query(mysql,"SELECT client_id, client_name FROM clients ORDER BY start_date"); result=mysql_store_result(mysql); num_rows=mysql_num_rows(result); mysql_data_seek(result,(num_rows-8)); while((row=mysql_fetch_row(result))!=NULL) { printf("%s(%s)\n",row[1],row[0]); }
显示查询结果的后8行数据
10、mysql_debug()
void mysql_debug(const char*debug);
如果客户机库已经编译并支持调试,可使用该函数创建跟踪调试文件。
11、mysql_drop_db()
int mysql_drop_db(MYSQL* mysql,const char* database);
该函数可以来删除MYSQL服务器中的数据库。函数的第二个参数给出需要删除的数据库名字。如果函数操作成功则返回0,失败返回1.
12、mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL*mysql)
函数用于把当前连接的出错信息写进MySQL服务器的日志文件中。如果操作成功则返回0,如果操作失败则返回非零值。执行操作的用户必须有管理员权限。下面是该函数的示例程序:
…… if(!mysql_dump_debug_info(mysql)) {printf("Debugging Info.Written.\n");} ……
12、mysql_eof()
my_bool mysql_eof(MYSQL*result)
MySQL_e o f()用于确定是否取回了结果集中的最后一行记录。如果没有执行到结果集的最后一行则返回值0,否则返回一个非零值。
推荐使用该函数。可以使用mysql_errno()、mysql_error()或mysql_more_results()代替该函数检测执行到最后一行记录的错误提示。
14、mysql_errno()
unsigned int mysql_errno(MYSQL*mysql);
如果程序执行过程中出现错误,该函数会返回最后一次调用API函数的出错代码。如果最后一次调用的函数执行成功,则该函数会返回一个0值。
15、mysql_error()
char*mysql_error(MYSQL*mysql)
如果程序执行过程中出现错误,该函数会返回最后一次调用API函数的出错信息。如果最后一次调用的函数成功执行,则该函数会返回一个空字符串。
16、mysql_escape_string()
unsigned int mysql_escape_string(char*destination,const char*source,unsigned int length)
该函数使用反斜杠,对第二个参数给出的字符串进行转义,并返回转义后的结果。然而,因为安全上的问题,并不推荐使用这个函数。通常使用MySQL_real_escape_string()代替它;这个函数可以安全而且准确地完成任务。
17、mysql_fetch_field()
MYSQL_FIELD* mysql_field(MYSQL_RES*result);
该函数返回结果集中指定字段的相关信息。如要得到所有字段的元数据,只要循环执行该函数即可。
MYSQL_FIELD*field; …… mysql_query(mysql,"SELECT*FROM clients LIMIT 1"); result=mysql_store_result(mysql); while((field=mysql_fetch_field(result))!=NULL) {printf("%s\n",field->name);}
SELECT语句中的统配符选择了表中的所有列。因此通过循环语句可列出每列的名称。还有其他的一些可用属性,如field->table可获得表名,field->def可获得列的默认值。
18、mysql_fetch_field_direct()
MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES* result,unsigned int field_nbr);
这个函数返回了函数第一个参数执行结果集中指定字段的信息。函数的第二个参数用于指定字段。下面是函数的示例:
…… MYSQL_FIELD*field; …… mysql_query(mysql,"SELECT*FROM clients LIMIT 1"); result=mysql_store_result(mysql); field=mysql_fetch_field_direct(result,0); printf("%s\n",field->name);
该函数和mysql_fetch_field()很相似,不同之处在于函数可获得指定字段的信息。在上面的示例中,将显示第一个字段的名称(0代表第一个字段)。
19、mysql_fetch_fields()
MYSQL_FIELD*mysql_fetch_fields(MYSQL_RES*result);
该函数返回一个存放结果集中字段信息的一个数组。
20、mysql_fetch_lengths()
unsigned long * mysql_fetch_lengths(MYSQL_RES*result);
该函数返回结果集中每一列的长度,每一行返回的值都是变化的。
21、mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);
使用该函数可以取回结果集中的下一行。如果结果集中没有下一行可取,函数将返回NULL。
22、mysql_field_seek()
MUYSQL_FIELD_OFFSET mysql_dield_seek(MYSQL_RES*res,MYSQL_FIELD_OFFSET offset);
该函数和mysql_fetch_field()联合使用,可将结果集中当前字段的指针移动号函数第二参数指定的便宜位置处。函数返回的偏移量,函数的第一个参数是结果集的指针。
mysql_query(mysql, sql_stmnt); MYSQL_FIELD_OFFSET offset=2; mysql_field_seek(result, offset); while((field=mysql_fetch_field(result))!=NULL) { printf("%d:%s\n",mysql_field_tell(result),field->name); } ……
在这个示例中使用了mysql_field_seek(),并将偏移量设置为2,结果集中的头二行被忽略。函数mysql_field_seek()用来确定while循环语句中将显示的字段的索引。函数MySQL_field_seek()在执行前先返回偏移量。
23、mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES*result);
24、mysql_free_result()
void mysql_free_result(MYSQL_RES*result);
该函数释放函数分配的资源,
25、mysql_get_client_info()
char* mysql_get_client_info(void);
该函数返回客户机的版本。
26、mysql_get_character_set_info()
void mysql_get_character_set_info(MYSQL*mysql,MY_CHARACTER_INFO* cs);
该函数返回指定数据库的字符集信息,
它使用了MY_CHARSE_INFO结构,因此可以得到如下所示的扩展信息:
…… if(!mysql_set_character_set(mysql,"utf8")) { MY_CHARSET_INFO ch_set; mysql_get_character_set_info(mysql,&ch_set); printf("Character Set:%s\n",ch_set.name); printf("Collation:%s\n",ch_set.csname); printf("Minimum Length for Multibyte Character:%d\n",ch_set.mbminlen); printf("Maximum Length for Multibyte Character:%d\n",ch_set.mbmaxlen); printf("Comment:%s\n",ch_set.comment); printf("Directory:%s\n",ch_set.dir); } ……
输出结果:
Character Set:utf8_general_ci
Collation:utf8
Minimum Length for Multibyte Character:1
Maximum Length for Multibyte Character:3
Comment:UTF-8 Unicode
Directory:(null)
27 、mysql_get_client_version()
unsigned long*mysql_get_client_version(void)
mysql_get_client_version()返回数字格式的客户机库版本。
28、mysql_get_host_info()
char*mysql_get_host_info(MYSQL*mysql)
该函数返回主机名以及当前链接类型。
29、mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL*mysql)
该函数返回当前链接的协议版本。
30、mysql_get_server_info()
char* mysql_get_server_info(MYSQL* mysql)
该函数返回一个包含服务器上当前链接的mysql版本信息的字符串。
31、mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL*mysql)
该函数返回当前连接的服务器数值格式的版本信息。
32、mysql_get_ssl_cipher()
const char* mysql_get_ssl_cipher(MYSQL*mysql)
该函数返回带有加密套接字(Security Socket Layer, SSL)密码名称的字符串,该名称用于给定的连接。如果没有使用密码,函数将返回NULL。
33、mysql_hex_string()
unsigned long mysql_hex_string(char*to, const char*from, unsigned long length)
函数将十六进制的字符串转换成SQL语句可以使用的格式。十六进制字符串将由程序中指针from指向的内容或变量给出。结果存放在变量to中,以NULL字节作为字符串的结束。Length是from指向内容的字节长度。变量to的长度值为length乘以2再加1。
34、mysql_info()
char* mysql_info(MYSQL*mysql)
当执行了特定的SQL语句时,该函数会返回MySQL给出的信息字符串。
35、mysql_init()
MYSQL* mysql_init(MYSQL*mysql);
该函数可分配并初始化用于连接数据库服务器MySQL对象.
如果函数的参数为NULL,库将从堆分配一个新对象;否则,将初始化用户指定的本地MYSQL对象。
返回值是指向对象的指针,如果得到的是NULL则表示分配对象或初始化操作失败。用这个指针调用函数mysql_close()不仅释放连接相关资源,如果库在开始位置分配了对象,则也会释放对象本身。
通常使用库分配对象要比手动分配对象安全。当创建建立在库基础上的应用时,如果某些编译器选项失效,使用这种方式可以避免发生程序调试跟踪难的问题。
尽管该函数预备了一个数据库连接句柄,但并没有连接数据库。
36、mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL*mysql);
该函数返回在当前连接下,使用INSERT插入的最后一条记录的主键标识码。使用该函数的前提是,表中有AUTO_INCREMENT列,并且列值是自动分配的。否则函数将返回值0.
37、mysql_kill()
int mysql_kill(MYSQL*mysql,unsigned long iderifer);
使用该函数可以结束服务器上运行的线程。可以通过函数的第二个参数指定线程的标识符。如果要结束当前连接,可以使用带有会话句柄的函数mysql_thread_id()
如果要结束当前线程以外的其他线程,可以使用函数myslq_list_processes()列出所有的线程,从中选出要终止的线程。
38、mysql_library_end()
void mysql_library_end(void)
使用该函数可以在断开服务器的连接后关闭Mysq库,该函数也可以释放内存,也可以用于通常的客户机库或嵌入式服务器库。通常接mysql_library_init()结合使用
39、mysql_library_init()
int mysql_library_init(int argc,char** argv,char** groups);
在调用其他MySQL函数之前,可使用该函数初始化MySQL库、相关库以及系统。它可以作用于普通的客户机库或嵌入式服务器库。该函数可用于多线程环境下。另外,这个函数并不是必需的,mysql_init()可完成相同功能。该函数执行完毕后,可以使用mysql_library_end()关闭库。如果函数执行成功则返回零,否则返回非零值。
40、mysql_list_dbs()
MYSQL_RES* mysql_list_dbs(MYSQL*mysql,const char* wild)
该函数返回包含当前连接下服务器上所有数据库的集合。
41、mysql_list_field()
MYSQL_RES*mysql_list_fields(MYSQL*mysql, const char*table,const char*wild)
函数返回包含指定表中所有的字段,函数的第二个参数指定要检索的表。第三个参数给出一个表达式,用于选择名字与其匹配的字段。%或_可作为通配符。如果第三个参数为NULL,则返回表中所有字段。执行结束后需释放结果集。
42、mysql_list_processes()
MYSQL_RES*mysql_list_processes(MYSQL*mysql)
函数返回服务器上所有的MySQL服务器进程或服务器线程,函数的参数指定服务器句柄。
43、mysql_list_tables()
MYSQL_RES*mysql_list_tables(MYSQL*mysql,const char*expression)
该函数返回指定数据库中的全部表。函数的第二个参数给出的表达式用于选择名字和表达式相匹配的表。%或_用作通配符。如果第二个参数为NULL,则会返回数据库中所有的表。
44、mysql_more_results()
my_bool mysql_more_result(MYSQL*mysql);
当使用函数mysql_next_result()检索数据时,可使用这个函数检测结果集中是否有更多结果。如果有更多的结果则返回1,否则返回0。
45、mysql_next_result()
int mysql_next_result(MYSQL*mysql)
可使用该函数从结果集中读取下一行数据。如果执行成功并且结果集中检索到更多的结果则返回0,如果检索数据成功,但没有更多的结果行可检索则返回-1。如果结果集没有数据返回会导致函数执行失败,则返回出错信息(或者返回非零值)。在调用该函数前可以使用mysql_more_results()检查是否有多个结果。
46、mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES*result)
函数返回结果集中每一行的字段数。
47、mysql_num_rows()
int mysql_num_rows(MYSQL_RES*result);
当mysql_store_result()执行完毕后,可使用该函数返回结果集中的行数。如果在函数mysql_user_result()后使用,则在检索了结果集中所有行后,再返回行数。
48、mysql_options()
int mysql_options(MYSQL* mysql,enum mysql_option option,const char* value);
在使用mysql_real_connect()或mysql_connect()建立连接前,可使用该函数设置连接选项。在连接前可以多次使用该函数设置额外的选项。可以通过函数的第二个参数指定连接选项。通过第三个参数给出与连接选项相关的值。
下面列举了函数第二个参数用到的选项,除此之外,在圆括号中还列举第三个参数的变量类型和值,以及每个选项的简要介绍:
MYSQL_OPT_CONNECT_TIMEOUT(unsigned int*) 该选项设置连接超时的秒数。 MYSQL_OPT_READ_TIMEOUT(unsigned int*) 该选项设置在Windows系统下MySQL服务器读取信息超时的秒数。 MYSQL_OPT_WRITE_TIMEOUT(unsigned int*) 该选项设置在Windows系统下向MySQL服务器写入数据的超时的秒数。 MYSQL_OPT_COMPRESS(NULL) 该选项可设置客户机和服务器间的压缩通讯,前提是二者都支持压缩通讯。 MYSQL_OPT_LOCAL_INFILE(pointer to unsigned integer) 该选项作用于参数指向的文件。如果指针为NULL,则在连接时运行LOADLOCALINFILE语句。 MYSQL_OPT_NAMED_PIPE(NULL) 该选项指示客户机使用命名管道连接到Windows NT平台上的MySQL服务器。 MYSQL_INIT_COMMAND(char*) 该选项设置连接到MySQL服务器后要执行的查询,由函数的第三个参数指定查询语句。 MYSQL_READ_DEFAULT_FILE(char*) 该选项指示服务器读取配置文本文件,文件的名称在函数的第三个参数中给出,而不是读取客户机的缺省配置文件my.cnf。 MYSQL_READ_DEFAULT_GROUP(char*) 该选项命令服务器从缺省配置文件my.cnf或由函数的MYSQL_READ_DEFAULT_FILE选项指定的配置文件中读取服务器小节或组。 MYSQL_OPT_PROTOCOL(unsigned int*) 该选项指定默认的数据库连接协议。 MYSQL_SHARED_MEMORY_BASE_NAME(char*) 该选项命名了用于连接服务器的共享内存对象。
49、mysql_ping()
int mysql_ping(MYSQL*mysql)
使用该函数可判断当前MYSQL连接是否处于开启状态。如果没有开启,函数将重新建立连接;如果连接是打开的或重新建立成功,则返回零;否则返回一个非零值。
50、mysql_query()
int mysql_query(MYSQL*mysql, const char*query)
该函数执行了SQL查询语句,SQL语句由函数的第二个参数给出。只可以给出一条SQL语句。如果查询包含二进制数据,则需要用mysql_real_query()代替该函数。如果函数执行成功则返回零,否则返回非零值。
MYSQL*mysql; MYSQL_RES*result; MYSQL_ROW row; MYSQL_FIELD*field; int i, num_fields; …… mysql=mysql_init(NULL); mysql_real_connect(mysql, host, user, password, database,0,NULL,0); const char*sql_stmnt="SELECT*FROM workreq"; mysql_query(mysql, sql_stmnt, bytes); result=mysql_store_result(mysql); num_fields=mysql_field_count(mysql); while((row=mysql_fetch_row(result))!=NULL) { for(i=0;i<num_fields;i++) {printf("%s,",row[i]);} printf("\n"); } mysql_free_result(result); mysql_close(mysql);
51、mysql_real_connect()
MYSQL*mysql_real_connect(MYSQL*mysql, const char*host, const char*user, const char*password, const char*user, const char*password, const char*database, uint port, const char*user, const char*password, const char*database, uint port, const char*unix_socket, uint flag)
使用该函数可建立MySQL服务器连接。函数的第一个参数给出MySQL_init()创建的MYSQL结构的地址。接下来给出数据库连接所需的主机名、用户名以及用户密码。数据库名称由第五个参数给出。端口、Unix系统下的套接字文件路径及名称,以及客户机标识由第六、第七以及第八个参数分别给出。对于任何需要字符指针的参数,如果其值为NULL,即告知服务器使用默认设置。对于无符号整形变量,通常以0作为默认值。
#include<stdio.h> #include<stdlib.h> #include<mysql/mysql.h> int main(void) { MYSQL*mysql; MYSQL_RES*result; MYSQL_ROW row; MYSQL_FIELD*field; const char*host="localhost"; const char*user="root"; const char*password="my_password"; const char*database="workrequests"; unsigned int port=3306; const char*socket=NULL; unsigned long flag=0; int i, num_fields; mysql=mysql_init(NULL); mysql_real_connect(mysql, host, user, password, database,port, socket, flag); const char*sql_stmnt="SELECT*FROM stores"; ulong bytes=strlen(sql_stmnt); mysql_real_query(mysql, sql_stmnt, bytes); result=mysql_store_result(mysql); num_fields=mysql_field_count(mysql); while((row=mysql_fetch_row(result))!=NULL) { for(i=0;i<num_fields;i++) {printf("%s,",row[i]);} printf("\n"); } mysql_free_result(result); mysql_close(mysql); return 0; }
52、mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL*mysql, char*result_string, char*result__string, char*original_string, char*result_string, char*original_string, unsigned long src length)
mysql_real_escape_string()将第三个参数给出的字符串,使用转义符转换成合法的SQL语句字符串,转义结果存放在第二个参数指定的变量中。第四个参数给出从源字符串复制的字节数。当声明二个字符串时,目标字符串的大小必须为源字符串长度的2倍,再加一个字
节。如下面的示例所示:
…… const char client_name[]="O‘Reilly Media"; ulong bytes=strlen(client_name); char client_name_esc[(2*bytes)+1]; mysql_real_escape_string(mysql, client_name_esc, client_name, bytes); char*sql_stmnt; sprintf(sql_stmnt,"INSERT INTO clients(client_name) VALUES(‘%s‘)",client_name_esc); mysql_real_query(mysql, sql_stmnt, strlen(sql_stmnt)); ……
建立完存放客户机名称的初始变量后,通常用C函数s t r l e n()获取字符串的长度。下一步,声明第二个存放客户机名称的变量,大小是第一个变量的2倍再加一个字节。函数mysql_real_escape_string()运行时需用到二个变量以及第一个变量的长度。示例程序中,函数为客户名称中的撇号前加一个反斜杠,这可以避免以后运行查询时发生错误。使用C函数sprintf(),将转义后的客户名称插入给定的SQL语句中。最后,使用函数mysql_real_query()执行查询语句。
53、mysql_real_query()
int mysql_real_query(MYSQL*mysql, const char*query,unsigned int length)
通过该函数,可以执行第二个参数指定的SQL查询。在此,至少指定一条SQL语句。与mysql_query()不同,该函数可执行包含二进制数据的查询。由于具备这个特性,所以需要在第三个参数中给出查询字符串包含的字节数。可以使用C函数strlen()确定字节数。如果函数执行成功则返回零值,否则返回非零值。
mysql=mysql_init(NULL); mysql_real_connect(mysql, host, user, password, database, port, socket, flag); const char*sql_stmnt="SELECT*FROM stores"; ulong bytes=strlen(sql_stmnt); mysql_real_query(mysql, sql_stmnt, bytes); result=mysql_store_result(mysql); num_fields=mysql_field_count(mysql); while((row=mysql_fetch_row(result))!=NULL) { for(i=0;i<num_fields;i++) {printf("%s,",row[i]);} printf("\n"); }
示例程序中,使用C函数strlen()获取了存放SQL语句的变量长度,结果存放在bytes的变量中。然后,将bytes变量作为函数mysql_real_query()的第三个参数。也可以使用strnlen(sql_stmnt)代替bytes,作为函数的第三个参数。
54、mysql_reload()
int mysql_reload(MYSQL*mysql);
函数告知MySQL服务器重新装载授权表。如果装载成功返回,函数返回0,否则返回一个非零值。不推荐使用这个函数。通常使用在mysql_query()或mysql_real_query()中使用语句FLUSH PRIVILEGES代替该函数。
55、mysql_refresh()
int mysql_refresh(MYSQL*mysql, unsigned int options)
该函数用于刷新缓存和数据表,也可用于重置备份服务器。如果操作成功,函数返回0,否则返回非零值。连接用户必须拥有RELOAD权限才可使用该函数。函数可以指定以下几个选项:REFRESH_GRANT、REFRESH_LOG、REFRESH_TABLES、REFRESH_HOSTS、REFRESH_MASTER、REFRESH_SLAVE、REFRESH_STATUS以及REFRESH_THREADS。有四种可能返回的错误:CR_COMMANDS_OUT_OF_SYNC、CR_SERVER_GONE_ERROR、CR_SERVER_LOST或CR_UNKNOWN_ERROR。下面是函数的示例程序:
mysql_refresh(MYSQL mysql, unsigned int REFRESH_TABLES);
55、mysql_roolback()
my_bool mysql_roolback(MYSQL*mysql)
该函数用于回退当前事务。如果当前事务已经调用了函数mysql_commit(),则该函数将不再起作用。如果函数执行成功则返回0,否则返回非零值。
56、mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL*result,MYSQL_ROW_OFFSET offset)
该函数可将指针移动到结果集中任意行,第二个参数指定了行偏移量。偏移量必须是MYSQL_ROW_OFFSET结构。可以使用函数mysql_row_tell()获取偏移量。
MYSQL_ROW_OFFSET special_location; while((row=mysql_fetch_row(result))!=NULL) { if(strcmp(row[1],"1000")==0) { special_location=mysql_row_tell(result); continue; } if(!mysql_more_results(mysql)) { mysql_row_seek(result, special_location); printf("%s(%s)\n",row[1],row[0]); break; } printf("%s(%s)\n",row[1],row[0]); }
该示例中,需要获取一个客户列表,但开发人员想让客户标识码为1000的记录最后显示。因此,使用一个i f语句查找指定的记录。找到所需记录后,使用函数mysql_row_tell()为结果集中该行做一个标记。while语句余下的打印指定行部分忽略不显示了。使用函数mysql_more_results(),利用另一个if语句判断结果集的结束位置。如果确定结果集中已没有结果可以显示,则将指针移到mysql_row_tell()标记的记录,输出该记录的信息,最后使用break结束退出while循环。
57、mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES*result)
该函数返回结果集中指针的当前位置,通过函数mysql_store_result()获得结果集。当取回结果时,可以使用该函数的返回值作为mysql_row_seek()的参数来修改指针位置。
58、mysql_select_db()
int mysql_select_db(MYSQL* mysql,const char*database);
使用该函数选择当前连接下不同的数据库。函数的第二个参数给出新数据库的名称。如果操作成功返回0,否则返回非零值。
59、
mysql_set_character_set()
int mysql_set_character_set(MYSQL*mysql, const char*char_set)
该函数用于为当前连接设置默认字符集。如果设置成功则返回0,否则返回非零值。
60、mysql_set_local_infile_default()
void mysql_set_local_infile_default(MYSQL*mysql);
该函数可以令C客户机库默认支持LOAD LOCAL DATA INFILE语句。C库函数通常可以自动调用该函数。
61、mysql_set_local_infile_hander()
void mysql_set_local_infile_handler(MYSQL*mysql,int(*local_infle_init)(void**,const char*,void*),
int(*local_infle_read)(void*,char*,unsigned int),
void(*local_infle_end)(void*),
int(*local_infle_error)(void*,char*,unsigned int),
void*userdata)
使用该函数允许执行LOAD DATA LOCAL INFILE语句时使用回调函数。首先需要创建回调函数:
…… int local_infile_init(void**ptr, const char*file_name, void*user_info); int local_infile_read(void*ptr, char*buffer, unsigned int buffer_len); void local_infile_end(void*ptr); int local_infile_error(void*ptr, char*error_msg, unsigned int error_msg_len); ……
62、mysql_set_server_option()
int mysql_set_server_option(MYSQL*mysql,enum mysql_set_option option)
该函数可以启用或禁用一个服务器选项。目前,可以选择的选项有MYSQL_OPTION_MULTI_STATEMENTS_ON以及MYSQL_OPTION_MULTI_STATEMENTS_OFF,这二个选项可以分别启用和禁用多重SQL语句。如果操作成功返回0,否则返回一个非零值。
63、mysql_shutdown()
int mysql_shutdowm(MYSQL* mysql)
该函数可以用来关闭MYSQL服务器。
64、mysql_sqlstate()
const char* mysql_sqlstate(MYSQL* mysql)
该函数用于返回当前链接最后一次发生错误的错误代码,字符串包含5个字符,结束位置是一个NULL字符。00000表示没有错误,HY000表示映射的错误。
65、mysql_ssl_set()
my_bool mysql_ssl_set(MYSQL*mysql,const char*key_path,const char*cert_path, const char*ca_path,const char*pem_path, const char*cipher)
该函数使用SSL建立一个安全连接。要使用该函数,客户机库必须支持OpenSSL,而且要在mysql_real_connect()之前调用该函数。如果没有发生错误,函数返回0。如果SSL设置不正确,mysql_real_connect()将返回出错信息。key_path是key文件的路径名;cert_path是数字证书文件的路径名;ca_path是数字证书授权文件的路径名;pem_path是包含pem格式的可信任SSL CA证书的路径;cipher包含了用于SSL加密的许可密码列表。未使用的参数可将其设为NULL。
66、mysql_stat()
char* mysql_stat(MYSQL*mysql);
该函数返回一个包含当前链接下的mysql服务器的状态信息字符串。
67、mysql_store_result()
MYSQL_RES* mysql_store_result(MYSQL*mysql);
函数读取并存储MySQL_R E S结构的结果集。一旦完成了对结果集的操作,必须使用函数mysql_free_result()释放分配给结果集的内存。如果函数执行失败或者使用的是不能返回任何结果集的查询类型(例如:UPDATE语句),函数将返回NULL。
68、mysql_thread_end()
void mysql_thread_end(void);
通常在释放mysql_thread_init()分配的内存之前调用该函数。该函数没有返回值,也不能自动调用它。
69、mysql_thread_id()
unsigned long mysql_thread_id(MYSQL*mysql)
该函数返回当前连接的线程标识码。如果连接关闭或重启,线程标识码会改变。
70、mysql_thread_init()
my_bool mysql_thread_init(void);
该函数用于初始化线程相关的变量。它可以被mysql_connect()、mysql_init()、mysql_library_init()以及mysql_server_init()自动调用。如果函数操作成功返回0,否则返回非零值。
71、mysql_use_result()
MYSQL_RES* mysql_use_result(MYSQL*mysql)
该函数可读取查询结果,每次读取一行结果。它的运行方式与函数mysql_store_result()很相似,不同之处在于mysql_store_result()一次就检索并存储所有的数据供以后使用。如果结果集数量庞大且对处理速度要求高时,最好使用mysql_use_result()。使用该函数,每检索一行结果就可进行处理,而不必等到所有数据都被检索完毕。该函数的一个缺点是,当处理一个查询的结果集时,不能执行其他的查询操作。同时,由于结果集的大小是未知的,所以不能使用mysql_data_seek(),mysql_num_row()的返回值也是变化的。
72、mysql_warning_count()
unsigned int mysql_warning_count(MYSQL*mysql)
该函数返回前面查询中遇到的警告信息数。
标签:建立连接 结束 主机名 sock 路径 commit list lis offset
原文地址:https://www.cnblogs.com/Hello-LiuLiu/p/9090931.html