当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:51:00  来源:本站整理

在MySQL数据库中利用C履行SQL语句[MySQL防范]

赞助商链接



  本文“在MySQL数据库中利用C履行SQL语句[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
与PostgreSQL类似,可以利用很多差别的语言来拜候MySQL,包含C、C++、Java和Perl.从下列章节中,Neil Matthew和Richard Stones利用细致的MySQL C接口向我们介绍了如安在MySQL数据库中履行SQL语句.他们将谈论返回数据的语句,比方INSERT以及不返回数据的语句,比方UPDATE和 DELETE.然后,他们将编写从数据库检索数据的简单程序.

履行SQL语句

目前,我们已经有了一个衔接,并且知道若何处理错误,是时刻谈论利用我们的数据库来作一些实际工作了.履行全部范例的SQL的主关键字是mysql_query:


int mysql_query(MYSQL *connection, const char *query)


正如您所见,它非常简单.它取一个指向衔接构造的指针和包含要履行的SQL的文本字符串;与号令行工具差别,将不利用完毕分号.成功之后,返回0.在需求包含二进制数据的特别情形下,可以利用相关的函数,mysql_real_query.固然出于本章的目的,我们仅需求谈论mysql_query.

不返回数据的SQL语句

我们将先谈论UPDATE、DELETE和INSERT语句.因为它们不返回数据,所以更易于利用.

这里我们将介绍的另一个重要函数是查抄受影响的行数的函数:


my_ulonglong mysql_affected_rows(MYSQL *connection);


大概关于这一函数的最显而易见的事就是其非同平常的返回后果.由于可移植性缘由,这是一个特别的无标记范例.为了在printf中利用,倡议将其强迫转换成利用%lu格局标准的无标记长整数.这个函数返回受从前的UPDATE、INSERT或DELETE查询影响的行数,这些查询是利用 mysql_query履行的.

普通关于mysql_函数,返回码0表示没有行受影响;正数表示实际后果,普通是受影响的行数.

如前所述,当利用mysql_affected_rows时大概呈现未盼望的后果.让我们先谈论受INSERT语句影响的行数,它将按预期举行操作.将下列代码增添到程序 connect2.c 中,并且称其为insert1.c:


#include 
#include 
#include "mysql.h"
int main(int argc, char *argv[]) {
MYSQL my_connection;

int res;

mysql_init(&my_connection); 
if (mysql_real_connect(&my_connection, "localhost", 
    "rick", "bar", "rick", 0, NULL, 0)) {
    printf("Connection success\n");

   res = mysql_query(&my_connection, 
         "INSERT INTO children(fname,age),
          VALUES('Ann',3)");
   if (!res) {
              printf("Inserted %lu rows\n", 
              (unsigned long)mysql_affected_rows(&my_connection));
            } else {
              fprintf(stderr, "Insert error %d: s\n",mysql_errno ,
              (&my_connection),
              mysql_error(&my_connection));
             }
    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;
    }


正如预期,插入的行数为1.

目前,我们更改代码,所以 'insert' 部份被替换成:


 mysql_errno(&my_connection), mysql_error(&my_connection));
         }
      }

      res = mysql_query(&my_connection, "UPDATE children SET AGE = 4 
     
WHERE fname = 'Ann'");

      if (!res) {
         printf("Updated %lu rows\n", 
                          
(unsigned long)mysql_affected_rows(&my_connection));
      } else {
        
fprintf(stderr, "Update error %d: %s\n",
mysql_errno(&my_connection),                                                  
mysql_error(&my_connection));
      }


目前假定子表中有的数据,以下:

childno fname age
1

2

3

4

5

6

7

8

9

10

11

Jenny

Andrew

Gavin

Duncan

Emma

Alex

Adrian

Ann

Ann

Ann

Ann

14

10

4

2

0

11

5

3

4

3

4



假如我们履行update1,但愿报告的受影响行数为4,但是实际上程序报告2,因为它仅必须更改2行,固然WHERE子句标识了4行.假如想让 mysql_affected_rows报告的后果为4这大概是熟习别的数据库的人所盼望的),则需求记着将CLIENT_FOUND_ROWS标志传送到mysql_real_connect,在 update2.c中的程序以下:


