全部產品
Search
文件中心

Lindorm:基於ODBC的應用開發

更新時間:Jul 06, 2024

本文介紹C/C++語言如何通過MySQL的ODBC驅動進行應用程式開發。

前提條件

操作步驟

  1. 下載並安裝MySQL ODBC驅動。下載地址:ODBC

  2. 執行以下命令,安裝資料庫連接組件unixODBC。以Linux作業系統為例。

    yum install unixODBC-devel
  3. 修改ODBC設定檔odbcinst.ini中的MySQL依賴。

    [MySQL]
    Description	= ODBC for MySQL
    Driver		= /usr/lib/libmyodbc8a.so
    Setup		= /usr/lib/libmyodbc8w.so
    Driver64	= /usr/lib64/libmyodbc8a.so
    Setup64		= /usr/lib64/libmyodbc8w.so
    FileUsage	= 1

    配置項說明如下:

    配置項

    說明

    Description

    MySQL依賴描述,可自訂。

    Driver

    ODBC驅動程式。請填寫ODBC驅動程式實際存放路徑。

    Setup

    ODBC驅動安裝程式。請填寫ODBC驅動安裝程式實際存放路徑。

    Driver64

    ODBC 64位驅動程式。請填寫ODBC 64位驅動程式實際存放路徑。

    Setup64

    ODBC 64位驅動安裝程式。請填寫ODBC 64位驅動安裝程式實際存放路徑。

    FileUsage

    預設值為1。不修改。

  4. 配置串連參數。

    ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)"DRIVER={MySQL};SERVER=ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com;PORT=33060;DATABASE=default;USER=user;PASSWORD=test", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

    參數說明

    參數

    說明

    DRIVER

    MySQL驅動名。根據odbcinst.ini檔案中的MySQL依賴名稱進行修改。

    SERVER

    Lindorm寬表引擎的MySQL相容地址。如何擷取,請參見查看串連地址

    重要
    • 如果應用部署在ECS執行個體,建議您通過專用網路訪問Lindorm執行個體,可獲得更高的安全性和更低的網路延遲。

    • 如果應用部署在本地,在通過公網串連Lindorm執行個體前,需在控制台開通公網地址。開通方式:在控制台選擇資料庫連接 > 寬表引擎,在寬表引擎頁簽單擊開通公網地址

    • 通過專用網路訪問Lindorm執行個體,SERVER請填寫MySQL相容地址對應的專用網路地址。通過公網訪問Lindorm執行個體,SERVER請填寫MySQL相容地址對應的公網地址。

    PORT

    Lindorm寬表引擎MySQL協議的連接埠,固定為33060。

    DATABASE

    需要串連的資料庫名稱。預設串連default資料庫。

    USER

    如果您忘記使用者密碼,可以通過Lindorm寬表引擎的叢集管理系統修改密碼。具體操作,請參見修改使用者密碼

    PASSWORD

  5. 建立串連,通過SQL文法使用Lindorm寬表引擎。以查詢所有資料庫為例。

    if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
            printf("串連成功\n");
    
            // 執行查詢
            SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
            SQLExecDirect(stmt, (SQLCHAR*)"show databases", SQL_NTS);
    
            // 擷取查詢結果
            SQLCHAR result[50];
            while (SQLFetch(stmt) == SQL_SUCCESS) {
                SQLGetData(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL);
                printf("database: %s\n", result);
            } 
            // 釋放資源
            SQLFreeHandle(SQL_HANDLE_STMT, stmt);
            SQLDisconnect(dbc);
        }
        else {
            SQLCHAR sqlState[6];
            SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH];
            SQLINTEGER nativeError;
            SQLSMALLINT actualMsgLen;
    
            SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlState, &nativeError, msg, sizeof(msg), &actualMsgLen);
            printf("串連失敗: %s\n", msg);
        }
    
        // 釋放資源
        SQLFreeHandle(SQL_HANDLE_DBC, dbc);
        SQLFreeHandle(SQL_HANDLE_ENV, env);
    
        return 0;

完整樣本

完整範例程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>

int main() {
    // 定義串連資訊
    SQLHENV env;
    SQLHDBC dbc;
    SQLHSTMT stmt;
    SQLRETURN ret;

    // 初始化環境
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);

    // 建立串連
    SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
    SQLSetConnectAttr(dbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, SQL_IS_INTEGER);
    //lindorm_mysql_url為lindorm寬表引擎MySQL協議的串連地址,database為需要串連的資料庫,lindorm_user為使用者名稱,lindorm_password為使用者密碼 
    ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)"DRIVER={MySQL};SERVER=ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com;PORT=33060;DATABASE=default;USER=user;PASSWORD=test", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

    if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
        printf("串連成功\n");

        // 執行查詢
        SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
        SQLExecDirect(stmt, (SQLCHAR*)"show databases", SQL_NTS);

        // 擷取查詢結果
        SQLCHAR result[50];
        while (SQLFetch(stmt) == SQL_SUCCESS) {
            SQLGetData(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL);
            printf("database: %s\n", result);
        } 
        // 釋放資源
        SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        SQLDisconnect(dbc);
    }
    else {
        SQLCHAR sqlState[6];
        SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH];
        SQLINTEGER nativeError;
        SQLSMALLINT actualMsgLen;

        SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlState, &nativeError, msg, sizeof(msg), &actualMsgLen);
        printf("串連失敗: %s\n", msg);
    }

    // 釋放資源
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    SQLFreeHandle(SQL_HANDLE_ENV, env);

    return 0;
}

如果當前執行個體僅有default一個資料庫,執行成功後將返回如下結果:

串連成功
database: default
database: information_schema