ca88会员登录中心用C语言操作MySQL数据库

ca88会员登录中心

先看结构体

一、MySQL For Windows安装:

先转一个

----------------------------------------------

1. 下载:

//Test1.c:

 以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接.

上官网下载即可:

#include <stdio.h>
#include <mysql.h>

typedef struct st_mysql {

 NET           net;            /* Communication parameters */

 gptr          connector_fd;   /* ConnectorFd for SSL */

 char          *host,*user,*passwd,*unix_socket,

                *server_version,*host_info,*info,*db;

 unsigned int port,client_flag,server_capabilities;

 unsigned int protocol_version;

 unsigned int field_count;

 unsigned int server_status;

 unsigned long thread_id;      /* Id for connection in server */

 my_ulonglong affected_rows;

 my_ulonglong insert_id;       /* id if insert on table with NEXTNR */

 my_ulonglong extra_info;              /* Used by mysqlshow */

 unsigned long packet_length;

 enum mysql_status status;

 MYSQL_FIELD   *fields;

 MEM_ROOT      field_alloc;

 my_bool       free_me;        /* If free in mysql_close */

 my_bool       reconnect;      /* set to 1 if automatic reconnect */

 struct st_mysql_options options;

 char          scramble_buff[9];

 struct charset_info_st *charset;

 unsigned int server_language;

} MYSQL;

http://www.mysql.com/downloads/

int main(int argc, char *argv[])
{
 int i;
 char *names[3];
 names[0] = “haha”;
 names[1] = “xixi”;
 names[2] = “wuwu”;

这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE,
EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的朋友应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。

2. 安装:

 char execsql[1024];

typedef struct st_mysql_res {

 my_ulonglong row_count;

 unsigned int field_count, current_field;

 MYSQL_FIELD   *fields;

 MYSQL_DATA    *data;

 MYSQL_ROWS    *data_cursor;

 MEM_ROOT      field_alloc;

 MYSQL_ROW     row;            /* If unbuffered read */

 MYSQL_ROW     current_row;    /* buffer to current row */

 unsigned long *lengths;       /* column lengths of current row */

 MYSQL         *handle;        /* for unbuffered reads */

 my_bool       eof;            /* Used my mysql_fetch_row */

} MYSQL_RES;

没有什么好说的,傻瓜式,也没有什么要注意的。

 MYSQL mysql_conn;

 

3. 配置:

 if(mysql_init(&mysql_conn) != NULL){
  if(mysql_real_connect(&mysql_conn, “localhost”, “root”, “xiaodan”,
“test”, MYSQL_PORT, NULL, 0) != NULL)
  {
   printf(“Good connection!\n”);
   sprintf(execsql, “create database one_db”);
   mysql_real_query(&mysql_conn, execsql, strlen(execsql));

----------------------------------------------

添加系统变量MYSQL_HOME和修改PATH,目的就是让系统默认能够找到MySQL命令。(安装目录的/bin下面)

//   if (!mysql_create_db(&mysql_conn, “one_db”)){
   i = mysql_affected_rows(&mysql_conn);
   if (i<=0){
    printf(“Can not create database one_db \n”);
   }
   else{
    mysql_select_db(&mysql_conn, “one_db”);
    sprintf(execsql, “create table girls(name char(10), age int(8))”);
    mysql_real_query(&mysql_conn, execsql, strlen(execsql));
    mysql_select_db(&mysql_conn, “one_db”);
    for(i=0; i<3; i++){
     sprintf(execsql,”insert into girls values(‘%s’, %d)”, names[i],
19+i);
     printf(“%s \n”, execsql);
     mysql_query(&mysql_conn, execsql);
    }
   }
  }else{
   printf(“Connection Failed!\n”);
  }
 }else{
  printf(“Initialization Failed.\n”);
  return -1;
 }

再看函数:

PS:

 mysql_close(&mysql_conn);
 return 0;
}

 

