用c语言连接MYSQL数据库包含两个步骤:
1.初始化一个链接句柄结构;
2.实际进行连接//mysql_real_connect(...);
首先,使用mysql_init来初始化连接句柄:
#include<mysql.h>
MYSQL *mysql_init(MYSQL *);
通常你传递NULL给这个例程,它会返回一个指向新分配的连接句柄结构的指针。如果你传递一个已有的结构,它将被重新初始化,
这个例程在出错是返回NULL。
目前为止,你知识分配和初始化一个结构,你还需要使用mysql_real_connect来向一个连接提供参数。
MYSQL *mysql_real_connect(MYSQL *connection , const char *server_host ,
const char *sql_user_name , const char * sql_password ,const char * db_name ,
unsigned int port_number, const char *unix_socket_name , unsigned int flags);
指针connection必须指向已经被mysql_init初始化过的结构。
server_host既可以是主机名,也可以使IP地址。
sql_user_name 和sql_password的含义和它们的字面含义一样。
如果登录名为NULL,则假设登录名为当前LINUX用户的登录ID,如果登录
密码为NULL,你将只能访问服务器上无需密码就可以访问的数据。
port_number和unix_socket_name应该分别是0和NULL,除非你改变了MYSQL安装的默认设置。
它们将默认使用合适的值。
最后,flags参数用来对一些定义的位模式进行OR操作。
如果无法连接,它将返回NULL,mysql_error函数可以提供有帮助的信息。
使用完连接之后,通常程序退出时,你要像下面这样调用函数mysql_close();
void mysql_close(MYSQL *connection);
这将关闭连接。
mysql_option例程(仅能在mysql_init和mysql_real_connect之间调用)可以设置一些选项。
int mysql_option(MYSQL *connection , enum option_to_set , const char *argument);
因为mysql_option一次只能设置一个选项,所以设置一个选项就得调用它一次。
enum选项 实际参数类型 说明
MYSQL_OPT_TIMEOUT const unsigned int * 连接超时之前等待的秒数
MYSQL_OPT_COMPRESS None,使用NULL 网络连接中使用压缩机制
MYSQL_OPT_COMMAND const char * 每次连接建立后发送的命令
执行sql语句
执行sql语句的主要API函数被恰当的命名为:
int mysql_query(MYSQL *connection ,const char *query);
如果成功返回0.
1.不返回数据的SQL语句
my_ulonglong mysql_affected_rows(MYSQL *connection);
返回值是无符号长整型,printf打印时,我们推荐使用%lu将其转换为无符号长整型。返回的是受之前的sql语句影响的行数。
2.返回数据的语句
一次提取所有数据的函数
MYSQL_RES *mysql_store_result(MYSQL *connecion);
显然,你需要在在成功调用mysql_query之后使用这个函数。这个函数将立刻保存在客户端中返回的所有数据。
在mysql_store_result调用成功之后,你需要调用mysql_num_rows来得到返回记录的数目。
my_ulonglong mysql_num_rows(MYSQL_RES *RESULT);
这个函数接受由mysql_store_result返回的结构结构,并返回结构集中的行数。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
这个函数从使用mysql_store_result得到的结果结构中提取一行,并把它放到一个行结构中。当数据用完或发生错误时返回
NULL。
void mysql_data_seek(MYSQL_RES *result , my_ulonglong offset);
这个函数用来在结果集中进行跳转,设置将会被下一个mysql_fetch_row操作返回的行。参数offset的值是一个行号,它必须在
0到结果集总行数减1的范围内、MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
这个函数返回一个偏移值,它用来表示结果集中的当前位置。它不是一个行号,你不能把它用于mysql_data_seek
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result , MYSQL_ROW_OFFSET offset);
这将在结果集中移动当前位置,并返回之前的位置。
一次提取一行数据
MYSQL _RES *mysql_use_result(MYSQL *connection);
为了逐行提取数据,我们将要使用mysql_use_result而不是mysql_store_result
MYSQL_RES *mysql_use_result(MYSQL *connection);
mysql_field_count函数提供了一些关于查询结果的基本信息,它接受连接对象,并返回结果集中的字段(列)数目
unsigned int mysql_field_count(MYSQL *conneciton);
- #include <stdlib.h>
- #include <stdio.h>
-
- #include "mysql.h"
-
- MYSQL my_connection;
- MYSQL_RES *res_ptr;
- MYSQL_ROW sqlrow;
-
- void display_row();
-
- int main(int argc, char *argv[]) {
- int res;
-
- mysql_init(&my_connection);
- if (mysql_real_connect(&my_connection, "localhost", "rick",
- "secret", "foo", 0, NULL, 0)) {
- printf("Connection success\n");
-
- res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");
-
- if (res) {
- printf("SELECT error: %s\n", mysql_error(&my_connection));
- } else {
- res_ptr = mysql_use_result(&my_connection);
- if (res_ptr) {
- while ((sqlrow = mysql_fetch_row(res_ptr))) {
- printf("Fetched data...\n");
- display_row();
- }
- if (mysql_errno(&my_connection)) {
- printf("Retrive error: %s\n", mysql_error(&my_connection));
- }
- mysql_free_result(res_ptr);
- }
- }
- mysql_close(&my_connection);
-
- } else {
- fprintf(stderr, "Connection failed\n");
- if (mysql_errno(&my_connection)) {
- fprintf(stderr, "Connection error %d: %s\n",
- mysql_errno(&my_connection), mysql_error(&my_connection));
- }
- }
-
- return EXIT_SUCCESS;
- }
-
- void display_row() {
- unsigned int field_count;
-
- field_count = 0;
- while (field_count < mysql_field_count(&my_connection)) {
- printf("%s ", sqlrow[field_count]);
- field_count++;
- }
- printf("\n");
- }