在編寫(xiě)32位程序時(shí),如果需要訪問(wèn)64位的MySQL數(shù)據(jù)庫(kù),就需要用到一些特殊的技巧。
首先,需要確保在32位程序中使用的mysqlclient庫(kù)是64位的版本。因?yàn)?2位程序只能使用32位的庫(kù),而64位的MySQL數(shù)據(jù)庫(kù)需要64位的庫(kù)才能訪問(wèn)。
其次,需要使用64位的ODBC驅(qū)動(dòng)程序。ODBC是一種訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)接口,64位的ODBC驅(qū)動(dòng)程序才能與64位的MySQL數(shù)據(jù)庫(kù)進(jìn)行通信。
以下是一個(gè)實(shí)例代碼,演示如何使用32位程序訪問(wèn)64位MySQL數(shù)據(jù)庫(kù):
#include#include #include #include #include int main(int argc, char **argv) { SQLHENV hEnv; SQLHDBC hDbc; SQLHSTMT hStmt; SQLRETURN ret; SQLCHAR connStr[1024] = "DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=testdb;UID=testuser;PWD=testpassword;"; SQLLEN connStrLen = strlen((char *)connStr); ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0); ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc); ret = SQLDriverConnect(hDbc, NULL, connStr, connStrLen, NULL, 0, NULL, SQL_DRIVER_NOPROMPT); ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt); ret = SQLExecDirect(hStmt, (SQLCHAR *)"SELECT * FROM testtable", SQL_NTS); SQLCHAR name[50], address[100]; SQLINTEGER age; while ((ret = SQLFetch(hStmt)) != SQL_NO_DATA) { ret = SQLGetData(hStmt, 1, SQL_C_CHAR, name, 50, NULL); ret = SQLGetData(hStmt, 2, SQL_C_CHAR, address, 100, NULL); ret = SQLGetData(hStmt, 3, SQL_C_LONG, &age, 0, NULL); printf("%s %s %d\n", name, address, age); } SQLFreeHandle(SQL_HANDLE_STMT, hStmt); SQLDisconnect(hDbc); SQLFreeHandle(SQL_HANDLE_DBC, hDbc); SQLFreeHandle(SQL_HANDLE_ENV, hEnv); return 0; }