补充一下,有的朋友可能下载的是免安装版本,拷贝到一个地方就可以了,这个时候,配置还是需要的,但是配置完成之后,需要手动安装MySQL服务。因为我们是想既要搭建MySQL服务器端,又要搭建MySQL客户端,服务器端是需要开启服务的,所以需要手动安装并启动mysql服务。还有就是要注意,网上的一些WAMP集成安装包,只包含了SQL
web有关的工具,是不全的,需要安装200多M的那个版本。

编译命令:gcc -g -o test1   -I/usr/include/mysql test1.c
-L/usr/lib/mysql -lmysqlclient -lz

C语言操作mysql数据 常用函数

相关的几个命令如下:

//Test2.c

所需头文件: #include <mysql/mysql.h>
功能:  获得或初始化一个MYSQL结构
函数原型: MYSQL *mysql_init(MYSQL *mysql)
函数返回值: 一个被始化的MYSQL*句柄
备注:  在内存不足的情况下,返回NULL

mysqld -install //安装mysql服务

#include <stdio.h>

所需头文件: #include <mysql/mysql.h>
函数功能: 关闭一个服务器连接,并释放与连接相关的内存
函数原型: void mysql_close(MYSQL *mysql);
函数传入值: MYSQL:类型的指针
函数返回值: 无

mysqld -remove  //卸载mysql服务

//#include <dmalloc.h>

所需头文件: #include <mysql/mysql.h>
函数功能: 连接一个MySQL服务器
函数原型: MYSQL * mysql_connect(MYSQL *mysql,const char *host,const
char *user,const char *passwd);
函数传入值: mysql表示一个现存mysql结构的地址
  host表示MYSQL服务器的主机名或IP
  user表示登录的用户名
  passwd表示登录的密码
函数返回值: 如果连接成功,一个MYSQL *连接句柄:如果连接失败,NULL
备注:  该函数不推荐,使用mysql_real_connect()代替

net start mysql  //启动mysql服务

#include <mysql.h>

所需文件: #include <mysql/mysql.h>
函数功能: 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 int client_flag);
函数传入值: mysql表示一个现存mysql结构的地址
  host表示MYSQL服务器的主机名或IP
  user表示登录的用户名
  passwd表示登录的密码
  db表示要连接的数据库
  port表示MySQL服务器的TCP/IP端口
  unix_socket表示连接类型
  client_flag表示MySQL运行ODBC数据库的标记
函数返回值: 如果连接成功,一个MYSQL*连接句柄:如果连接失败,NULL

net stop mysql  //停止mysql服务

