让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

【文章摘要】

在通信类软件中,程序经常需要与数据库打交道。为了实现诸如从数据库中获取数据、更新数据库表某字段、插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句。

本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考。

【关键词】

SQL语句  C语言  程序  流程  开发

一、为什么要在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语言程序与数据库交互的具体流程,为相关软件开发工作的顺利开展提供了有益的参考。

(欢迎访问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎访问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)

(本系列文章每周更新两篇,敬请期待!本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?,布布扣,bubuko.com

时间: 2024-08-02 19:09:02

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?的相关文章

让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议

第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议 1. 存储过程中的重要表信息的保存 在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息. 例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX (      AAA           

让你提前认识软件开发(24):C语言的发展历史和主要特点

第1部分 重新认识C语言 C语言的发展历史和主要特点 作为一门众所周知的计算机编程语言,C语言是谁发明的呢?它是如何演进的?它有何特点?到底有多少人在使用它? 1. C语言之父 C语言是1972年由美国贝尔实验室的计算机科学家Dennis Ritchie(丹尼斯·里奇)设计发明的.因此,Dennis Ritchie被誉为"C语言之父"(他已于2011年10月9日去世,享年70岁).图1中的人物就是Dennis Ritchie. 图1 "C语言之父" Dennis R

让你提前认识软件开发---学长的软件开发经验总结(19)

第1部分 重新认识C语言 C语言中的协议及单元测试示例 [文章摘要] 在实际的软件开发项目中,经常要实现多个模块之间的通信,这就需要大家约定好相互之间的通信协议,各自按照协议来收发和解析消息. 本文以实际的程序代码为例,详细介绍了如何用C语言来实现通信协议,并基于对协议字段的判断,说明了程序单元测试的过程,为相关的开发工作提供了有益的参考. [关键词] 软件开发  协议  单元测试  C语言  字段 一.软件模块之间的协议 什么是软件模块之间的协议?不同的软件模块之间要实现相互通信,就必须遵循共

让你提前认识软件开发(32):数据库索引

第2部分 数据库SQL语言 数据库索引 索引在数据库中占有非常重要的地位,它是对数据库表中一列或多列的值进行排序的一种结构.正确使用索引,可快速访问数据库表中的特定信息,进而提高数据库脚本的执行效率. 1. 索引分类 数据库表中经常有一列或几列的组合,其值唯一地标识表中的每一行,该列称为表的主键. 在数据库中,将索引分为三类:唯一索引.主键索引和聚集索引. 唯一索引是不允许其中任何两行具有相同索引值的索引,即索引列的值不允许重复. 主键索引是唯一索引的特定类型,该索引要求主键中的每个值都唯一.

让你提前认识软件开发(33):数据操纵语言(DML)

第2部分 数据库SQL语言 数据操纵语言(DML) 数据操纵语言(Data Manipulation Language,DML)包括insert.delete和update语句,用于增.删.改数据. 本文用以下的表tb_employeeinfo作为例子加以说明: create table tb_employeeinfo (     employeeno         varchar(20)       not null,       -- 员工工号     employeename    va

让你提前认识软件开发(31):数据库脚本中的begin与end

第2部分 数据库SQL语言 数据库脚本中的begin与end 在数据库脚本中,begin与end是一对奇怪的单词.缺少它们,某些代码看起来会让人一头雾水:添加它们,代码的结构瞬间就清晰了. 确实,begin与end作为代码语句的开始和结束标志,可以让脚本程序的逻辑明确,易于阅读. begin与end主要用在以下地方: 1. if.else.else if.while等语句中 if.else.else if.while等语句要自占一行,执行语句不得紧跟其后,不论执行语句有多少都要加语句块标志beg

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力. 在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确要求组员以实现产品功能为主,代码能

让你提前认识软件开发(45):代码的第一印象

第3部分 软件研发工作总结 代码的第一印象 我们都很注重给别人的第一印象,也有很多书籍教我们怎样给别人留下一个美好印象的.确实,如果我们第一眼看到某个人,就觉得很不爽,那么一定会在心理上产生抵触,以后再见到他,会有一种疏远的感觉.也正因为如此,当今社会交往中的"面子工程"很重要,不管怎样,先撑足了自己的脸面再说. 代码也一样,也会给别人留下或好或差的印象.当我们看到优美的代码时,会有一种想继续研究下去的欲望,甚至会有一种觉得很享受的感觉.相反,当我们看到丑陋的代码时,就会咬牙切齿,因为

让你提前认识软件开发(44):如何解决软件故障?

第3部分 软件研发工作总结 如何解决软件故障? 在软件产品的运营维护阶段,软件工程师的一项重要工作就是解决软件的bug.在学校的时候,大家学完一门课程,然后考试通过就万事大吉了.但在实际的软件开发项目中,将软件成功交付给客户,只是"万里长征走完了第一步",后面还有大量的工作要做,例如:解决软件故障.新增功能.版本升级等.作为一名合格的软件工程师,一定要学会准确.迅速地解决软件出现的各种问题. 为什么解决软件问题的能力如此重要?因为软件项目的成功率不容乐观.国内某IT公司对本公司内软件项