如何转换SQLCHAR*以作为std::wstring向量push_back()的参数
问题分析与解决
你的问题核心是多字节字符串(SQLCHAR*/char*)与宽字符串(std::wstring)的类型不匹配:Lesson_Name是单字节字符数组,而std::vector<std::wstring>存储的是宽字符字符串,直接push_back会因为类型不兼容报错。下面提供两种可行的解决方式:
方法1:将单字节字符串转换为宽字符串(Windows API方式)
利用Windows原生的MultiByteToWideChar函数完成转换,步骤如下:
- 获取单字节字符串的长度;
- 计算所需宽字符缓冲区的大小;
- 执行转换并构造
std::wstring; - 将转换后的宽字符串存入向量。
修改后的代码片段:
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,避免转换开销:
- 将
Lesson_Name的类型改为SQLWCHAR*(对应宽字符); SQLGetData的第三个参数改为SQL_C_WCHAR,直接读取宽字符串;- 直接构造
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
相关产品推荐
相关产品推荐