int main(int argc, char **argv) {

所需头文件: #include <mysql/mysql.h>
函数功能: 返回最新的UPDATE,DELETE或INSERT查询影响的行数
函数传入值: MYSQL:类型指针
函数返回值: 大于零的一个整数表示受到影响或检索出来的行数。零表示没有区配查序中WHERE子句的记录或目前还没有查询被执行;-1表示查询返回一个错误,或对于一个SELECT查询

mysqladmin -version //查看mysql服务是否安装成功

    MYSQL mysql_conn; /* Connection handle */

所需头文件: #include <mysql/mysql.h>
函数功能: 对指定的连接执行查询
函数原型: int mysql_query(MYSQL *mysql,const char *query);
函数传入值: query表示执行的SQL语句
函数返回值: 如果查询成功,为零,出错为非零。
相关函数: mysql_real_query

也可以通过Windows的服务工具来配置MySQL。

    MYSQL_RES *mysql_result; /* Result handle */

所需头文件: #include <mysql/mysql.h>
函数功能: 为无缓冲的结果集获得结果标识符
函数原形: MYSQL_RES *mysql_use_result(MYSQL *mysql);
函数传入值: MYSQL:类型的指针
函数返回值: 一个MYSQL_RES结果结构,如果发生一个错误发NULL

二、MySQL基础:

    MYSQL_ROW mysql_row; /* Row data */

#incluee <mysql/mysql.h>
检索一个结果集合的下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
MYSQL_RES:结构的指针
下一行的一个MYSQL_ROW结构。如果没有更多的行可检索或如果出现一个错误,NULL

1. 连接MySQL:

    int f1, f2, num_row, num_col;

#include <mysql/mysql.h>
返回指定结果集中列的数量
unsigned int mysql_num_fields(MYSQL_RES *res);
MYSQL_RES 结构的指针
结果集合中字段数量的一个无符号整数

首先再明确一个概念,现在我们是在学习如何使用MySQL,我们的MySQL服务器端是安装在本机上,MySQL客户端也是安装在本机上的。我们登录MySQL就是通过CMD命令行工具,用客户端命令mysql登录到本机MySQL服务器端,本机开启的服务是MySQL,进程是mysql.exe。

    if (mysql_init(&mysql_conn) != NULL) {

#include <mysql/mysql.h>
创建一个数据库
int mysql_create_db(MYSQL *mysql,const char *db);
MYSQL:类型的指针
db:要创建的数据库名
如果数据库成功地被创建,返回零,如果发生错误,为非零。

安装完成之后,默认的Host和User是:

        if (mysql_real_connect(&mysql_conn, “localhost”, “root”,
“xiaodan”, “one_db”, MYSQL_PORT, NULL, 0) != NULL) {

#include <mysql/mysql.h>
选择一个数据库
int mysql_select_db(MYSQL *mysql,const char *db);
MYSQL:类型的指针
db:要创建的数据库名
如果数据库成功地被创建,返回零,如果发生错误,为非零。

其中密码都为空。

            if (mysql_query(&mysql_conn, “select * from girls”) == 0)
{

 

我们有两种方式连接mysql服务器,不指定Host/User/Password默认就是按照localhost匿名用户的方式连接。

    /*  以上我们执行select语句,查询表中所以记录*/

----------------------------------------------

退出的mysql服务器使用命令exit或者quit。

                mysql_result = mysql_store_result(&mysql_conn); //
get the result from the executing select query

再看例子:

mysql //localhost+匿名方式登录

                num_row = mysql_num_rows(mysql_result); /* Get the
no. of row */

     
很多人用到MySQL来开发一些项目,有时为了性能,我们会直接用C语言来开发相关的模块,尤其在我们的web应用中,虽然PHP、JSP等脚本均
提供了MySQL的接口,但是显然直接使用C语言具有更好的安全性和性能,Michael以前用PHP开发的多个项目中就使用了C语言编写的这类接口,然
后再编译到php里面,供php脚本直接使用,这方面的话题就不多说了,下面主要说一下在Linux下如何用C语言连接MySQL数据库,并且读取里面的
数据返回,同时如何进行编译。

mysql -u root -p //localhost+root+password方式登录

                num_col = mysql_num_fields(mysql_result); /* Get
the no. of column */

  这里的大部分代码参考了MySQL发行包里面的.c源文件,大家也可以去里面找找相关的代码,下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。

exit //退出mysql服务器

                for (f1 = 0; f1 < num_row; f1++) {

#if defined(_WIN32) ||
defined(_WIN64) //为了支持Windows平台上的编译
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include “mysql.h”  //我的机器上该文件在/usr/local/include/mysql下
 
//定义数据库操作的宏,也可以不定义留着后面直接写进代码
#define SELECT_QUERY “select username from tbb_user where userid =
%d”
 
int main(int argc, char **argv) //char **argv 相当于 char
*argv[]
{
    MYSQL mysql,*sock;   
//定义数据库连接的句柄,它被用于几乎所有的MySQL函数
    MYSQL_RES *res;       //查询结果集,结构类型
    MYSQL_FIELD *fd ;     //包含字段信息的结构
    MYSQL_ROW row ;       //存放一行查询结果的字符串数组
    char qbuf[160];      //存放查询sql语句字符串
    
    if (argc != 2) { //检查输入参数
        fprintf(stderr,”usage : mysql_select <userid>\n\n”);
        exit(1);
    }
    
    mysql_init(&mysql);
    if (!(sock =
mysql_real_connect(&mysql,”localhost”,”dbuser”,”dbpwd”,”9tmd_bbs_utf8″,0,NULL,0)))
{
        fprintf(stderr,”Couldn’t connect to
engine!\n%s\n\n”,mysql_error(&mysql));
        perror(“”);
        exit(1);
    }
    
    sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
    if(mysql_query(sock,qbuf)) {
        fprintf(stderr,”Query failed (%s)\n”,mysql_error(sock));
        exit(1);
    }
    
    if (!(res=mysql_store_result(sock))) {
        fprintf(stderr,”Couldn’t get result from %s\n”,
mysql_error(sock));
        exit(1);
    }
    
    printf(“number of fields returned:
%d\n”,mysql_num_fields(res));
        
    while (row = mysql_fetch_row(res)) {
        printf(“Ther userid #%d ‘s username is: %s\n”,
atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? “NULL” :
row[0])) ;
        puts( “query ok !\n” ) ;
    }
    
    mysql_free_result(res);
    mysql_close(sock);
    exit(0);
    return 0;   //. 为了兼容大部分的编译器加入此行
}

2. 修改mysql服务器用户密码:

//                  for (f2 = 0; f2 < num_col; f2++) {

编译的时候,使用下面的命令

mysqladmin -u root -p password //中间提示输入当前密码一次,新密码两次

                        mysql_row = mysql_fetch_row(mysql_result);
/* Fetch one by one */

gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql
-L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm)
后面两个选项可选,根据您的环境情况

3. MySQL基础语法:

                        printf(“[Row %d, Col 0] ==> [%s]\n”, f1,
mysql_row[0]);
   printf(“[Row %d, Col 1] ==> [%s]\n”, f1, mysql_row[1]);

运行的时候,执行下面的命令

1.创建数据库,名字为RUNOOB

//                  }

./mysql_select 1

mysqladmin -u root -p create RUNOOB

                }

将返回如下结果:

2.删除数据库,名字为RUNOOB

            } else {

number of fields returned: 1
Ther userid #1 ‘s username is: Michael
query ok !

mysqladmin -u root -p drop RUNOOB

                (void) printf(“Query fails\n”);

上面的代码我想大部分都能看明白,不明白的可以参考一下MySQL提供的有关C语言API部分文档,各个函数都有详细说明,有时间我整理一份常用的API说明出来。

3.显示数据库:

            }

 

mysql> show databases; //注意后面要加;号,表示一条mysql语句结束

        } else {


4.选择数据库:

            (void) printf(“Connection fails\n”);

mysql> use RUNOOB;

        }

