首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SCO OpenServer 上以 GCC 編譯呼叫 MySQL C API 程式完整實作

     編輯:MySQL 資料庫相關知識

環境規格

  • OS:SCO OpenServer 5.0.6
  • MySQL:3.23.42
  • Compiler:GCC 2.95.2(已內建 MySQL 支援,無需 ESQL/C 預編譯)

Makefile 範例

CC  = gcc
LIB = -lcurses -lsocket -lmysqlclient -lm -lc -lnsl

all: gspser

gspser: get_data.o getfileargv.o
	$(CC) -o gj get_data.o getfileargv.o $(LIB)

get_data.o: get_data.c
	$(CC) -c get_data.c

getfileargv.o: getfileargv.c
	$(CC) -c getfileargv.c

clean:
	rm -f *.o

關鍵:-lmysqlclient 連結官方客戶端庫,其餘為 SCO 系統常用庫。

核心邏輯:get_data.c

#include <stdio.h>
#include </usr/local/mysql/include/mysql.h>

#define DBCFG "./gsp.conf"

int main() {
    char dbhost[32], dbuser[16], dbpasswd[16], db[16];
    char query[256];
    int count;

    MYSQL *mysql;           // 連線控制代碼
    MYSQL_RES *mysql_res;   // 結果集
    MYSQL_ROW mysql_row;    // 字串陣列(單行)
    my_ulonglong rows;      // 64位無號長整數,用於行數、影響行數

    // 從設定檔讀取連線參數
    getfileargv(DBCFG, "DBHOST",   dbhost);
    getfileargv(DBCFG, "DBUSER",   dbuser);
    getfileargv(DBCFG, "DBPASSWD", dbpasswd);
    getfileargv(DBCFG, "DATABASE", db);

    // 初始化 MYSQL 結構
    if (!(mysql = mysql_init(NULL))) {
        fprintf(stderr, "mysql_init 失敗!\n");
        return 1;
    }

    // 真實連線
    if (!mysql_real_connect(mysql, dbhost, dbuser, dbpasswd, db, 0, NULL, 0)) {
        fprintf(stderr, "連線伺服器失敗: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }

    // 執行查詢
    strcpy(query, "select * from zuh where jgm='11110501' order by zuh");
    if (mysql_query(mysql, query)) {
        fprintf(stderr, "查詢失敗: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }

    // 取得完整結果集(緩衝模式)
    mysql_res = mysql_store_result(mysql);
    rows = mysql_num_rows(mysql_res);

    if (rows == 0) {
        printf("查無資料\n");
        mysql_free_result(mysql_res);
        mysql_close(mysql);
        return 0;
    }

    // 逐行取出並列印
    for (count = 0; count < rows; count++) {
        mysql_row = mysql_fetch_row(mysql_res);
        printf("社號:%s 組號:%s 組名:%s\n", mysql_row[0], mysql_row[1], mysql_row[2]);
    }

    // 釋放資源
    mysql_free_result(mysql_res);
    mysql_close(mysql);
    return 0;
}

工具函式:getfileargv.c

#include <stdio.h>
#include <string.h>

int getfileargv(const char *filename, const char *argvname, char *retbuf) {
    FILE *fp;
    char line[128];
    char tempbuf[40];

    strncpy(tempbuf, argvname, 30);
    tempbuf[39] = '\0';

    if ((fp = fopen(filename, "r")) == NULL) return -1;

    strcat(tempbuf, "=");

    while (fgets(line, 120, fp)) {
        if (line[0] == '#') continue; // 跳過註解
        if (!strncmp(line, tempbuf, strlen(tempbuf))) {
            fclose(fp);
            line[strlen(line)-1] = '\0'; // 去除換行
            strcpy(retbuf, strchr(line, '=') + 1);
            return 0;
        }
    }
    fclose(fp);
    return -2; // 找不到
}

設定檔範例:gsp.conf

DBHOST=127.0.0.1
DBUSER=root
DBPASSWD=secret
DATABASE=testdb

編譯與執行

make clean && make
./gj

遷移提示

  • Linux/BSD 直接用 pkg-config --cflags --libs mysqlclient 取得編譯連結參數。
  • MySQL 8.0+ 標頭檔路徑通常為 /usr/include/mysql。
  • 錯誤處理建議統一用 mysql_error(mysql) 取得詳細訊息。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved