程序代码:retcode = SQLExecDirect(hstmt1,   (UCHAR   FAR   *)  "select * from  msg_record   where flag1=0", SQL_NTS);
   while (TRUE) {//循环得到所有行      retcode = SQLFetch(hstmt1);//移动光标      if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {         printf("error SQLFetch\n");      }      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){         /*得到当前光标处每列的值 */
            SQLGetData(hstmt1,1,SQL_C_ULONG, &szid, 0, &cbid);          
            SQLGetData(hstmt1,5, SQL_C_CHAR, szflag1, 5,   &cbflag1); 
                     //////////////////////////////////////////////
          中间是发送函数
         //////////////////////////////////////////////
            
            
    
    //SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);
   // SQLAllocStmt(hdbc1,&hstmt1);
    以上两句话,注释掉的话,就可以发送查询的所有结果,但是flag1不会改变,将造成死循环,不注释的话,SQLFetch(hstmt1)就中断执行
    
int   i   =szid; 
CString   str; 
str.Format( "update msg_record  set  flag1=1 where id=%d ",   i); 
SQLExecDirect(hstmt1,   (SQLCHAR*)(LPCTSTR)str,   SQL_NTS); 
               } else {         break;      }   }
问题写在最后那句注释,请问retcode = SQLFetch(hstmt1);//移动光标 
在循环过程中,怎样取到当前游标,并且修改这条记录,却要保证循环继续执行?请前辈指较。

解决方案 »

  1.   

    在while中加上
    if(retcode == SQL_NO_DATA_FOUND)
    break;
      

  2.   

    sorry,刚才没有看清楚你的程序
    //SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);
    是Free掉hstmt1,加上肯定不行
    SQLFetch就是移位了
    这句str.Format( "update msg_record  set  flag1=1 where id=%d ",   i); 比较奇怪
    为什么老是flag1=1呢?
      

  3.   

    还有,你的update应该另外用一个HSTMT
      

  4.   


    这个程序就需要将 查询得到并且处理过的数据 将之flag1变成1,这个没有奇怪的吧。
      

  5.   

    update应该另外用一个HSTMT的话,也就是将上面程序中的   //SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);
       // SQLAllocStmt(hdbc1,&hstmt1);
    注释行去掉,这样将导致SQLFetch(hstmt1)中断执行,循环就能执行条语句了。所以我的问题是:
    请问retcode = SQLFetch(hstmt1);//移动光标  
    在当前循环过程中,怎样取到当前游标,并且修改这条记录,却要保证循环继续执行?