> 数据库 > MySQL >

MySQL C 语言应用程序接口开发教程

从数据库中取回数据
在这个实例中我们从表中取回数据。
步骤:
(1)创建连接
(2)执行查询
(3)获取结果集
(4)提取所有可用的记录
(5)释放结果集实例程序打印 writers 表中所有的记录(姓名)。

[cpp] view plain copy
 
  1. #include <my_global.h>  
  2. #include <mysql.h>  
  3.    
  4. int main(int argc, char * argv[])  
  5. {  
  6.     MYSQL * conn;  
  7.     MYSQL_RES * result;  
  8.     MYSQL_ROW row;  
  9.     int num_fields;  
  10.     int i;  
  11.    
  12.     conn = mysql_init(NULL);  
  13.     mysql_real_connect(conn, "localhost""username""password""testdb", 0, NULL, 0);  
  14.    
  15.     mysql_query(conn, "SELECT * FROM writers");  
  16.     result = mysql_store_result(conn);  
  17.    
  18.     num_fields = mysql_num_fields(result);  
  19.    
  20.     while ((row = mysql_fetch_row(result)))  
  21.     {  
  22.         for (i=0; i<num_fields; i++)  
  23.           printf("%s ", row[i] ? row[i] : "NULL");  
  24.         printf("\n");  
  25.     }  
  26.    
  27.     mysql_free_result(result);  
  28.     mysql_close(conn);  
  29. }  

 

 

[cpp] view plain copy
 
  1. mysql_query(conn, "SELECT * FROM writers");  

执行查询将取回表 writers 中所有的记录。

[cpp] view plain copy
 
  1. result = mysql_store_result(conn);  

 

取得结果集。

 

[cpp] view plain copy
 
  1. num_fields = mysql_num_fields(result);  

 

获得表中的字段数量。

[cpp] view plain copy
 
  1. mysql_query(conn, "SELECT * FROM writers");while ((row = mysql_fetch_row(result)))  
  2. {  
  3.     for (i=0; i<num_fields; i++)  
  4.       printf("%s ", row[i] ? row[i] : "NULL");  
  5.     printf("\n");  
  6. }  


获取记录并打印到屏幕。

[cpp] view plain copy
 
  1. mysql_free_result(result);  

释放资源。

 

字段名称
这个实例里将要打印数据并显示字段名称。
为此我们创建一个新的表 friends。

[cpp] view plain copy
 
  1. mysql> CREATE TABLE friends (id int not null primary key auto_increment,name varchar(20), age int);  
[cpp] view plain copy
 
  1. mysql> insert into friends(name, age) values('Tom', 25);  
  2. mysql> insert into friends(name, age) values('Elisabeth', 32);  
  3. mysql> insert into friends(name, age) values('Jane', 22);  
  4. mysql> insert into friends(name, age) values('Luke', 28);  


插入一些数据到表中。

[cpp] view plain copy
 
  1. #include <my_global.h>  
  2. #include <mysql.h>  
  3.    
  4. int main(int argc, char * argv[])  
  5. {  
  6.     MYSQL * conn;  
  7.     MYSQL_RES * result;  
  8.     MYSQL_ROW row;  
  9.     MYSQL_FIELD * field;  
  10.    
  11.     int num_fields;  
  12.     int i;  
  13.    
  14.     conn = mysql_init(NULL);  
  15.     mysql_real_connect(conn, "localhost""username""password""testdb", 0, NULL, 0);  
  16.    
  17.     mysql_query(conn, "SELECT * FROM friends");  
  18.     result = mysql_store_result(conn);  
  19.    
  20.     num_fields = mysql_num_fields(result);  
  21.    
  22.     while ((row = mysql_fetch_row(result)))  
  23.     {  
  24.         for(i=0; i<num_fields; i++)  
  25.         {  
  26.             if (i == 0) {  
  27.                 while(field = mysql_fetch_field(result)) {  
  28.                     printf("%s ", field->name);  
  29.                 }  
  30.                 printf("\n");  
  31.             }  
  32.             printf("%s ", row[i] ? row[i] : "NULL");  
  33.         }  
  34.     }  
  35.     printf("\n");  
  36.    
  37.     mysql_free_result(result);  
  38.     mysql_close(conn);  
  39.    
  40.     return 0;  
  41. }  

 

