2017-08-28 10 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を使用しています。

関連する問題