知识大全 在MySQL数据库中使用C执行SQL语句
Posted 语句
篇首语:鸟往明处飞,人往高处去。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在MySQL数据库中使用C执行SQL语句相关的知识,希望对你有一定的参考价值。
在MySQL数据库中使用C执行SQL语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
与PostgreSQL相似 可使用许多不同的语言来访问MySQL 包括C C++ Java和Perl 从Professional Linux Programming中第 章有关MySQL的下列章节中 Neil Matthew和Richard Stones使用详尽的MySQL C接口向我们介绍了如何在MySQL数据库中执行SQL语句 他们将讨论返回数据的语句 例如INSERT以及不返回数据的语句 例如UPDATE和DELETE 然后 他们将编写从数据库检索数据的简单程序 执行SQL语句 现在 我们已经有了一个连接 并且知道如何处理错误 是时候讨论使用我们的数据库来作一些实际工作了 执行所有类型的SQL的主关键字是mysql_query int mysql_query(MYSQL *connection const char *query) 正如您所见 它非常简单 它取一个指向连接结构的指针和包含要执行的SQL的文本字符串 与命令行工具不同 将不使用结束分号 成功之后 返回 在需要包含二进制数据的特殊情况下 可以使用相关的函数 mysql_real_query 虽然出于本章的目的 我们仅需要讨论mysql_query 不返回数据的SQL语句 我们将先讨论UPDATE DELETE和INSERT语句 因为它们不返回数据 所以更易于使用 这里我们将介绍的另一个重要函数是检查受影响的行数的函数 my_ulonglong mysql_affected_rows(MYSQL *connection); 可能关于这一函数的最显而易见的事就是其非同寻常的返回结果 由于可移植性原因 这是一个特殊的无符号类型 为了在printf中使用 建议将其强制转换成使用%lu格式规范的无符号长整数 这个函数返回受以前的UPDATE INSERT或DELETE查询影响的行数 这些查询是使用mysql_query执行的 通常对于mysql_函数 返回码 表示没有行受影响 正数表示实际结果 通常是受影响的行数 如前所述 当使用mysql_affected_rows时可能出现未期望的结果 让我们先讨论受INSERT语句影响的行数 它将按预期进行操作 将下列代码添加到程序 connect c 中 并且称其为insert 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 NULL )) printf( Connection success\\n ); res = mysql_query(&my_connection INSERT INTO children(fname age) VALUES( Ann ) ); 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; 正如预期 插入的行数为 现在 我们更改代码 所以 insert 部分被替换成 mysql_errno(&my_connection) mysql_error(&my_connection)); res = mysql_query(&my_connection UPDATE children SET AGE = 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 Jenny Andrew Gavin Duncan Emma Alex Adrian Ann Ann Ann Ann 如果我们执行update 希望报告的受影响行数为 但是实际上程序报告 因为它仅必须更改 行 虽然WHERE子句标识了 行 如果想让mysql_affected_rows报告的结果为 这可能是熟悉其它数据库的人所期望的) 则需要记住将CLIENT_FOUND_ROWS标志传递到mysql_real_connect 在 update c中的程序如下 if (mysql_real_connect(&my_connection localhost rick bar rick NULL CLIENT_FOUND_ROWS)) 如果我们在数据库中复位数据 然后运行带有这种修改的程序 则它报告的行数为 函数mysql_affected_rows还有最后一个奇怪之处 它发生在从数据库中删除数据时 如果使用WHERE子句 则mysql_affected_rows将按预期返回删除行数 但是 如果没有WHERE子句 则删除所有行 报告受影响的行数却为 这是因为由于效率原因优化删除整个表 这种行为不受CLIENT_FOUND_ROWS选项标志的影响 返回数据的语句 现在是时候讨论SQL的最普遍用法了 从数据库检索数据的SELECT语句 MySQL 还支持返回结果的SHOW DESCRIBE和EXPLAIN SQL语句 但是这里不考虑它们 按惯例 手册中包含这些语句的说明 您将会从PostgreSQL章记起 可以从PQexec中的SQL SELECT 语句检索数据 这里马上获取所有数据 或者使用游标从数据库中逐行检索数据 以便搞定大数据 由于完全相同的原因 MySQL的检索方法几乎完全相同 虽然它实际上不用游标的形式描述逐行检索 但是 它提供了缩小这两种方法间差异的API 如果需要 它通常使两种方法的互换更加容易 通常 从MySQL数据库中检索数据有 个阶段 发出查询 检索数据 处理数据 执行所需的任何整理 象以前一样 我们使用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并且检索实际返回的行数 它当然可能是 my_ulonglong mysql_num_rows(MYSQL_RES *result); 它从mysql_store_result取得返回的结果结构 并且在该结果集中返回行数 行数可能为 如果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是行号 它必须在从 到结果集中的行数减 的范围内 传递 将导致在下一次调用mysql_fetch_row时返回第一行 MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *res cha138/Article/program/MySQL/201311/29372相关参考
知识大全 MySQL数据库中查找执行效率慢的SQL语句[1]
MySQL数据库中查找执行效率慢的SQL语句[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 MySQL数据库中查找执行效率慢的SQL语句[2]
MySQL数据库中查找执行效率慢的SQL语句[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们知道MySQLCluster产品用的主要的引擎为NDB很多人说对于NDB来说执行SQL语句的性能很差但是我觉得主要是没有仔细的探索 对于数据库来说要判断他的性能如何无非是要看两点 对于数据
快速掌握MySQL数据库中SELECT语句[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
快速掌握MySQL数据库中SELECT语句[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
MySQL数据库中使用Grant语句增添新用户 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 下
<?php //需要执行的SQL语句//单条$sql="selectidnamefromtbl_userwhereid=";//多条数据//$sql="selectidnamefromtb
通过分析SQL语句的执行计划优化SQL(三) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!第章&n
知识大全 orale数据库如何利用sql语句创建视图的一般性使用方法
SQLCREATEVIEW语句什么是视图?在SQL中视图是基于SQL语句的结果集的可视化的表 视图包含行和列就像一个真实的表视图中的字段就是来自一个或多个数据库教程中的真实的表中的字段我们可以向
查询Oracle正在执行和执行过的SQL语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 正在