本文介紹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