這一節示範如何透過 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; }
以下,我們說明 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 字元。
習題