5.数据类型:

    } else {

        (void) printf(“Initialization fails\n”);

6.显示当前数据库下的数据表:

    }

mysql> show tables;

    mysql_free_result(mysql_result);

7.创建数据表:

    mysql_close(&mysql_conn);

mysql>CREATE TABLE runoob_tbl(->runoob_id
INTNOTNULLAUTO_INCREMENT,->runoob_title
VARCHAR(100)NOTNULL,->runoob_author
VARCHAR(40)NOTNULL,->submission_dateDATE,->PRIMARY KEY (
runoob_id )->);

    return 0;

1

}

2

编译命令:gcc -g -o test2   -I/usr/include/mysql test2.c
-L/usr/lib/mysql -lmysqlclient -lz

3

注意:使用rpm包安装的数据库没有用于开发的头文件和库,需要下载MySQL-devel的rpm开发包

4

 

5

 下面的是我自己写的一个

6

 

7

/*
*
*file name: mysql.c
*
*/
#include <stdio.h>
#include <stdlib.h>
#include “mysql.h”  

1

int main(void)
{
  const char *host = “localhost”;
  const char *user = “root”;
  const char *pass = “”;
  const char *db   = “mysql”;
 /* 定义mysql变量 */
     MYSQL mysql;
     MYSQL_RES *rs;
     MYSQL_ROW row;
     mysql_init(&mysql); /* 初始化 */
/* 连接数据库 */
if (!mysql_real_connect(&mysql, host, user, pass, db, 0, NULL, 0))
 { 
          printf(“%s”, mysql_error(&mysql));
       
 }
  char *sql = “select host,user from user order by rand()”;
  if (mysql_query(&mysql, sql)!=0) 
  { /* 查询 */
          printf( “%s”, mysql_errno(&mysql), mysql_error(&mysql));
         
   }
   rs = mysql_store_result(&mysql); /* 获取查询结果 */
   while ((row = mysql_fetch_row(rs))) 
   {      /* 获取每一行记录 */
          printf( “%s—%s”, row[0], row[1]);
   }
   mysql_free_result(rs); /* 释放结果集 */
   mysql_close(&mysql); /* 关闭连接 */
   return 1;
}

