C++使用ODBC连接数据库遇到的问题

2023-02-15,

C++使用ODBC连接数据库遇到的问题
1、SQL语句中包含中文无法正常执行的问题
2、字符与宽字符相互转化的问题

C++使用ODBC连接数据库遇到的问题

1、SQL语句中包含中文无法正常执行的问题

例如:

SQLCHAR S[512]="INSERT INTO Test.dbo.DATA(name,sex,IDCard) VALUES ('张三','男','012345678912345678');";

此时执行SQLExecDirect进行数据库数据插入时可能会失败,返回值为-1。这是由于中文占用两个字节引发的错误,所以在这里,我们要使用宽字符和SQLExecDirectW函数进行插入

    SQLWCHAR SS[512] = L"INSERT INTO Test.dbo.DATA(name,sex,IDCard) VALUES ('张三','男','012345678912345678');";
SQLRETURN ret = SQLExecDirectW(this->hstmt, SS, SQL_NTS);

2、字符与宽字符相互转化的问题

上文提到,当SQL包含中文时需要使用宽字符才能执行,所以还涉及到一个宽字符拼接的问题
MultiByteToWideChar函数详解

//将char转化为wchar
wchar_t *Char2Wchar(const char *szStr) {
//第一个参数为字符集,根据自己的设置进行更改
int nLen = MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, szStr, -1, NULL, 0);
if (nLen == 0) {
return nullptr;
}
auto *pResult = new wchar_t[nLen];
MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, szStr, -1, pResult, nLen);
return pResult;
} SQLWCHAR SQL[512];
//宽字符串拼接函数,与普通拼接用法一致
wsprintfW(SQL, L"INSERT INTO Test.dbo.DATA(name,sex,IDCard) VALUES ('%s','%s','%s');", L"张三", L"男",L"012345678912345678"); //效果与上述一样
SQLWCHAR *buf=Char2Wchar("张三");
wsprintfW(SQL, L"INSERT INTO Test.dbo.DATA(name,sex,IDCard) VALUES ('%s','%s','%s');", bufs, L"男",L"012345678912345678");

C++使用ODBC连接数据库遇到的问题的相关教程结束。

《C++使用ODBC连接数据库遇到的问题.doc》

下载本文的Word格式文档,以方便收藏与打印。