|
|
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;
}以下,我們說明 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 字元。
習題