2017-08-28 78 views
0

我正在使用C++從SQL Server 2008數據庫中讀取數據。我可以正常讀取正常的ASCII字符。但是,我似乎無法弄清楚如何從數據庫中讀取韓文,日文或俄文字符。下面是我目前使用的執行SQL命令從數據庫中讀取字符串的函數:「?」如何從C++中的SQL數據庫中讀取亞洲字符

vector<string> ExSQL(string command) { 
    SQLHANDLE sqlConnHandle; 
    SQLHANDLE sqlEnvHandle; 
    SQLWCHAR retconstring[SQL_RETURN_CODE_LEN]; 
    sqlConnHandle = NULL; 
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvHandle); 
    SQLSetEnvAttr(sqlEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); 
    SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvHandle, &sqlConnHandle); 
    SQLDriverConnect(sqlConnHandle, 
     NULL, 
     (SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=PhraseDB3;Trusted=true;", 
     SQL_NTS, 
     retconstring, 
     1024, 
     NULL, 
     SQL_DRIVER_NOPROMPT 
    ); 
    vector<string> results; 
    SQLHANDLE sqlStmtHandle; 
    sqlStmtHandle = NULL; 
    SQLAllocHandle(SQL_HANDLE_STMT, sqlConnHandle, &sqlStmtHandle); 
    wstring widestr = std::wstring(command.begin(), command.end()); 
    const wchar_t* temp = widestr.c_str(); 
    SQLExecDirect(sqlStmtHandle, (SQLWCHAR*)temp, SQL_NTS); 
    SQLCHAR sqlRes[SQL_RESULT_LEN]; 
    SQLINTEGER sqlResPtr; 
    while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS) { 
     SQLGetData(sqlStmtHandle, 1, SQL_CHAR, sqlRes, SQL_RESULT_LEN, &sqlResPtr); 
     string result((const char*)sqlRes); 
     results.push_back(result); 
    } 
    SQLFreeHandle(SQL_HANDLE_STMT, sqlStmtHandle); 
    SQLDisconnect(sqlConnHandle); 
    SQLFreeHandle(SQL_HANDLE_DBC, sqlConnHandle); 
    SQLFreeHandle(SQL_HANDLE_ENV, sqlEnvHandle); 
    return results; 
} 

此功能非常適合普通的英語字符串,但不與亞洲和俄羅斯的字符串(工作對每個字符出現)。我試圖用wstring替換這個函數中的字符串,但沒有運氣。我還將SQLExecDirect更改爲SQLExecDirectW。請幫我改變這個功能,以便我可以讀取所有類型的字符。謝謝。

+0

https://stackoverflow.com/a/14736123/7034621 – orhtej2

+1

亞洲字符可以用Unicode字符串讀取。從我所看到的情況來看,如果您正在使用的字符串是語言實現中的默認字符串,則只有ASCII字符能夠正確表示 –

+0

在保存文件時,請選擇使用編碼保存並選擇UTF-8格式選項。可以解決問題。 –

回答

0

它看起來像這樣的功能是什麼我一直在尋找:

vector<wstring> ExWSQL(string command) { 
    SQLHANDLE sqlConnHandle; 
    SQLHANDLE sqlEnvHandle; 
    SQLWCHAR retconstring[SQL_RETURN_CODE_LEN]; 
    sqlConnHandle = NULL; 
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvHandle); 
    SQLSetEnvAttr(sqlEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); 
    SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvHandle, &sqlConnHandle); 
    SQLDriverConnect(sqlConnHandle, 
     NULL, 
     (SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=PhraseDB3;Trusted=true;", 
     SQL_NTS, 
     retconstring, 
     1024, 
     NULL, 
     SQL_DRIVER_NOPROMPT 
    ); 
    vector<wstring> results; 
    SQLHANDLE sqlStmtHandle; 
    sqlStmtHandle = NULL; 
    SQLAllocHandle(SQL_HANDLE_STMT, sqlConnHandle, &sqlStmtHandle); 
    wstring widestr = std::wstring(command.begin(), command.end()); 
    const wchar_t* temp = widestr.c_str(); 
    SQLExecDirectW(sqlStmtHandle, (SQLWCHAR*)temp, SQL_NTS); 
    SQLWCHAR sqlRes[SQL_RESULT_LEN] = {}; 
    SQLINTEGER sqlResPtr; 
    while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS) { 
     SQLGetData(sqlStmtHandle, 1, SQL_WCHAR, sqlRes, SQL_RESULT_LEN, &sqlResPtr); 
     wstring result = (const WCHAR*)sqlRes; 
     results.push_back(result); 
    } 
    SQLFreeHandle(SQL_HANDLE_STMT, sqlStmtHandle); 
    SQLDisconnect(sqlConnHandle); 
    SQLFreeHandle(SQL_HANDLE_DBC, sqlConnHandle); 
    SQLFreeHandle(SQL_HANDLE_ENV, sqlEnvHandle); 
    return results; 
} 

它只是使用wstrings和wchars而不是字符串和字符。

相關問題