2017-08-28 1 views
0

Ich verwende C++, um Daten aus einer SQL Server 2008-Datenbank zu lesen. Ich kann normale ASCII-Zeichen gut lesen. Ich kann jedoch nicht herausfinden, wie man koreanische, japanische oder russische Schriftzeichen aus der Datenbank liest. Im Folgenden ist die Funktion, die ich bin derzeit mit ausführen SQL-Befehlen Strings aus der Datenbank zu lesen: „?“So lesen Sie asiatische Zeichen aus SQL-Datenbank in C++

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; 
} 

Diese Funktion für die normalen englische Strings funktioniert gut, funktioniert aber nicht mit asiatischen oder russischen Strings (erscheint für jedes Zeichen). Ich habe versucht, die Strings in dieser Funktion durch wstring zu ersetzen, aber kein Glück. Ich habe auch SQLExecDirect zu SQLExecDirectW geändert. Bitte helfen Sie mir, diese Funktion zu ändern, damit ich alle Arten von Zeichen lesen kann. Vielen Dank.

+0

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

+1

Asiatische Zeichen können mit einer Unicode-Zeichenkette gelesen werden. Wenn die von Ihnen verwendete Zeichenfolge die Standardzeichenfolge in der Sprachimplementierung ist, werden nur die ASCII-Zeichen korrekt dargestellt. –

+0

Wählen Sie beim Speichern der Datei die Option "Mit Codierung speichern" und "UTF-8-Format auswählen" aus. Kann das Problem beheben. –

Antwort

0

Es ist wie diese Funktion sieht das tut, was ich suchte:

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; 
} 

Es verwendet nur wstrings und wchars anstelle von Strings und Zeichen.

Verwandte Themen