c语言解析sql语句_如何在C语言里面执行SQL语句?
一、为什么要在C语言程序中执行SQL语句?
在C语言程序中执行SQL语句的原因有以下几个:
(1)程序需要获取数据库中某数据表的字段值,并对这些字段值进行解析以执行后续操作。
(2)程序需要更新数据库中某数据表的字段值。
(3)程序需要向某数据表中插入值。
(4)程序需要从某数据表中删除一些值。
(5)程序需要执行某存储过程以完成特定的操作。
可以看出,在C语言程序中,不只要求能够执行“select”、“update”、“insert”、“delete”等语句,还要求能够执行存储过程。
二、C语言程序与数据库打交道的方式
C语言程序与数据库打交道的方式分为直连(同步)和非直连(异步)两种,它们的特点如下所示:
1.直连方式
在该方式中,C语言程序直接与数据库进行消息的交互,如图1所示。
图1直连方式示意图
该方式的优点是消息交互是即时的,C语言程序向数据库发送消息之后,很快就能够得到结果;缺点是如果数据库执行缓慢,那么C语言程序需要挂在那里等待结果,影响了程序执行效率。
2.非直连方式
在该方式中,C语言程序通过一个独立的第三方模块间接与数据库进行消息的交互,如图2所示。
图2非直连方式示意图
该方式的优点是当C语言程序向第三方模块发送消息之后,可以不用等待数据库返回结果而去执行其它流程;缺点是如果消息序列号没有定义好,那么极有可能会导致第三方模块返回的结果出现混乱。因此,在该方式中,定义好发送消息的顺序(即设定好序列号)很重要。
由于需要与数据库打交道,因此要在C语言程序所使用的配置文件中填写好关联数据库的相关信息,如数据库机器的IP地址、端口号、用户名、密码、模块号和所操作的具体数据库名等。在运行程序之前,一定要确保相关配置项信息的正确性。
本文介绍直连方式下C语言程序与数据库进行消息交互的具体流程。
三、直连方式下的消息交互流程
在直连方式下,C语言程序与数据库进行消息交互的通用流程如图3所示。
图3直连方式下的消息交互流程图
从图3可以看出,直连方式下C语言程序与数据库进行消息交互的流程一般包括以下几个步骤:
(1)获取对应的数据库连接,在连接失败的情况下进行重试。要执行SQL语句,首先需要连接到对应的数据库,即获取对应的数据库连接句柄。在第一次连接失败的情况下,要进行重连。每个项目组规定了数据库重连的次数,一般为二到三次。如果多次重连之后仍然不成功,那么程序就直接返回错误,不再执行后续流程。这时就需要查找连接失败的原因。
(2)在连接成功之后,就要构造特定的SQL语句并调用函数执行该SQL语句。这些SQL语句不仅包括“select”、“update”、“insert”、“delete”等语句,还包括执行存储过程的语句。如果执行成功,则继续执行后续流程;如果执行失败,则关闭对应的数据库连接并退出程序。因为之前连接数据库是成功的,所以本步执行失败,就需要查看是否是SQL语句构造得有问题。
(3) SQL语句执行成功之后,如果该SQL语句有返回结果,就需要调用函数来获取该结果,同时对结果进行解析;如果该SQL语句没有返回结果,那么就直接执行后续流程。如果获取和解析结果失败,则关闭对应的数据库连接并退出程序;如果解析成功,那么就继续执行后续流程。
(4)注意,如果一个程序里面创建过数据库连接,在该程序执行结束或退出之前,一定要记得将数据库连接关闭掉,防止数据库连接句柄被错误使用。
四、直连方式下的C语言程序框架
根据图3的消息交互流程,直连方式下的C语言程序框架如下所示:
……
……
//获取对应的数据库连接
if (hDbConn == NULL) // hDbConn为数据库句柄
{
hDbConn = GetDBConn(…); //第一次连接
if (hDbConn == NULL) //连接失败,再重试一次
{
hDbConn = GetDBConn(…); //第二次连接
if (hDbConn == NULL) //第二次连接失败,程序直接返回,不执行后续流程
{
return;
}
}
}
//构造特定的SQL语句并调用函数执行该SQL语句
……
……
iRetValue = ExecuteSql(hDbConn, szSQL,…); // szSQL里面存放特定的SQL语句
if (iRetValue == -1) //返回值为-1表示执行失败
{
if (hDbConn != NULL) //数据库连接句柄不为空
{
CloseDb(hDbConn); //关闭数据库连接
hDbConn = NULL; //注意,要把hDbConn指针置为空
}
return; //执行失败后直接返回
}
//如果该SQL语句有返回值,就需要获取该结果;无返回值则不需要执行以下流程
iRetValue = Fetch(hDbConn, szDBBuf, sizeof(szDBBuf)); //将返回结果放到szDBBuf中
if (iRetValue == -1) //返回值为-1表示执行失败
{
if (hDbConn != NULL) //数据库连接句柄不为空
{
CloseDb(hDbConn); //关闭数据库连接
hDbConn = NULL; //注意,要把hDbConn指针置为空
}
return; //执行失败后直接返回
}
//继续执行后续流程
……
……
//在程序返回之前要再次检查并关闭数据库句柄
if (NULL != hDbConn)
{
CloseDb(hDbConn);
hDbConn = NULL;
}
return;
五、总结
本文对直连方式下C语言程序如何与数据库进行消息交互作了详细的介绍,并结合流程图展示了直连方式下的C语言程序框架。
在C语言程序与数据库打交道的过程中,我们要注意以下问题:
(1)获取数据库连接句柄之后,在使用它之前要首先检查该句柄指针是否为空;如果为空,则要对数据库进行重连。
(2)在执行SQL语句的过程中,如果遇到异常结果,可从两个方面入手来检查:第一,检查配置文件中数据库的各项配置是否正确,数据库本身是否运行良好;第二,检查C程序代码是否书写正确,特别是SQL语句是否书写正确。
(3)不管在代码的什么位置,在程序退出之前,一定要释放数据库连接的句柄,以免其被误用。
在实际的软件开发项目中,C语言程序和数据库打交道可谓是家常便饭。本文介绍了C语言程序与数据库交互的具体流程,为相关软件开发工作的顺利开展提供了有益的参考。
c语言解析sql语句_如何在C语言里面执行SQL语句?相关推荐
- phpmyadmin执行mysql语句_如何在phpMyAdmin中执行sql语句
大家使用phpMyAdmin中常遇到这样的问题:MySQL Error Message: MySQL Query Error SQL: SELECT main.*, field.* FROM ucho ...
- @sql 单元测试_如何在SQL单元测试中使用假表?
@sql 单元测试 In this article on SQL unit testing, we will talk about how to isolate SQL unit tests from ...
- python自增_如何在python语言实现自增和自减功能并显示结果
在python语言中,跟Java和JavaScript语言不一样,python中没有自增和自减功能,而Java和JavaScript中有.但是,python语言可以使用变量加1或减1替换.下面利用几个 ...
- drop sql语句_用于从表中删除数据SQL Drop View语句
drop sql语句 介绍 (Introduction) This guide covers the SQL statement for dropping (deleting) one or more ...
- 判断语句_如何学好C语言判断语句?攻略if语句是第一步
C语言,是全球使用最多的编程语言.上次我们谈到了switch语句,但在C语言中,if条件构成的选择结构程序很重要.在实际问题中,往往需要对不同变量进行比较,然后分别执行不同的语句.如何使用if语句呢? ...
- pl/sql 测试函数_如何在SQL单元测试中使用伪函数?
pl/sql 测试函数 In this article series, we are exploring SQL unit testing, in general, and also we are r ...
- python列表元素求和_如何在python语言使用不同方法实现列表元素求和
在使用python语言列表时,如果列表中的元素都是数值类型,可以对元素进行求和.下面利用不同的方法实现列表元素求和: 工具/原料 python pycharm 截图工具 方法/步骤 1 第一步,在已创 ...
- sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南
原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...
- python数据库操作批量sql执行_使用Python批量修改数据库执行Sql文件
由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些 ...
最新文章
- FD.io/VPP — VPP 的实现原理解析
- 地球自转减速影响世界时 格林尼治时间或成历史
- asarray java,Java
- 杨攀:融云专注极致技术 不忘初心打造极简体验
- 使用idea编写消费者,接收生产者的持续日志输出【小案例】(三)
- leetcode 107. 二叉树的层次遍历 II(维护两个队列,通过异或运算切换)
- 《机器学习》 周志华学习笔记第六章 支持向量机(课后习题)python 实现
- jsf 开发_JSF开发人员应该知道的5种有用方法
- 百度地图android绘图类,Class:android总类/android离线地图类
- 在集合中根据条件来筛选数据
- 【BZOJ1038】【codevs1412】瞭望塔,半平面交/三分法
- 在浏览器中运行java applet
- Red hat linux ping: unknown host www.baidu.com
- MeasureSpec
- mysql 错误问题_Mysql常见的几个错误问题及解决方法
- 【科研记录】如何判断(你自己的)研究工作的价值
- 问题:在vue中照片墙的照片数量超过限制数量后,要隐藏图片上传按钮,如何解决?
- 秦曾昌人工智能课程---7、决策树集成学习Tree Ensembles
- java姓名隐藏中间一个_如何正确的隐藏java语言中的名字
- 23.卷积神经网络实战-ResNet