先贴代码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库的。
{
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库的。
第一,我调用SQLExecuteDirect执行set names GBK返回值为2,
第二,现在的问题好像不是读出来是乱码,是读出来fetch的时候没有这条记录。。
用phpmyadmin直接执行set names gbk是可以通过的。。
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
可能还是宽字符的问题..你把它转为单字节的送进去.试下..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;
也不是转换的问题。
我那程序全部sql语句都是用SQLExecDirect执行的。只要是sql正确都没问题
但就是执行set names gbk的时候SQLExecDirect返回-1。
然后是fetch的时候
所有不含中文字段的记录读取正常。
如果存在含有中文字段的记录,就会丢失一条(FETCH的时候就没出现过)
不好描述。
譬如我有5条记录,其中有一条含有中文字段的话,其余4条都不含中文字段,含有中文字段的记录丢失。
如果5条记录中有2条记录含有中文字段,则丢失其中一条,另外一条记录的中文全部变成??
能不能通过SQLDriverConnect连接啊?
如果通过SQLDriverConnect连接的话,应该怎样设置连接字符串里的这个initial stmt?(用sqldriverconnect连接可以不用配置数据源)