2

编译:$gcc -g -o mysql   -I/usr/local/mysql/include/mysql mysql.c
-L/usr/locla/mysql/lib/mysql -lmysqlclient -lz
如果运行的时候报libmysqlclient.so.16 找不到错误,运行下面命令。
$ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16
/lib/libmysqlclient.so.16

3

如果运行程序:

4

 $gcc -g -o mysql   -I/usr/local/mysql/include/mysql mysql.c
-L/usr/locla/mysql/lib/mysql -lmysqlclient -lz 会在当前目录生成
mysql文件

5

./mysql运行

6

或者

7

/path-to -mysql/mysql

8.删除数据表:

 

mysql> DROP TABLE runoob_tbl

9.插入数据:

mysql> INSERT INTO runoob_tbl    ->(runoob_title,
runoob_author, submission_date)->VALUES->(“Learn PHP”,”John
Poul”,NOW());

1

2

3

4

1

2

3

4

10.查询数据表中的数据:

SELECT * from runoob_tbl

11.Show有关的语法:

SHOWDATABASES;//列出 MySQL Server上的数据库SHOWTABLES
[FROMdb_name];//列出数据库中的表SHOWTABLESTATUS
[FROMdb_name];//列出数据库的表信息,比较详细SHOWCOLUMNSFROMtbl_name
[FROMdb_name];//列出表的列信息,同SHOWFIELDSFROMtbl_name
[FROMdb_name],DESCRIBEtbl_name
[col_name]SHOWFULLCOLUMNSFROMtbl_name
[FROMdb_name];//列出表的列信息,比较详细,同SHOWFULLFIELDSFROMtbl_name
[ca88会员登录中心,FROMdb_name]SHOWINDEXFROMtbl_name
[FROMdb_name];//列出表的索引信息SHOWSTATUS;//列出 Server
的状态信息SHOWVARIABLES;//列出 MySQL
系参数值SHOWPROCESSLIST;//查看当前mysql查询进程SHOWGRANTSFORuser;//列出用户的授权命令

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

12.where子句:

mysql> SELECT * from runoob_tbl WHERE runoob_author=’Sanjay’;
//查询某一个符合条件的表项

13.update查询:

//查询并修改表中的一项,最后更新表格mysql>UPDATE
runoob_tbl->SETrunoob_title=’Learning JAVA’->WHERErunoob_id=3;

1

2

3

4

1

2

3

4

14.delete语句:

mysql> DELETE FROM runoob_tbl WHERE runoob_id=3; //删除表中的某一项

15.ALTER命令:

