You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何转换SQLCHAR*以作为std::wstring向量push_back()的参数

问题分析与解决

你的问题核心是多字节字符串(SQLCHAR*/char*)与宽字符串(std::wstring)的类型不匹配:Lesson_Name是单字节字符数组,而std::vector<std::wstring>存储的是宽字符字符串,直接push_back会因为类型不兼容报错。下面提供两种可行的解决方式:

方法1:将单字节字符串转换为宽字符串(Windows API方式)

利用Windows原生的MultiByteToWideChar函数完成转换,步骤如下:

  1. 获取单字节字符串的长度;
  2. 计算所需宽字符缓冲区的大小;
  3. 执行转换并构造std::wstring;
  4. 将转换后的宽字符串存入向量。

修改后的代码片段:

while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS)
{
    // ... 原有SQLGetData逻辑 ...
    SQLGetData(sqlStmtHandle, 2, SQL_C_CHAR, Lesson_Name, SQL_RESULT_LEN, ptrSqlDataLength);

    MessageBoxA(NULL, (LPCSTR)Lesson_Name, NULL, MB_OK);

    // 开始转换
    int mbLen = strlen((const char*)Lesson_Name);
    // 计算所需宽字符数(包含终止符)
    int wcLen = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)Lesson_Name, mbLen, NULL, 0);
    std::vector<wchar_t> wcBuf(wcLen + 1); // 分配缓冲区
    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)Lesson_Name, mbLen, wcBuf.data(), wcLen);
    wcBuf[wcLen] = L'\0'; // 确保字符串终止

    // 存入向量
    LNpointer.push_back(std::wstring(wcBuf.data()));
    // ... 其他逻辑 ...
}

注意:如果你的数据库字符串是UTF-8编码,需要把CP_ACP换成CP_UTF8。

方法2:直接获取宽字符串(推荐)

既然目标是std::wstring,可以直接使用ODBC的宽字符API,避免转换开销:

  1. 将Lesson_Name的类型改为SQLWCHAR*(对应宽字符);
  2. SQLGetData的第三个参数改为SQL_C_WCHAR,直接读取宽字符串;
  3. 直接构造std::wstring存入向量。

修改后的代码片段:

// 把SQLCHAR换成SQLWCHAR
SQLWCHAR* Lesson_Name = new SQLWCHAR[SQL_RESULT_LEN];

while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS)
{
    // 第三个参数改为SQL_C_WCHAR,直接读取宽字符串
    SQLGetData(sqlStmtHandle, 2, SQL_C_WCHAR, Lesson_Name, SQL_RESULT_LEN, ptrSqlDataLength);

    // 如果需要弹窗显示,用MessageBoxW
    MessageBoxW(NULL, (LPCWSTR)Lesson_Name, NULL, MB_OK);
    // 直接存入向量,类型匹配
    LNpointer.push_back(std::wstring(Lesson_Name));
    // ... 其他逻辑 ...
}

这种方式更高效,也避免了编码转换可能出现的问题,是更推荐的做法。

内容的提问来源于stack exchange,提问作者pwn01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:50:28