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

让你提前认识软件开发(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 = http://www.mamicode.com/ExecuteSql(hDbConn, szSQL, );  // szSQL里面存放特定的SQL语句

if (iRetValue =http://www.mamicode.com/= -1) // 返回值为-1表示执行失败

{

    if (hDbConn != NULL)     // 数据库连接句柄不为空

    {

        CloseDb(hDbConn);   // 关闭数据库连接

        hDbConn = NULL;    // 注意,要把hDbConn指针置为空

    }

    return;                   // 执行失败后直接返回

}

 

// 如果该SQL语句有返回值,就需要获取该结果;无返回值则不需要执行以下流程

iRetValue = http://www.mamicode.com/Fetch(hDbConn, szDBBuf, sizeof(szDBBuf)); // 将返回结果放到szDBBuf

if (iRetValue =http://www.mamicode.com/= -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,欢迎关注!)