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

MySQL Vala 編程示例:GLib 風格資料庫連線與查詢

     編輯:MySQL 資料庫相關知識

Vala 是為 GNOME 生態設計的現代語言,編譯為 C 並鏈接 GLib/GObject,語法接近 C#,適合撰寫高效能原生應用。本文展示使用 libmysqlclient Vala 綁定連線 MySQL、執行查詢與結果處理的完整範例。

環境準備

  • Vala 編譯器:sudo apt install valac
  • MySQL 開發庫:sudo apt install libmysqlclient-dev
  • Vala MySQL 綁定:vapi/mysql.vapi(通常隨 libmysqlclient-dev 提供或自行編寫)

完整範例代碼

using MySql;

int main (string[] args) {
    int rc = 0;
    ClientFlag cflag = 0;
    string host = "127.0.0.1";
    string user = "root";
    string password = "";
    string database = "test";
    int port = 3306;
    string socket = null;

    Database mysql = new MySql.Database();
    
    var isConnected = mysql.real_connect(host, user, password, database, port, socket, cflag);
    if (!isConnected) {
        rc = 1;
        stdout.printf("ERROR %u: Connection failed: %s\n", mysql.errno(), mysql.error());
        return rc;
    }
    
    stdout.printf("Connected to MySQL Server version: %s (%lu)\n", 
                  mysql.get_server_info(), (ulong) mysql.get_server_version());
    
    string sql = "SELECT * FROM test LIMIT 10";
    rc = mysql.query(sql);
    if (rc != 0) {
        stdout.printf("ERROR %u: Query failed: %s\n", mysql.errno(), mysql.error());
        return rc;
    }
    
    Result resultSet = mysql.use_result();
    string[] row;
    while ((row = resultSet.fetch_row()) != null) {
        stdout.printf("id: %s | data: %s | ts: %s\n", row[0], row[1], row[2]);
    }
    
    // free_result & mysql_close 由 GLib 物件自動管理(RAII)
    return rc;
}

編譯與執行

valac --pkg mysql --pkg glib-2.0 mysql_demo.vala -o mysql_demo
./mysql_demo
  • --pkg mysql:鏈接 mysql.vapi 並連結 libmysqlclient。
  • --pkg glib-2.0:引入 GLib 核心庫(字串、物件系統、主循環)。

關鍵 API 對照表

Vala/GLib 方法對應 C API說明
Database()mysql_init()建立連線物件
real_connect()mysql_real_connect()建立 TCP/Unix Socket 連線
query()mysql_query()執行 SQL 語句
use_result()mysql_use_result()取得結果集(流式,逐行讀取)
store_result()mysql_store_result()取得結果集(緩衝,一次性載入記憶體)
fetch_row()mysql_fetch_row()取得下一行(字串陣列)
errno() / error()mysql_errno() / mysql_error()錯誤碼/訊息
get_server_info()mysql_get_server_info()伺服器版本字串
get_server_version()mysql_get_server_version()版本號整數

進階主題

參數化查詢(防注入)

Vala 綁定若支援 mysql_stmt_prepare 系列,建議使用預處理語句:

var stmt = mysql.prepare("SELECT * FROM users WHERE email = ?");
stmt.bind_param("s", email);
stmt.execute();
var res = stmt.get_result();

非同步/事件驅動模式

整合 GLib 主循環:

var source = mysql.get_socket_source();  // 取得 GSource
source.set_callback(() => {
    // 處理非同步事件
});
source.attach(main_context);

連線池與資源管理

  • Vala 物件參考計數自動管理 MYSQL* 生命週期。
  • 長連線應用建議自行實作連線池(Queue + 定時健康檢查)。

為何選擇 Vala 開發 MySQL 應用?

  • 效能: 編譯為原生 C,零 VM 開銷,記憶體佔用極低。
  • 生態: 無縫呼叫 GLib/GIO/GTK+,適合桌面/系統工具開發。
  • 語法: 現代物件導向、型別推導、Lambda、介面、信號槽,開發效率遠超純 C。
  • 互通: 產出 .so 可被 Python (ctypes)、Node.js (NAPI)、Go (cgo) 直接呼叫。

Vala + MySQL 是構建高效能、原生整合 GNOME 生態資料庫應用的優雅選擇。隨著 libmysqlclient 綁定完善,更多進階特性(預處理、非同步、SSL)將原生可用。

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