【问题标题】:How to read Asian characters from SQL database in c++如何在 C++ 中从 SQL 数据库中读取亚洲字符
【发布时间】:2017-08-28 11:48:41
【问题描述】:

我正在使用 C++ 从 SQL Server 2008 数据库中读取数据。我可以很好地阅读普通的 ASCII 字符。但是,我似乎无法弄清楚如何从数据库中读取韩文、日文或俄文字符。以下是我目前用来执行 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。请帮我更改此功能,以便我可以读取所有类型的字符。谢谢。

【问题讨论】:

  • 亚洲字符可以用 Unicode 字符串读取。据我所知,如果您使用的字符串是语言实现中的默认字符串,则只有 ASCII 字符表示正确
  • 保存文件时,选择 Save With Encoding 并选择 UTF-8 format 选项。可以解决问题。

标签: c++ sql sql-server ascii


【解决方案1】:

看起来这个函数符合我的要求:

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 而不是字符串和字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-09-20
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多