让你提前认识软件开发(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,欢迎关注!)