MySQL 教材:C API 操作與關閉資料庫

這一節示範如何透過 C API 下指令給 MySQL。 我們用前一節示範的 opendb() 來開啟資料庫。 這一節假設要寫主程式了,但是我們留下許多細節,用中文註解帶過去。 以下就是原始碼:


#include <stdio.h>
#include <mysql.h>

#define QSIZE 256

MYSQL *dp;
MYSQL_RES *qp;
int opendb(void);

int main() {
    int err;
    char query[QSIZE];

    err = opendb();
    if (err) {
        /* 如果資料庫沒開成功,沒戲唱了,輸出訊息 */
        return err;
    }

    sprintf(query, "在此寫一句 MySQL 指令");
    err = mysql_query(dp, query);
    if (err) {
        /* 執行發生了錯誤,可能指令的語法有錯,也可能其他,輸出訊息 */
        return 5;
    }

    qp = mysql_store_result(dp);
    if (qp == NULL) {
        /* 執行雖然成功,但是執行的結果卻拿不回來,可能記憶體不足,
           也可能其他,輸出訊息 */
        return 6;
    }

    mysql_close(dp);  /* 沒事早點切掉資料庫的連線,比較節省網路資源。*/

    /* 所有執行結果都已經儲存在 RAM 裡面,由 qp 指著,*/
    /* 接下來,只要針對 *qp 做資料處理就行了。         */

    mysql_free_result(qp);  /* 釋放儲存結果的記憶體 */
    
    return 0;
}

以上就是一套開啟資料庫、執行指令 (查詢或者增修資料)、取得執行結果、 關閉資料庫的示範。 它的編譯方法如下:
gcc -I/usr/include/mysql main.c -L/usr/lib/mysql -lmysqlclient opendb.o

以下,我們說明 sprintf() 用法。

sprintf() 就像 printf() 一樣,是「格式化輸出」的函式。 就如同 fprintf(fp, ...) 把輸出的訊息送到檔案去, sprintf(s, ...) 把輸出的訊息寫到一個字串 s 裡面。 s 必須被宣告為 char[N], 但是 sprintf() 並不會檢查輸出的字串超過了 N 個字元沒有, 使用者必須自己留意,否則會 segmentation fault。 而且,字串必須以 NULL 字元結束,所以實際上至多只能放 N - 1 個字元。 重複呼叫 sprintf(s, ...) 則重新設定了 s 的值。 所有 printf() 可接受的語法,都可以用在 sprintf(s, ...) 裡面。 例如

sprintf(s, "x = %d and Peter says %s", x, argv[1]);
如果 x 的值是 17 而 argv[1] 的值是 "hello",則 s 的值就是
x = 17 and Peter says hello\0

以上程式中,我們先把想要傳給 MySQL 的指令寫在一個名叫 query 的字串內, 此字串最多可以接受 QSIZE - 1 個字元。 您不必在 query 裡面寫一個 \n 字元。

習題

  1. 故意在 query 裡面寫一個不合語法的 MySQL 指令,看看有什麼結果。
  2. 故意在 query 裡面寫一個語法正確但是查無結果的 MySQL 指令, 看看有什麼結果。
[BCC16-A]
單維彰 (02/06/02) ---
[Prev] [Next] [Up]