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

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");
posted @ 2022-10-24 19:28  DaoDao777999  阅读(167)  评论(0编辑  收藏  举报