本文介紹C/C++語言如何通過MySQL的ODBC驅動進行應用程式開發。
前提條件
已開通MySQL協議相容功能。如何開通,請參見開通MySQL協議相容功能。
已將用戶端IP添加至白名單,具體操作請參見設定白名單。
操作步驟
下載並安裝MySQL ODBC驅動。下載地址:ODBC。
執行以下命令,安裝資料庫連接組件unixODBC。以Linux作業系統為例。
yum install unixODBC-devel
修改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。不修改。
配置串連參數。
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
建立串連,通過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