前提条件如下: 
数据库: 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  才对呀...弄了两天依然是这样..郁闷

解决方案 »

  1.   

    那一般保存结果集到数据结构都是怎么做的呀?  跟踪输出 得到下面奇怪的结果
     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!
      

  2.   

    while (pos != NULL) {
        
             CString string = sDataSet.GetNext(pos);         TRACE (_T (" %s "), string);
         }
    你这里pos变量没有递增的啊..
      

  3.   

    看不出来,应该看看你的
    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;         }
    这个有没有问题
      

  4.   

    SQLReturn = SQLBindCol(hStmt,index+1,SQL_C_CHAR,pBind[index].GetBuffer(0),1024,&x); 
      

  5.   

    你跟踪分析一下,这个循环,在向sDataSet存入时,是否存储的数值是正确的:
     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值是不是有递增,也可以跟踪一下。嘻嘻
      

  6.   

    问题解决了..不过有点怪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;         }
         }     //先定义一个串
         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;
     }
      

  7.   

    是不是微软件BUG啊..我试过了 如果直接保存的话 CString[]  vector<CString> Map<CString,CString> 
    CStringList 都存在问题  对了 如果是用CString 保存成一条CString 是空的
    类似这样CString csSaveResult = _("");........................        CString csTemp = pBind[index];        csSaveResult += csTemp;...............................
    printf("%s",csSaveResult)  输出是空串  FORMAT 是可以的.. 
      

  8.   

    CString csTemp = pBind[index];
                    
                     //解决方法 把结果Format到csSaveResult中
                     csSaveResult.Format("%s",csTemp);
                     //将csSaveResult加入到数据结构
                     sDataSet.AddTail(csSaveResult);
                     //不解为什么要这样做就可?????????????????????????????不是吧,你单步调试一下,CString csTemp = pBind[index];后,csTemp为空吗??
      

  9.   

    csTemp 是正常值 但输出csSaveResult时就为空串了..