这个实例和之前有一点差别,仅仅增加了字段名称。

mysql_fetch_field() 返回一个 MYSQL_FIELD 结构。我们从这个结构中得到名称(name)。

[cpp] view plain copy
 
  1. ./header  
  2. id name age  
  3. 1  Tom  25  
  4. 2  Elisabeth  32  
  5. 3  Jane  22  
  6. 4  Luke  28  


这是程序输出结果。

 

插件图片到 MySQL 数据库
一些用户喜欢将图片存入数据库,还有一些用户喜欢将图片存入本地文件系统。图片是二进制数据,MySQL 有专用的数据类型 BLOB(Binary Large Object) 以存储二进制数据。

[cpp] view plain copy
 
  1. mysql> describe images;  
  2. +-------+------------+------+-----+---------+-------+  
  3. | Field | Type       | Null | Key | Default | Extra |  
  4. +-------+------------+------+-----+---------+-------+  
  5. | id    | int(11)    | NO   | PRI |         |       |  
  6. | data  | mediumblob | YES  |     | NULL    |       |  
  7. +-------+------------+------+-----+---------+-------+  
  8. 2 rows in set (0.00 sec)  


这个表将在我们的实例中使用,通过下面的 SQL 语句可以创建它。

[cpp] view plain copy
 
  1. CREATE TABLE images(id int not null primary key, data mediumblob);  
[cpp] view plain copy
 
  1. #include <my_global.h>  
  2. #include <mysql.h>  
  3.    
  4. int main(int argc, char * argv[])  
  5. {  
  6.     MYSQL * conn;  
  7.    
  8.     int len, size;  
  9.     char data[1000*1024];  
  10.     char chunk[2*1000*1024+1];  
  11.     char query[1024*5000];  
  12.    
  13.     FILE * fp;  
  14.    
  15.     conn = mysql_init(NULL);  
  16.     mysql_real_connect(conn, "localhost""username""password""testdb", 0, NULL, 0);  
  17.    
  18.     fp = fopen("image.png""rb");  
  19.     size = fread(data, 1, 1024*1000, fp);  
  20.    
  21.     mysql_real_escape_string(conn, chunk, data, size);  
  22.    
  23.     char *stat = "INSERT INTO images(id, data) VALUES('1', '%s')";  
  24.     len = snprintf(query, sizeof(stat)+sizeof(chunk), stat, chunk);  
  25.    
  26.     mysql_real_query(conn, query, len);  
  27.    
  28.     fclose(fp);  
  29.    
  30.     mysql_close(conn);  
  31.    
  32.     return 0;  
  33. }  

在这个实例中,我们插入一张图片到表 images 中,图片最大可以是 1MB。

[cpp] view plain copy
 
  1. fp = fopen("images.png""rb");  
  2. size = fread(data, 1, 1024*1000, fp);  

这里打开图片并读入数据集。

[cpp] view plain copy
 
  1. mysql_real_escape_string(conn, chunk, data, size);  

二进制数据可以包含特殊字符,为了在 SQL 语句中不造成麻烦。我们必需避开它们。 mysql_real_escape_string() 函数将编码后的数据放入集合 chunk。这样,它们就可以是合法的语句了。这个函数还会在结尾增加一个 NULL 字符,这也是为什么集合 chunk 是集合 data两倍多一个字节。

[cpp] view plain copy
 
  1. char * stat = "INSERT INTO images(id, data) VALUES('1', '%s')";  
  2. len = snpritnf(query, sizeof(stat)+sizeof(chunk), stat, chunk);  

这两行代码准备查询语句。

[cpp] view plain copy
 
  1. mysql_real_query(conn, query, len);  

最后,我们执行语句。
从 MySQL 数据库中有选择的取出图片在上一个实例中,我们在数据库中插入了图片。在本实例中,我们将有选择的取出这些插入的图片。

