利用mysql的c api,在vs2010中操作mysql

步骤:

1.     建立控制台程序


2.     如果安装的mysql上x64的,在项目的属性页面中要将平台由“win32”新建成“活动(x64)”.


3.     在项目的属性->vc++目录->包含目录->编辑:加入mysql安装目录下的include文件夹的绝对路径, 在项目的属性->vc++目录->库目录->编辑:加入mysql的安装目录下的lib文件夹的绝对路径;

 

 

4.  复制mysql安装目录下lib文件夹中的libmysql.dll,到项目文件夹中,与cpp文件同路径:



5.   在项目中的.cpp文件中include两个mysql的头文件(若进行网络编程,还须include<WinSock2.h>),并用宏命令引入libmysql动态库(作为项目的附加依赖项)

 

 

6.   到此接口部署全部完成,开始code

Example:

//#include<WinSock2.h>
#include<mysql.h>
#include<string>
#include<iostream>
usingnamespace std;
#pragmacomment(lib, "libmysql.lib")
 
intmain() {
MYSQL mysql;
//cout<<&mysql;
MYSQL_RES * res;
MYSQL_ROW row;
 
mysql_init(&mysql);
 
if(!mysql_real_connect(&mysql,"127.0.0.1", "root", "root", "discuz",3306, NULL, 0)) {
        cout<<"connect fail!\n";
        return 0;
} else
       cout<<"connectsucceed!\n";
 
string stmt = "SELECT * FROM user";
if(mysql_real_query(&mysql, stmt.data(),strlen(stmt.data()))) {
        cout<<"query fail!\n";
} else {
        cout<<"querysucceed!\n";
        res = mysql_store_result(&mysql);
        if (res != NULL) {
               cout<<"storesucceed!\n";
               while(row = mysql_fetch_row(res)){
                      /*MYSQL_FIELD field;
                      while(mysql_fetch_field(res)){
                             cout<<mysql_fetch_field(res)->name<<'\t';
                      }
                      cout<<endl;*/
                      for(int i = 0; i <mysql_num_fields(res); i++) {
                             cout<<row[i]<<'\t';
                      }
                      cout<<endl;
               }
               mysql_free_result(res);
        }
 
}
mysql_close(&mysql);
 
 
return 0;
}


 

 

附1:http://www.chinaz.com/program/2012/1221/286599.shtml

mysql的C API 的数据类型:(可以在Mysql提供的mysql.h头文件中查看)

MYSQL

连接数据库前,必须先创建MYSQL变量,此变量在很多Mysql API函数会用到。它包含了一些连接信息等数据。

MYSQL_RES

MYSQL_RES结构体中包含了查询结果集,也就是从数据库中查询到的数据。可以使用mysql_store_result或mysql_use_result函数获得。

MYSQL_ROW

MYSQL ROW的定义如下:

typedef char **MYSQL_ROW;

可见,它实际上是char **类型,指向一个字符串数组。可以通过mysql_fetch_row函数获得。

MYSQL_FIELD

MYSQL_FIELD中包含了字段名、字段类型和大小等信息。可以重复调用mysql_fetch_field函数获得所有字段的信息。

 

 

 

 

附2:mysql的C API 的主要函数

Mysql C API编程步骤

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

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

#include <mysql.h>

#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,constchar *user,const char *passwd,constchar *db,unsigned int port,constchar *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, unsignedlong 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_store_result函数将从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);

 

 

 

 

 

附3:http://www.cnblogs.com/sherlockhua/archive/2012/03/31/2426399.html

1.增加获取表中列名称的代码:

 while(field = mysql_fetch_field(result)) {

     printf("%s ", field->name);

 }

函数mysql_fetch_field返回一个MYSQL_FIELD结构,从结构中可以获取列的名称。编译后,程序输出如下:

$ ./headers

id name age

1  Tom  25

2  Elisabeth  32

3  Jane  22

4  Luke  28

 

2.插入图片到Mysql数据库

有人喜欢使用mysql来存储图片,而有的人喜欢把图片存储在文件系统中。而当我们要处理成千上万的图片时,会引起技术问题。图片时二进制数据,mysql有种特殊的数据类型,用来存储二进制数据,叫做BLOB(Binary Large Ojbect)。

mysql> describe images;

+-------+------------+------+-----+---------+-------+

| Field | Type       | Null | Key | Default | Extra |

+-------+------------+------+-----+---------+-------+

| id    | int(11)    | NO   | PRI |         |       |

| data  | mediumblob | YES  |     | NULL    |       |

+-------+------------+------+-----+---------+-------+

2 rows in set (0.00 sec)

这个是本节中我们要使用的表,创建语句如下:

create table images(id int not null primary key, data mediumblob);

以下是本例中所有程序代码:

#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
  MYSQL *conn;
  int len, size;
  char data[1000*1024];
  char chunk[2*1000*1024+1];
  char query[1024*5000];
  FILE *fp;
  conn = mysql_init(NULL);
  mysql_real_connect(conn,"localhost", "zetcode", "passwd","testdb", 0, NULL, 0);
 fp = fopen("image.png","rb");
  size = fread(data, 1, 1024*1000, fp);
  mysql_real_escape_string(conn, chunk,data, size);
  char *stat = "INSERT INTOimages(id, data) VALUES('1', '%s')";
  len = snprintf(query,sizeof(stat)+sizeof(chunk) , stat, chunk);
  mysql_real_query(conn, query, len);
  fclose(fp);
  mysql_close(conn);
}

在本例中,我们把一张图片存储到images表中。图片大小最大不超过1M。

首先我们,打开一个图片文件,并读取图片数据:

 fp = fopen("image.png", "rb");

 size = fread(data, 1, 1024*1000, fp);

二进制数据可以包含一些特殊的字符,这些在sql语句中可能会引起一些问题。所以必须进行转义,理论上来说,每个字符可能是特殊字符。所以chunk数组大小是data数组大小的两倍,该函数会在chunk数组加上结尾符。

 mysql_real_escape_string(conn, chunk, data, size);

一下两行代码拼接insert所用的sql语句:

 char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";

 len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);

最后,执行sql语句:

mysql_real_query(conn, query, len);

3.从Mysql数据库取回图片

在上一节中,我们把图片保存到数据库中,本节我们把图片从数据库中取回并且还原为图片,本节示例代码如下:

#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
  MYSQL *conn;
  MYSQL_RES *result;
  MYSQL_ROW row;
  unsigned long *lengths;
  FILE *fp;
  conn = mysql_init(NULL);
  mysql_real_connect(conn,"localhost", "zetcode", "passwd","testdb", 0, NULL, 0);
  fp = fopen("image.png", "wb");
  mysql_query(conn, "SELECT dataFROM images WHERE id=1");
  result = mysql_store_result(conn);
  row = mysql_fetch_row(result);
  lengths = mysql_fetch_lengths(result);
  fwrite(row[0], lengths[0], 1, fp);
  mysql_free_result(result);
  fclose(fp);
  mysql_close(conn);
}

首先,我们创建一个文件用来保存图片:

fp = fopen("image.png", "wb");

然后,我们把之前的图片查询出来:

 mysql_query(conn, "SELECT data FROM images WHERE id=1");

之后,得到图片数据和数据长度:

row = mysql_fetch_row(result);

lengths = mysql_fetch_lengths(result);

最后,使用fwrite把图片保存到文件中:

fwrite(row[0], lengths[0], 1, fp);

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值