if (mysql_real_connect(&my_connection, "localhost", 
                                 "rick", "bar", "rick", 0, NULL, CLIENT_FOUND_ROWS)) {



假如我们在数据库中复位数据,然后运行带有这种改正的程序,则它报告的行数为4.

函数mysql_affected_rows还有最后一个奇特之处,它发生在从数据库中删除数据时.假如利用WHERE子句,则 mysql_affected_rows将按预期返回删除行数.但是,假如没有WHERE子句,则删除全部行,报告受影响的行数却为0.这是因为由于效率缘由优化删除整个表.这种行为不受CLIENT_FOUND_ROWS选项标志的影响.

 返回数据的语句

目前是时刻谈论SQL的最广泛用法了,从数据库检索数据的SELECT语句.

MySQL 还支持返回后果的SHOW、DESCRIBE和EXPLAIN SQL语句,但是这里不考虑它们.按惯例,手册中包含这些语句的阐明.

您将会从PostgreSQL章记起,可以从PQexec中的SQL SELECT 语句检索数据,这里即刻获得全部数据,大概利用游标从数据库中逐行检索数据,以便搞定大数据.

由于完好相同的缘由,MySQL的检索办法几近完好相同,固然它实际上不用游标的情势描写逐行检索.但是,它供应了缩小这两种办法间差别的API,假如需求,它普通使两种办法的交换越发简单.

普通,从MySQL数据库中检索数占据4个阶段:

发出查询

检索数据

处理数据

履行所需的任何整理

象从前一样,我们利用mysql_query发出查询.数据检索是利用mysql_store_result或mysql_use_result完成的,这取决于想若何检索数据,随后利用mysql_fetch_row调用序列来处理数据.最后,必须调用mysql_free_result以答应 MySQL履行任何所需的整理.

全部当即数据检索的函数

可以从SELECT语句(或其他返回数据的语句)中检索完好部数据,在单一调用中,利用mysql_store_result:


MYSQL_RES *mysql_store_result(MYSQL *connection);


必须在mysql_query检索数据后才能调用这个函数,以在后果集合存储该数据.这个函数从服务器中检索全部数据并立行将它存储在客户机中.它返回一个指向从前我们从未碰到过的构造(后果集构造)的指针.假如语句失利,则返回NULL.

利用等价的PostgreSQL时,应当知道返回NULL意味着已经发生了错误,并且这与未检索到数据的情形差别.即便,返回值不是NULL,也不意味着当前有数据要处理.

假如未返回NULL,则可以调用mysql_num_rows并且检索实际返回的行数,它当然大概是0.


my_ulonglong mysql_num_rows(MYSQL_RES *result);


它从mysql_store_result获得返回的后果构造,并且在该后果集合返回行数,行数大概为0.假如mysql_store_result成功,则mysql_num_rows也老是成功的.

这种mysql_store_result和mysql_num_rows的组合是检索数据的一种简便并且直接的办法.一旦 mysql_store_result成功返回,则全部查询数据都已经存储在客户机上并且我们知道可以从后果构造中检索它,而不用耽忧会发生数据库或网络错误,因为关于程序全部数据都是本地的.还可以当即发现返回的行数,它可以使编码更简便.如前所述,它将全部后果当即地发送回客户机.关于大后果集,它大概耗费大量的服务器、网络和客户机资源.由于这些缘由,利用更大的数据集时,最好仅检索需求的数据.不久,我们将谈论若何利用 mysql_use_result函数来完成该操作.

一旦检索了数据,则可以利用mysql_fetch_row来检索它,并且利用mysql_data_seek、mysql_row_seek、mysql_row_tell操作后果集.在开始检索数据阶段之前,让我们先谈论一下这些函数.


MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);


这个函数采取从存储后果中获得的后果构造,并且从中检索单一行,在行构造中返回分配给您的数据.当没有更大都据大概发生错误时,返回NULL.稍后,我们将回来处理这一行中的数据.


void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);


这个函数答应您进入后果集,设置将由下一个获得操作返回的行.offset是行号,它必须在从0到后果集合的行数减 1 的范围内.传送0将招致在下一次调用mysql_fetch_row时返回第一行.


MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *result);


这个函数返回一个偏移值,它表示后果集合的当前位置.它不是行号,不能将它用于mysql_data_seek.但是,可将它用于:


MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);


它移动后果集合的当前位置,并返回从前的位置.

有时,这一对函数关于在后果集合的已知点之间跳转很有效.请注意,不要将row tell和row seek利用的偏移值与data_seek利用的行号混合.这些是不可交换的,后果将是您所但愿看到的.


void mysql_free_result(MYSQL_RES *result);


完成后果集时, 必须老是调用这个函数,以答应MySQL库整理分配给它的对象.

 检索数据

目前开始编写从数据库中检索数据的第一个程序.我们将挑选全部年纪大于5的行的内容.不幸的是我们还不知道若何处理这个数据,所以我们能做的只有循环检索它.这就是 select1.c:


      #include 
      #include 

      #include "mysql.h"

      MYSQL my_connection;
      MYSQL_RES *res_ptr;
      MYSQL_ROW sqlrow;

      int main(int argc, char *argv[]) {
         int res;

         mysql_init(&my_connection); 
         if (mysql_real_connect(&my_connection, "localhost", "rick", 
                                                 "bar", "rick", 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_store_result(&my_connection);
           if (res_ptr) {
           printf("Retrieved %luows\n",(unsignedlong)mysql_num_rows(res_ptr));
             while ((sqlrow = mysql_fetch_row(res_ptr))) {
               printf("Fetched data...\n");
             }
            if (mysql_errno(&my_connection)) {
            fprintf(stderr, "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;
       }


检索后果集并循环通过已检索的数据的重要部份都已突出显示.

一次检索一行数据

要按需求逐行检索数据,而不是当即获得全部数据并将它存储在客户机中,可以将mysql_store_result调用替换成 mysql_use_result:

MYSQL_RES *mysql_use_result(MYSQL *connection);


这个函数还获得一个衔接对象并返回后果结合指针,大概出错时返回NULL.与mysql_store_result类似,它返回指向后果集对象的指针;关键的差别点在于返回时,实际上没有将任何数据检索到后果集,只是初始化后果集以预备好检索数据.   以上是“在MySQL数据库中利用C履行SQL语句[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 在MySQL字段中利用逗号脱离符的办法分享
  • Prepared Statement在mysql下中文乱码办理
  • 在MySQL数据库中利用C履行SQL语句
  • 在MySQL数据库中履行SQL语句时的几个注意点
  • 在MySQL中存储图象的步骤
  • 新手入门:如安在MySQL数据库中定义外键
  • 教你如安在MySQL 5数据库中重置root密码
  • <b>教你如安在MySQL数据库中直接储存图片</b>
  • 教你在MySQL 5.0以上版本中配置主从库
  • 详析在mysql中躲藏空间
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .