您的位置:首页 > 数据库 > MySQL

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

2016-05-25 15:51 375 查看
步骤:

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);
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息