首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言嵌入式 SQL 開發指南:靜態 SQL 核心流程詳解

     編輯:關於C

嵌入式 SQL 程序結構解析

嵌入式 SQL 允許在 C 程序中直接編寫 SQL 語句,經預編譯器處理後生成純 C 代碼。以下是連接 SAMPLE 數據庫並查詢姓氏為 JOHNSON 的員工名的完整示例:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>

EXEC SQL INCLUDE SQLCA;  /* (1) 定義 SQLCA 通訊區 */

int main() {
    EXEC SQL BEGIN DECLARE SECTION;  /* (2) 宿主變量聲明區 */
        char firstname[13];
        char userid[9];
        char passwd[19];
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT TO sample;      /* (3) 連接數據庫 */

    EXEC SQL SELECT FIRSTNME INTO :firstname  /* (4) 查詢並存入宿主變量 */
        FROM employee WHERE LASTNAME = 'JOHNSON';

    printf("First name = %s\n", firstname);

    EXEC SQL CONNECT RESET;          /* (5) 斷開連接 */
    return 0;
}

核心組件詳細說明

(1) SQLCA - SQL 通訊區

EXEC SQL INCLUDE SQLCA;

SQLCA(SQL Communication Area)是應用程序與數據庫管理系統(DBMS)通訊的關鍵結構。其核心字段 SQLCODE 指示 SQL 語句執行結果:

  • 0:成功執行
  • > 0:執行成功但有警告(如截斷)
  • < 0:執行失敗(錯誤碼)

每條 SQL 執行後,應檢查 SQLCODE 進行錯誤處理。

(2) 宿主變量聲明區


EXEC SQL BEGIN DECLARE SECTION;
    char firstname[13];
    char userid[9];
    char passwd[19];
EXEC SQL END DECLARE SECTION;
  • 只有在該區域聲明的 C 變量才能被 SQL 語句引用,稱為宿主變量。
  • 宿主變量雙向流動:INSERT/UPDATE 時將 C 數據傳給 DBMS;SELECT/FETCH 時從 DBMS 接收數據。
  • 在 SQL 中引用宿主變量時,必須加冒號前綴(:firstname),以區別於 SQL 列名。

(3) 數據庫連接

EXEC SQL CONNECT TO sample;
  • 訪問數據庫前必須建立連接。
  • 需確保目標數據庫實例已啟動。
  • 可指定用戶名/密碼:CONNECT TO sample USER :userid USING :passwd。

(4) 靜態 SQL 查詢


EXEC SQL SELECT FIRSTNME INTO :firstname
    FROM employee WHERE LASTNAME = 'JOHNSON';
  • 靜態 SQL:SQL 結構在編譯時確定,僅宿主變量值在運行時變化。
  • INTO :firstname 將查詢結果單行單列存入宿主變量。
  • 若查詢返回多行,需使用游標(DECLARE CURSOR、OPEN、FETCH、CLOSE)。
  • 同樣支持 INSERT、UPDATE、DELETE。

(5) 斷開連接

EXEC SQL CONNECT RESET;

釋放數據庫連接資源,程序結束前必須調用。

嵌入式 SQL 語法規範

  • 每條 SQL 以 EXEC SQL 開頭,以分號 ; 結束。
  • 預編譯器識別 EXEC SQL 到 ; 之間的內容為 SQL 語句。
  • 跨行 SQL 語句在 C 中需使用續行符 \:

EXEC SQL SELECT col1, col2 \
    INTO :var1, :var2 \
    FROM table WHERE condition;

開發流程概覽

  1. 編寫 .sqc(或 .sc)源文件,包含嵌入式 SQL。
  2. 運行預編譯器(如 db2 prep、proc),生成純 C 文件(.c)及綁定文件。
  3. 編譯 C 文件生成目標文件。
  4. 鏈接數據庫客戶端庫生成可執行文件。
  5. 綁定包到數據庫(靜態 SQL 需預先綁定訪問計劃)。
  6. 運行應用程序。

錯誤處理最佳實踐


#define CHECK_SQLCA() \
    do { \
        if (sqlca.sqlcode < 0) { \
            fprintf(stderr, "SQL Error %d at %s:%d\n", \
                    sqlca.sqlcode, __FILE__, __LINE__); \
            EXEC SQL ROLLBACK; \
            exit(1); \
        } \
    } while(0)

EXEC SQL CONNECT TO sample;
CHECK_SQLCA();

EXEC SQL SELECT ...;
CHECK_SQLCA();

封裝宏統一檢查 SQLCODE,確保錯誤不可被忽略,提高代碼健壯性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved