MySQL C API执行SQL语句的一种方式


本文主要给大家介绍MySQL C API执行SQL语句的一种方式,其所涉及的东西,从理论知识来获悉,有很多书籍、文献可供大家参考,从现实意义角度出发,开发云累计多年的实践经验可分享给大家。接着看
预处理语句(Prepared Statements)
MySQL C API还提供了另一种方式来执行SQL语句,即先预处理(prepare)再执行
(execute). 对于多次执行的SQL语句,该方式可以提高其执行效率。具体步骤如下:MYSQL_STMT mysql_stmt_init(MYSQL mysql)描述
创建MYSQL_STMT句柄。对于该句柄,应使用mysql_stmt_close(MYSQL_STMT *)释放。返回值
成功时,返回指向MYSQL_STMT结构的指针。如果内存溢出,返回NULL。
错误
CR_OUT_OF_MEMORY内存溢出。调用mysql_stmt_prepare()对SQL语句进行预处理
int mysql_stmt_prepare(MYSQL_STMT stmt, const char stmt_str, unsigned long length)int mysql_stmt_prepare(MYSQL_STMT stmt, const char query, unsigned long length)
描述
给定mysql_stmt_init()返回的语句句柄,准备字符串查询指向的SQL语句,并返回状态值。字符串长度应由“length”参量给出。字符串必须包含1条SQL语句。不应为语句添加终结用分号(‘;’)或g。
通过将问号字符“?”嵌入到SQL字符串的恰当位置,应用程序可包含SQL语句中的一个或多个参数标记符。标记符仅在SQL语句中的特定位置时才是合法的。例如,它可以在INSERT语句的VALUES()列表中(为行指定列值),或与WHERE子句中某列的比较部分(用以指定比较值)。但是,对于ID(例如表名或列名),不允许使用它们,不允许指定二进制操作符(如等于号“=”)的操作数。后一个限制是有必要的,原因在于,无法确定参数类型。一般而言,参数仅在DML(数据操作语言)语句中才是合法的,在DDL(数据定义语言)语句中不合法。执行语句之前,必须使用mysql_stmt_bind_param(),将参数标记符与应用程序变量绑定在一起。返回值如果成功处理了语句,返回0。如果出现错误,返回非0值。my_bool mysql_stmt_bind_param(MYSQL_STMT stmt, MYSQL_BIND bind)
描述
mysql_stmt_bind_param()用于为SQL语句中的参数标记符绑定数据,以传递给mysql_stmt_prepare()。它使用MYSQL_BIND结构来提供数据。“bind”是MYSQL_BIND结构的某一数组的地址。按照客户端库的预期,对于查询中出现的每个“?”参数标记符,数组中均包含1个元素。假定你准备了下述语句:INSERT INTO mytbl VALUES(?,?,?)
绑定参数时,MYSQL_BIND结构的数组包含3个元素,并能声明如下:MYSQL_BIND bind[3];返回值如果绑定成功,返回0。如果出现错误,返回非0值。int mysql_stmt_execute(MYSQL_STMT *stmt)描述mysql_stmt_execute()执行与语句句柄相关的预处理查询。在该调用期间,将当前绑定的参数标记符的值发送到服务器,服务器用新提供的数据替换标记符。如果语句是UPDATE、DELETE或INSERT,通过调用mysql_stmt_affected_rows(),可发现更改、删除或插入的总行数。如果这是诸如SELECT等能生成结果集的语句,调用任何其他能导致查询处理的函数之前,必须调用mysql_stmt_fetch()来获取数据。对于生成结果集的语句,执行语句之前,可通过调用mysql_stmt_attr_set(),请求mysql_stmt_execute()为语句打开光标。如果多次执行某一语句,在打开新的光标前,mysql_stmt_execute()将关闭任何已打开的光标。返回值如果执行成功,返回0。如果出现错误,返回非0值。my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt)描述返回上次执行语句更改、删除或插入的总行数。对于UPDATE、DELETE或INSERT语句,可在mysql_stmt_execute()之后立刻调用它们。对于SELECT语句,mysql_stmt_affected_rows()的工作方式类似于mysql_num_rows()。返回值大于0的整数指明了受影响或检索的行数。对于UPDATE语句,“0”表明未更新任何记录,在查询中没有与WHERE子句匹配的行,或尚未执行任何查询。“-1”表明返回了错误,或对SELECT查询,在调用mysql_stmt_store_result()之前调用了mysql_stmt_affected_rows()。由于mysql_stmt_affected_rows()返回无符号值,可通过比较返回值和“(my_ulonglong)-1”(或等效的“(my_ulonglong)~0”),检查“-1”。int mysql_stmt_store_result(MYSQL_STMT *stmt)描述对于成功生成结果集的所有语句(SELECT、SHOW、DESCRIBE、EXPLAIN),而且仅当你打算对客户端的全部结果集进行缓冲处理时,必须调用mysql_stmt_store_result(),以便后续的mysql_stmt_fetch()调用能返回缓冲数据。对于其他语句,没有必要调用mysql_stmt_store_result(),但如果调用了它,也不会造成任何伤害或导致任何性能问题。通过检查mysql_stmt_result_metadata()是否返回NULL,可检测语句是否生成了结果集。
返回值如果成功完成了对结果的缓冲处理,返回0。如果出现错误,返回非0值。总体而言:MySQL客户端/服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句,预处理执行是一种有效的方式。首先对语句进行解析,为执行作好准备。接下来,在以后使用初始化函数返回的语句句柄执行一次或多次。
对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量。
预处理语句的另一个优点是,它采用了二进制协议,从而使得客户端和服务器之间的数据传输更有效率。
编程步骤
1. 用mysql_stmt_init()创建预处理语句句柄。要想在服务器上准备预处理语句,可调用mysql_stmt_prepare(),并为其传递包含SQL语句的字符串
2. 如果语句生成了结果集,调用mysql_stmt_result_metadata()以获得结果集元数据。虽然与包含查询返回列的结果集不同,该元数据本身也采用了结果集的形式。元数据结果集指明了结果中包含多少列,并包含每一列的信息。
3.使用mysql_stmt_bind_param()设置任何参数的值。必须设置所有参数。否则,语句执行将返回错误,或生成无法预料的结果。
4.调用mysql_stmt_execute()执行语句。
5.如果语句生成了结果集,捆绑数据缓冲,通过调开发云主机域名用mysql_stmt_bind_result(),检索行值。
6.通过重复调用mysql_stmt_fetch(),按行将数据提取到缓冲区,直至未发现更多行为止。
7.通过更改参数值并再次执行语句,重复步骤3到步骤6。实现代码:
#include
#include
#include
#include
#define STRING_SIZE 50#define DROP_SAMPLE_TABLE “DROP TABLE IF EXISTS test_table”
#define CREATE_SAMPLE_TABLE “CREATE TABLE test_table(col1 INT,
col2 VARCHAR(40),
col3 SMALLINT,
col4 TIMESTAMP)”
#define INSERT_SAMPLE “INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)”//int main(char *argv, int argc)
int main(char
argv[], int argc)
{
int ret = 0, i = 0;看了以上MySQL C API执行SQL语句的一种方式介绍,希望能给大家在实际运用中带来一定的帮助。本文由于篇幅有限,难免会有不足和需要补充的地方,大家可以继续关注开发云行业资讯板块,会定期给大家更新行业新闻和知识,如有需要更加专业的解答,可在官网联系我们的24小时售前售后,随时帮您解答问题的。

相关推荐: 三种查看MySQL数据库版本的方法

三种查看MySQL数据库版本的方开发云主机域名法1、使用-V参数首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者–version使用方法:D:xamppmysqlbin>mysql -V或者D:xamppmysqlbin>m…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/07 15:55
下一篇 06/07 15:55

相关推荐