mysql> ALTERTABLEtestalter_tbl  DROP i;//删除以上表的 i
字段mysql> ALTERTABLEtestalter_tbl ADD i INT;//在表 testalter_tbl
中添加 i 字段,并定义数据类型mysql> ALTERTABLEtestalter_tbl MODIFY c
CHAR(10);//把字段 c 的类型从 CHAR(1) 改为 CHAR(10)mysql>
ALTERTABLEtestalter_tbl    -> MODIFY j BIGINT NOT NULL
DEFAULT100;//指定字段 j 为 NOT NULL 且默认值为100mysql>
ALTERTABLEtestalter_tbl ALTER iSETDEFAULT1000;//使用 ALTER
来修改字段的默认值mysql> ALTERTABLEtestalter_tbl ALTER i DROP
DEFAULT;//使用 ALTER 命令及 DROP子句来删除字段的默认值mysql>
ALTERTABLEtestalter_tbl RENAMETOalter_tbl;//修改表名

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

16.正则表达式:

正则表达式是通用的,和C、Linuxshell一样的。

mysql>SELECTnameFROMperson_tblWHEREname
REGEXP’^st’;//查找name字段中以’st’为开头的所有数据mysql>SELECTnameFROMperson_tblWHEREname
REGEXP’ok$’;//查找name字段中以’ok’为结尾的所有数据mysql>SELECTnameFROMperson_tblWHEREname
REGEXP’mar’;//查找name字段中包含’mar’字符串的所有数据mysql>SELECTnameFROMperson_tblWHEREname
REGEXP’^[aeiou]|ok$’;//查找name字段中以元音字符开头且以’ok’字符串结尾的所有数据

1

2

3

4

1

2

3

4

4. MySQL键和索引的概念:

http://www.runoob.com/mysql/mysql-index.html

http://blog.csdn.net/duck\_arrow/article/details/8264686

http://www.jb51.net/article/34037.htm

三、MySQL C API编程:

实质就是C语言调用libmysql.lib库,使用其提供的的函数来连接,访问,修改MySQL数据库中的内容。

1. MYSQL结构体:

这个结构主要用于连接,保存一些连接的信息。

typedefstructst_mysql { NET          net;/* Communication parameters
*/gptr          connector_fd;/* ConnectorFd for SSL
*/char*host,*user,*passwd,*unix_socket,               
*server_version,*host_info,*info,*db;unsignedintport,client_flag,server_capabilities;unsignedintprotocol_version;unsignedintfield_count;unsignedintserver_status;unsignedlongthread_id;/*
Id for connection in server */my_ulonglong affected_rows;
my_ulonglong insert_id;/* id if insert on table with NEXTNR
*/my_ulonglong extra_info;/* Used by mysqlshow
*/unsignedlongpacket_length;enummysql_status status; MYSQL_FIELD 
*fields; MEM_ROOT      field_alloc; my_bool      free_me;/* If
free in mysql_close */my_bool      reconnect;/* set to 1 if
automatic reconnect */structst_mysql_options
options;charscramble_buff[9];structcharset_info_st
*charset;unsignedintserver_language;} MYSQL;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

2. MYSQL_RES结构体:

这个结构主要是返回一些操作数据库(SELECT, SHOW, DESCRIBE,
EXPLAIN等)的结果,即“数据集”。

typedefstructst_mysql_res { my_ulonglong
row_count;unsignedintfield_count, current_field; MYSQL_FIELD 
*fields; MYSQL_DATA    *data; MYSQL_ROWS    *data_cursor;
MEM_ROOT      field_alloc; MYSQL_ROW    row;/* If unbuffered read
*/MYSQL_ROW    current_row;/* buffer to current row
*/unsignedlong*lengths;/* column lengths of current row */MYSQL     
  *handle;/* for unbuffered reads */my_bool      eof;/* Used my
mysql_fetch_row */} MYSQL_RES;

1

2

3

4

5

6

7

8

9

10

11

12

13

1

2

3

4

5

6

7

8

9

10

11

12

13

3. MySQL C API编程步骤:

具体有哪些函数,可以到网上搜索一下相关介绍,这里讲一下编程步骤:

(1)、首先我们要包含mysql的头文件,并链接mysql动态库。即添加以下语句:

