一、为什么要在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语句?相关推荐

  1. phpmyadmin执行mysql语句_如何在phpMyAdmin中执行sql语句

    大家使用phpMyAdmin中常遇到这样的问题:MySQL Error Message: MySQL Query Error SQL: SELECT main.*, field.* FROM ucho ...

  2. @sql 单元测试_如何在SQL单元测试中使用假表?

    @sql 单元测试 In this article on SQL unit testing, we will talk about how to isolate SQL unit tests from ...

  3. python自增_如何在python语言实现自增和自减功能并显示结果

    在python语言中,跟Java和JavaScript语言不一样,python中没有自增和自减功能,而Java和JavaScript中有.但是,python语言可以使用变量加1或减1替换.下面利用几个 ...

  4. drop sql语句_用于从表中删除数据SQL Drop View语句

    drop sql语句 介绍 (Introduction) This guide covers the SQL statement for dropping (deleting) one or more ...

  5. 判断语句_如何学好C语言判断语句?攻略if语句是第一步

    C语言,是全球使用最多的编程语言.上次我们谈到了switch语句,但在C语言中,if条件构成的选择结构程序很重要.在实际问题中,往往需要对不同变量进行比较,然后分别执行不同的语句.如何使用if语句呢? ...

  6. pl/sql 测试函数_如何在SQL单元测试中使用伪函数?

    pl/sql 测试函数 In this article series, we are exploring SQL unit testing, in general, and also we are r ...

  7. python列表元素求和_如何在python语言使用不同方法实现列表元素求和

    在使用python语言列表时,如果列表中的元素都是数值类型,可以对元素进行求和.下面利用不同的方法实现列表元素求和: 工具/原料 python pycharm 截图工具 方法/步骤 1 第一步,在已创 ...

  8. sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南

    原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...

  9. python数据库操作批量sql执行_使用Python批量修改数据库执行Sql文件

    由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些 ...

最新文章

  1. FD.io/VPP — VPP 的实现原理解析
  2. 地球自转减速影响世界时 格林尼治时间或成历史
  3. asarray java,Java
  4. 杨攀:融云专注极致技术 不忘初心打造极简体验
  5. 使用idea编写消费者,接收生产者的持续日志输出【小案例】(三)
  6. leetcode 107. 二叉树的层次遍历 II(维护两个队列,通过异或运算切换)
  7. 《机器学习》 周志华学习笔记第六章 支持向量机(课后习题)python 实现
  8. jsf 开发_JSF开发人员应该知道的5种有用方法
  9. 百度地图android绘图类,Class:android总类/android离线地图类
  10. 在集合中根据条件来筛选数据
  11. 【BZOJ1038】【codevs1412】瞭望塔,半平面交/三分法
  12. 在浏览器中运行java applet
  13. Red hat linux ping: unknown host www.baidu.com
  14. MeasureSpec
  15. mysql 错误问题_Mysql常见的几个错误问题及解决方法
  16. 【科研记录】如何判断(你自己的)研究工作的价值
  17. 问题:在vue中照片墙的照片数量超过限制数量后,要隐藏图片上传按钮,如何解决?
  18. 秦曾昌人工智能课程---7、决策树集成学习Tree Ensembles
  19. java姓名隐藏中间一个_如何正确的隐藏java语言中的名字
  20. 23.卷积神经网络实战-ResNet

热门文章

  1. Activity是什么?
  2. UpdateData()用法
  3. 关于人工智能的幻想(六)总有一些幻想在心中
  4. 机械革命旷世G16电脑开机变成绿屏了无法使用怎么办?
  5. java实现AES加密解密
  6. 漏洞复现-webmin漏洞系列分析与利用
  7. 机器学习——决策树算法原理及案例
  8. php 读取html内容_php读取html文件(或php文件)的方法
  9. win 7自带测试软件,Win 8战Win 7!专业测试软件成绩大PK
  10. 服务器总是自动重启怎么办?服务器怎么关闭系统更新?