先贴代码QueryResult AdminSQL::listCourse()
{
QueryResult qr(4);
//qr = new QueryResult(4);
CString *keys = new CString[4];
keys[0] = L"COURSE_ID";
keys[1] = L"COURSE_NAME";
keys[2] = L"COURSE_TYPE";
keys[3] = L"COURSE_SCHOOL";
qr.init(keys);
CString sql;
sql = L"SELECT `COURSE_ID`,`COURSE_NAME`,`COURSE_TYPE`,`COURSE_SCHOOL` FROM `MTS_COURSE` ORDER BY `COURSE_ID`";
int a;
SQLHSTMT hstmt;
SQLINTEGER cbLenth;
SQLCHAR id[16], name[32], school[32];
int type;
a = dm.queryPre(hstmt);
if(a == 0)
{
SQLBindCol(hstmt, 1, SQL_C_DEFAULT, (SQLPOINTER)&id, 16, &cbLenth);
SQLBindCol(hstmt, 2, SQL_C_DEFAULT, (SQLPOINTER)&name, 32, &cbLenth);
SQLBindCol(hstmt, 4, SQL_C_DEFAULT, (SQLPOINTER)&school, 32, &cbLenth);
SQLBindCol(hstmt, 3, SQL_C_DEFAULT, (SQLPOINTER)&type, 4, &cbLenth);
}
else
{
return qr;
}
CString *cs;
cs = new CString[4];
a = dm.query(sql, hstmt);
if (a == 0)
{
while((SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO))
{
TT((char*)id, cs[0]);
TT((char*)name, cs[1]);
TT((char*)school, cs[2]);
//TT((char*)teacher, cs[3]);
cs[3].Format(L"%d", type);
CString te = cs[3];
qr.addItem(cs);
}
}
return qr;
}用这个函数从mysql中读取数据时,遇到如果某些字段的内容是中文的话,会不定期出现如下错误
1.丢失这条记录
2.读出来的这个字段值为??
3.一条记录都读不出来(即SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO 为false)
数据库采用utf-8编码,求教。
使用开发平台为vs2008,好像是默认用了unicode库的。

解决方案 »

  1.   

    先用程序执行SQL: set names GBK;在C/C++里,,我已经回了,怎么转UNICODE了.
      

  2.   

    能详细点么?
    第一,我调用SQLExecuteDirect执行set names GBK返回值为2,
    第二,现在的问题好像不是读出来是乱码,是读出来fetch的时候没有这条记录。。
      

  3.   

    哦弄错了。。用SQLExecuteDirect执行set names GBK返回值是-1才对
    用phpmyadmin直接执行set names gbk是可以通过的。。
      

  4.   

    再贴两个调用到的函数
    int DBManager::queryPre(SQLHSTMT &hs)
    {
    SQLRETURN retcode;
    /*
    SQLHSTMT hstmt;
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    LPCTSTR sql = L"set names GBK";
    retcode = SQLExecDirect(hstmt, (SQLWCHAR*)sql, SQL_NTS);
    retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    */
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hs);
    //SQLINTEGER cbLenth;
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    return EXEC_SUCCESS;
    }
    return EXEC_FAIL;
    }
    int DBManager::query(LPCTSTR sql, SQLHSTMT &hs)
    {
    SQLRETURN retcode;
    retcode = SQLExecDirect(hs, (SQLWCHAR*)sql, SQL_NTS);
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    return EXEC_SUCCESS;
    }
    return EXEC_FAIL;
    }在这里调试,querypre函数中
    SQLHSTMT hstmt;
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    LPCTSTR sql = L"set names GBK";
    retcode = SQLExecDirect(hstmt, (SQLWCHAR*)sql, SQL_NTS);
    这一段,allochandle返回值为0,句柄分配成功
    execdirect “set names gbk”返回值为-1
      

  5.   

    phpmyadmin  行得通..就一定行的.
    可能还是宽字符的问题..你把它转为单字节的送进去.试下..1、函数 WideCharToMultiByte(),转换 UNICODE 到 MBCS。使用范例:       LPCOLESTR lpw = L"Hello,你好"; 
          size_t wLen = wcslen( lpw ) + 1;  // 宽字符字符长度,+1表示包含字符串结束符 
          
          int aLen=WideCharToMultiByte(  // 第一次调用,计算所需 MBCS 字符串字节长度 
    CP_ACP, 
    0, 
    lpw,  // 宽字符串指针 
    wLen, // 字符长度 
    NULL, 
    0,  // 参数0表示计算转换后的字符空间 
    NULL, 
    NULL);       LPSTR lpa = new char [aLen];       WideCharToMultiByte( 
    CP_ACP, 
    0, 
    lpw, 
    wLen, 
    lpa,  // 转换后的字符串指针 
    aLen, // 给出空间大小 
    NULL, 
    NULL);       // 此时,lpa 中保存着转换后的 MBCS 字符串 
          ... ... ... ... 
          delete [] lpa;     2、函数 MultiByteToWideChar(),转换 MBCS 到 UNICODE。使用范例:      LPCSTR lpa = "Hello,你好"; 
          size_t aLen = strlen( lpa ) + 1; 
          
          int wLen = MultiByteToWideChar( 
    CP_ACP, 
    0, 
    lpa, 
    aLen, 
    NULL, 
    0); 
          
          LPOLESTR lpw = new WCHAR [wLen]; 
          MultiByteToWideChar( 
    CP_ACP, 
    0, 
    lpa, 
    aLen, 
    lpw, 
    wLen); 
          ... ... ... ... 
          delete [] lpw; 
     
      

  6.   

    不是输入的问题啊。
    也不是转换的问题。
    我那程序全部sql语句都是用SQLExecDirect执行的。只要是sql正确都没问题
    但就是执行set names gbk的时候SQLExecDirect返回-1。
    然后是fetch的时候
    所有不含中文字段的记录读取正常。
    如果存在含有中文字段的记录,就会丢失一条(FETCH的时候就没出现过)
    不好描述。
    譬如我有5条记录,其中有一条含有中文字段的话,其余4条都不含中文字段,含有中文字段的记录丢失。
    如果5条记录中有2条记录含有中文字段,则丢失其中一条,另外一条记录的中文全部变成??
      

  7.   

    晕死,换个myodbc 3.51设一句set names gbk到initial stmt就可以了
    能不能通过SQLDriverConnect连接啊?
    如果通过SQLDriverConnect连接的话,应该怎样设置连接字符串里的这个initial stmt?(用sqldriverconnect连接可以不用配置数据源)