#include       // 进行网络编程需要winsock2.h

#include

#pragma comment(lib, “libmysql.lib”)

(2)、创建MYSQL变量。如:

MYSQL mysql;

(3)、初始化MYSQL变量。

mysql_init(&mysql);

(4)、调用mysql_real_connect函数连接Mysql数据库。mysql_real_connect函数的原型如下:

MYSQL *  STDCALL 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 clientflag);

参数说明:mysql–前面定义的MYSQL变量;host–MYSQL服务器的地址;user–登录用户名;passwd–登录密码;db–要连接的数据库;port–MYSQL服务器的TCP服务端口;unix_socket–unix连接方式,为NULL时表示不使用socket或管道机制;clientflag–Mysql运行为ODBC数据库的标记,一般取0。

连接失败时该函数返回0。

(5)、调用mysql_real_query函数进行数据库查询。mysql_real_query函数的原型如下:

int  STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned
long length);

参数说明:mysql–前面定义的MYSQL变量;q–SQL查询语句;length–查询语句的长度。

查询成功则该函数返回0。

(6)、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。

两个函数的原型分别为:

MYSQL_RES *    STDCALL mysql_store_result(MYSQL *mysql);

MYSQL_RES *    STDCALL mysql_use_result(MYSQL *mysql);

这两个函数分别代表了获取查询结果的两种方式。第一种,调用端,然后读取;第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。

(7)、调用mysql_fetch_row函数读取结果集数据。

上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

参数result就是mysql_store_result或mysql_use_result的返回值。

该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。

(8)、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。mysql_free_result函数的原型如下:

void  STDCALL mysql_free_result(MYSQL_RES *result);

(9)、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。mysql_close函数的原型为:

void STDCALL mysql_close(MYSQL *sock);

4. MySQL C API编程例子:

#if defined(_WIN32) ||
defined(_WIN64)//为了支持windows平台上的编译#include #endif#include
#include #include
“mysql.h”//我的机器上该文件在/usr/local/include/mysql下//定义数据库操作的宏,也可以不定义留着后面直接写进代码#define
SELECT_QUERY “select username from tbb_user where userid =
%d”intmain(intargc,char**argv)//char **argv 相当于 char *argv[]{ 
  MYSQL
mysql,*sock;//定义数据库连接的句柄,它被用于几乎所有的MySQL函数MYSQL_RES
*res;//查询结果集,结构类型MYSQL_FIELD *fd
;//包含字段信息的结构MYSQL_ROW row
;//存放一行查询结果的字符串数组charqbuf[160];//存放查询sql语句字符串if(argc
!=2) {//检查输入参数fprintf(stderr,”usage : mysql_select
\n\n”);exit(1);    }    mysql_init(&mysql);if(!(sock =
mysql_real_connect(&mysql,”localhost”,”dbuser”,”dbpwd”,”9tmd_bbs_utf8″,0,NULL,0)))
{fprintf(stderr,”Couldn’t connect to
engine!\n%s\n\n”,mysql_error(&mysql));        perror(“”);exit(1);   
}sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));if(mysql_query(sock,qbuf))
{fprintf(stderr,”Query failed (%s)\n”,mysql_error(sock));exit(1);   
}if(!(res=mysql_store_result(sock))) {fprintf(stderr,”Couldn’t get
result from %s\n”, mysql_error(sock));exit(1);    }printf(“number of
fields returned: %d\n”,mysql_num_fields(res));while(row =
mysql_fetch_row(res)) {printf(“Ther userid #%d ‘s username is:
%s\n”, atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0])))
?”NULL”: row[0])) ;puts(“query ok !\n”) ;    }   
mysql_free_result(res);    mysql_close(sock);exit(0);return0;//.
为了兼容大部分的编译器加入此行}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

最后看一个例子,另一个网友VS2015 C连接MySQL的实现:

VS2015连接mySQL数据库

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图