前提条件如下:
数据库: ORACLE9
表名称:test
结 构:NUM number,NAME varchar2(10)
数据:
1 n2
3 n3
4 n4
5 n5查询SQL: select * from test假设 ODBC 查询操作成功 语句柄为hStmt 相关数据结构:
//动态绑定每个字段
CStringList sBindCols; //保存字段名称
CStringList sFields; //保存结果集
CStringList sDataSet;
问题如下:查询成功后我要调用GetDataSet()方法将结果保存到已经定义好的sDataSet中
在执行SQLFetchScroll()这个操作时将获取到的数据保存到sDataSet
但在遍历sDataSet时这里保存的好像都是最后一条代码中注释有问题详述BOOL ODBCSource::GetDataSet()
{
int cols = GetFieldCount(); if (cols == SQL_ERROR) return FALSE;
CString *pBind = new CString[cols]; LONG x = 0; //绑定结果集到动态变量
for(int index = 0; index < cols; index ++)
{
SQLReturn = SQLBindCol(hStmt,index+1,SQL_C_CHAR,pBind[index].GetBuffer(0),1024,&x);
if (SQLReturn != SQL_SUCCESS)
{
csOutLog.Format(_T("[DBPOOL] ODBCSource|Query ! 绑定失败 返回码:%d 错误码:%u \n"),SQLReturn,GetLastError());
TRACE(csOutLog);
continue; }
} while (SQLFetchScroll(hStmt,SQL_FETCH_NEXT,0) != SQL_NO_DATA_FOUND)
{
for (int index = 0; index < cols; index++)
{
CString csTemp = pBind[index];
//输出正确
TRACE(_T(" %s "),csTemp);
//添加到CStringList
sDataSet.AddTail(csTemp); } TRACE(_T("\n"));
} TRACE(_T("\n"));
POSITION pos = sDataSet.GetHeadPosition();
//遍历保存好的记录集 但输出的总是最后一条
//正常结果应该是 1 n1 3 n3 4 n4 5 n5
//实现输出是 5 n5 5 n5 5 n5 5 n5
while (pos != NULL) {
CString string = sDataSet.GetNext(pos); TRACE (_T (" %s "), string);
}
return TRUE;
}调试时输出如下: NUM NAME
1 n1
3 n3
4 n4
5 n5 5 n5 5 n5 5 n5 5 n5 //这里应该是 1 n1 3 n3 4 n4 5 n5 才对呀...弄了两天依然是这样..郁闷
数据库: ORACLE9
表名称:test
结 构:NUM number,NAME varchar2(10)
数据:
1 n2
3 n3
4 n4
5 n5查询SQL: select * from test假设 ODBC 查询操作成功 语句柄为hStmt 相关数据结构:
//动态绑定每个字段
CStringList sBindCols; //保存字段名称
CStringList sFields; //保存结果集
CStringList sDataSet;
问题如下:查询成功后我要调用GetDataSet()方法将结果保存到已经定义好的sDataSet中
在执行SQLFetchScroll()这个操作时将获取到的数据保存到sDataSet
但在遍历sDataSet时这里保存的好像都是最后一条代码中注释有问题详述BOOL ODBCSource::GetDataSet()
{
int cols = GetFieldCount(); if (cols == SQL_ERROR) return FALSE;
CString *pBind = new CString[cols]; LONG x = 0; //绑定结果集到动态变量
for(int index = 0; index < cols; index ++)
{
SQLReturn = SQLBindCol(hStmt,index+1,SQL_C_CHAR,pBind[index].GetBuffer(0),1024,&x);
if (SQLReturn != SQL_SUCCESS)
{
csOutLog.Format(_T("[DBPOOL] ODBCSource|Query ! 绑定失败 返回码:%d 错误码:%u \n"),SQLReturn,GetLastError());
TRACE(csOutLog);
continue; }
} while (SQLFetchScroll(hStmt,SQL_FETCH_NEXT,0) != SQL_NO_DATA_FOUND)
{
for (int index = 0; index < cols; index++)
{
CString csTemp = pBind[index];
//输出正确
TRACE(_T(" %s "),csTemp);
//添加到CStringList
sDataSet.AddTail(csTemp); } TRACE(_T("\n"));
} TRACE(_T("\n"));
POSITION pos = sDataSet.GetHeadPosition();
//遍历保存好的记录集 但输出的总是最后一条
//正常结果应该是 1 n1 3 n3 4 n4 5 n5
//实现输出是 5 n5 5 n5 5 n5 5 n5
while (pos != NULL) {
CString string = sDataSet.GetNext(pos); TRACE (_T (" %s "), string);
}
return TRUE;
}调试时输出如下: NUM NAME
1 n1
3 n3
4 n4
5 n5 5 n5 5 n5 5 n5 5 n5 //这里应该是 1 n1 3 n3 4 n4 5 n5 才对呀...弄了两天依然是这样..郁闷
解决方案 »
- 怎么给MFC多文档添加子窗口?
- 求InstallShield12教程
- 哪位朋友有《UNDOCUMENTED WINDOWS 2000 SECRETS》的随书光盘啊,小弟急需里面一个文件
- 来者有分,大家给介绍一些p2p开发方面的好书
- 串口通讯:API操作串口,十六进制的0发送到对方都不正常,其他数据都正常
- 如何在CListCtrl DropFiles的时候选中鼠标所指向的Item?急用!
- 怎样在vc++中结束一个正在运行的程序(比如结束记事本程序的运行)
- 为什么我的VC ADO程序不认识_ConnectionPtr m_pConnect;指针,#inport也做了。这是为什么呀?该在VIEW还是在APP里面加呢?
- 目标提取
- 提问:请问线程分那几种?(内空)
- vista下装visual studio 2008,我无语了
- CDC 绘图丢失
NUM NAME
1 n1
1 n1 3 n3
3 n3 3 n3 4 n4
4 n4 4 n4 4 n4 5 n5
5 n5 5 n5 5 n5 5 n5
5 n5 5 n5 5 n5 5 n5 Detected memory leaks!
CString string = sDataSet.GetNext(pos); TRACE (_T (" %s "), string);
}
你这里pos变量没有递增的啊..
for(int index = 0; index < cols; index ++)
SQLReturn = SQLBindCol(hStmt,index+1,SQL_C_CHAR,pBind[index].GetBuffer(0),1024,&x);
if (SQLReturn != SQL_SUCCESS)
{
csOutLog.Format(_T("[DBPOOL] ODBCSource|Query ! 绑定失败 返回码:%d 错误码:%u \n"),SQLReturn,GetLastError());
TRACE(csOutLog);
continue; }
这个有没有问题
while (SQLFetchScroll(hStmt,SQL_FETCH_NEXT,0) != SQL_NO_DATA_FOUND)
{
for (int index = 0; index < cols; index++)
{
CString csTemp = pBind[index];
//输出正确
TRACE(_T(" %s "),csTemp);
//添加到CStringList
sDataSet.AddTail(csTemp); } TRACE(_T("\n"));
}最后一个WHile中的pos值是不是有递增,也可以跟踪一下。嘻嘻
{
int cols = GetFieldCount(); if (cols == SQL_ERROR) return FALSE;
CString *pBind = new CString[cols]; LONG x = 0; //绑定结果集到动态变量
for(int index = 0; index < cols; index ++)
{
SQLReturn = SQLBindCol(hStmt,index+1,SQL_C_CHAR,pBind[index].GetBuffer(0),1024,&x);
if (SQLReturn != SQL_SUCCESS)
{
csOutLog.Format(_T("[DBPOOL] ODBCSource|Query ! 绑定失败 返回码:%d 错误码:%u \n"),SQLReturn,GetLastError());
TRACE(csOutLog);
continue; }
} //先定义一个串
CString csSaveResult = _T("");
while (SQLFetchScroll(hStmt,SQL_FETCH_NEXT,0) != SQL_NO_DATA_FOUND)
{
for (int index = 0; index < cols; index++)
{
CString csTemp = pBind[index];
//解决方法 把结果Format到csSaveResult中
csSaveResult.Format("%s",csTemp);
//将csSaveResult加入到数据结构
sDataSet.AddTail(csSaveResult);
//不解为什么要这样做就可????????????????????????????? } }
POSITION pos = sDataSet.GetHeadPosition();
while (pos != NULL) {
CString string = sDataSet.GetNext(pos); TRACE (_T (" %s "), string);
}
return TRUE;
}
CStringList 都存在问题 对了 如果是用CString 保存成一条CString 是空的
类似这样CString csSaveResult = _("");........................ CString csTemp = pBind[index]; csSaveResult += csTemp;...............................
printf("%s",csSaveResult) 输出是空串 FORMAT 是可以的..
//解决方法 把结果Format到csSaveResult中
csSaveResult.Format("%s",csTemp);
//将csSaveResult加入到数据结构
sDataSet.AddTail(csSaveResult);
//不解为什么要这样做就可?????????????????????????????不是吧,你单步调试一下,CString csTemp = pBind[index];后,csTemp为空吗??