在通信類軟件中,程序經常需要與數據庫打交道。為了實現諸如從數據庫中獲取數據、更新數據庫表某字段、插入或刪除某條數據等功能,就需要在C語言程序中構造一些SQL語句,並用函數來執行這些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語言程序需要掛在那裡等待結果,影響了程序執行效率。
從圖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語言程序與數據庫交互的具體流程,為相關軟件開發工作的順利開展提供了有益的參考。