在MySQL数据库中使用C执行SQL语句

2016-02-19 17:38 7 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享在MySQL数据库中使用C执行SQL语句,希望可以对大家能有小小的帮助。

【 tulaoshi.com - 编程语言 】

  与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 successn");res = mysql_query(&my_connection,"INSERT INTO children(fname,age),VALUES('Ann',3)");   if (!res){printf("Inserted %lu rowsn",(unsigned long)mysql_affected_rows(&my_connection));} else {fprintf(stderr, "Insert error %d: sn",mysql_errno ,(&my_connection),mysql_error(&my_connection)); }mysql_close(&my_connection); } else{   fprintf(stderr, "Connection failedn");if (mysql_errno(&my_connection)){fprintf(stderr, "Connection error%d: %sn",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 = 4WHERE fname = 'Ann'");if (!res) { printf("Updated %lu rowsn",(unsigned long)mysql_affected_rows(&my_connection));} else {fprintf(stderr, "Update error %d:%sn",mysql_errno(&my_connection),mysql_error(&my_connection));}

  现在假设子表中有的数据,如下:

childnofnameage

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  Jenny

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  Andrew

  Gavin

  Duncan

  Emma

  Alex

  Adrian

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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。稍后,我们将回来处理这一行中的数据。

来源:http://www.tulaoshi.com/n/20160219/1615705.html

延伸阅读
标签: ASP
  Oracle是世界上用得最多的数据库之一,活动服务器网页(ASP)是一种被广泛用于创建动态网页的功能强大的服务器端脚本语言。许多ASP开发人员一直在考虑,能否在开发互联网应用、电子商务网站、互联网管理系统时结合使用ASP和Oracle数据库?这个问题的答案是肯定的,我们还可以使用VB访问Oracle数据库。在本篇文章中,我们将主要讨论如...
标签: SQLServer
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句 一、 简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 SELECT nickname,email FROM testtab...
标签: MySQL mysql数据库
因工作需要,要将存放在sql server数据库中的数据全部导入到mysql数据库中,在网上搜集相关资料,找到两种方法,现在分别谈谈对他们的看法。 第一种是安装mysql ODBC,利用sql server的导出功能,选择mysql数据源,进行数据的直接导出,这种方法很简便,但是针对实际应用有很多弊端,最主要体现就是数据类型问题,首先,sql server数据库中的...
出现这些情况的原因,往往是因为数据库有些损坏,或索引不完整。 在ACCESS中,有个修复数据库的功能可以解决这个问题,在SQL企业管理器,没有这个功能,要用语句来完成,下面就介绍如何用SQL语句完成数据库的修复,需要注意的是,在进行下面的操作时,必须断开所有用户的连接:  代码如下: USE MASTER GO sp_dboption '你的数据库...
一般在Oracle中使用Sql,在Access中使用很少,不过与Oracle的Sql还是有很多相似之处的。 以下SQL语句在ACCESS XP的查询中测试通过 建表: Create Table Tab1 (     ID Counter primary key,     Name string(20),     Age integer,     [Date] DateTime); 技巧: 自动增加...

经验教程

352

收藏

75
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部