[cpp] view plain copy
 
  1. #include <my_global.h>  
  2. #include <mysql.h>  
  3.    
  4. int main(int argc, char * argv[])  
  5. {  
  6.     MYSQL * conn;  
  7.     MYSQL_RES * result;  
  8.     MYSQL_ROW row;  
  9.    
  10.     unsigned long * lengths;  
  11.     FILE * fp;  
  12.    
  13.     conn = msyql_init(NULL);  
  14.     mysql_real_connect(conn, "localhost""username""password""testdb", 0, NULL, 0);  
  15.    
  16.     fp = fopen("image.png""wb");  
  17.    
  18.     mysql_query(conn, "SELECT data FROM images WHERE id=1");  
  19.     result = mysql_store_result(conn);  
  20.    
  21.     row = mysql_fetch_row(result);  
  22.     lengths = mysql_fetch_lengths(result);  
  23.    
  24.     fwrite(row[0], lengths[0], 1, fp);  
  25.     mysql_free_result(result);  
  26.    
  27.     fclose(fp);  
  28.     mysql_close(conn);  
  29.    
  30.     return 0;  
  31. }  

这个实例中我们将数据库中 ID 为 1 的图片创建为文件 image.png

[cpp] view plain copy
 
  1. <span style="color:#444444">fp = fopen("image.png""wb");//</span><span style="color:rgb(68,68,68); font-family:'Open Sans',Helvetica,Arial,sans-serif; font-size:14px; line-height:24px">以可写的方式打开一个文件。  
  2. </span><span style="color:rgb(68,68,68); font-family:'Open Sans',Helvetica,Arial,sans-serif">mysql_query(conn, "SELECT data FROM images WHERE id=1");//</span><span style="font-family:'Open Sans',Helvetica,Arial,sans-serif"><span style="color:#444444">选择 ID 为 1 的图片。  
  3. </span></span><span style="color:rgb(117,117,117); font-family:'Open Sans',Helvetica,Arial,sans-serif">row </span><span style="color:rgb(51,153,51); font-family:'Open Sans',Helvetica,Arial,sans-serif; margin:0px; padding:0px; border:0px; vertical-align:baseline">=</span><span style="color:rgb(117,117,117); font-family:'Open Sans',Helvetica,Arial,sans-serif"> mysql_fetch_row</span><span style="color:rgb(0,153,0); font-family:'Open Sans',Helvetica,Arial,sans-serif; margin:0px; padding:0px; border:0px; vertical-align:baseline">(</span><span style="color:rgb(117,117,117); font-family:'Open Sans',Helvetica,Arial,sans-serif">result</span><span style="color:rgb(0,153,0); font-family:'Open Sans',Helvetica,Arial,sans-serif; margin:0px; padding:0px; border:0px; vertical-align:baseline">)</span><span style="color:rgb(51,153,51); font-family:'Open Sans',Helvetica,Arial,sans-serif; margin:0px; padding:0px; border:0px; vertical-align:baseline">;//<span style="color:rgb(68,68,68)">row 包含了原始数据。  
  4. </span></span><pre class="c" style="font-size:14px; line-height:24px; color:rgb(117,117,117)" name="code">lengths <span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)">=</span> mysql_fetch_lengths<span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">(</span>result<span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">)</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)">;//<span style="color:rgb(68,68,68); font-family:'Open Sans',Helvetica,Arial,sans-serif">获取图片长度。  
  5. </span></span><pre class="c" style="color:rgb(117,117,117)" name="code"><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,0,102)">fwrite</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">(</span>row<span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">[</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,0,221)">0</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">]</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)">,</span> lengths<span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">[</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,0,221)">0</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">]</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)">,</span> <span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,0,221)">1</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)">,</span> fp<span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(0,153,0)">)</span><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)">;//<span style="color:rgb(68,68,68); font-family:'Open Sans',Helvetica,Arial,sans-serif">使用标准函数 fwrite() 将数据写入文件</span></span></pre></pre>  
[cpp] view plain copy
 
  1. <span style="color:rgb(68,68,68); font-family:'Open Sans',Helvetica,Arial,sans-serif; font-size:14px; line-height:24px"></span><pre class="c" style="color:rgb(117,117,117)" name="code"><span style="margin:0px; padding:0px; border:0px; vertical-align:baseline; color:rgb(51,153,51)"><span style="color:rgb(68,68,68); font-family:'Open Sans',Helvetica,Arial,sans-serif; font-size:14px; line-height:24px"></span></span><pre class="c" style="color:rgb(117,117,117)" name="code"></pre></pre>  

(责任编辑:IT)