要做的程序大意是:
从数据库查询flag1=0的所有数据,得到一条后,把该信息发送,随后将flag1置为1,循环,至所有的数据flag1都为1.
下面是代码,问题就是红色注释那里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); 
SQLGetData(hstmt1,7, SQL_C_CHAR, szmsg, 50,   &cbmsg);          //////////////////////////////////////////////
          中间是发送函数
         //////////////////////////////////////////////



    //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;      }   }

解决方案 »

  1.   

    直接用ODBC就是比较麻烦,循环读取要自己滚动记录,你没有滚动,所以每次都读取当前记录,当然会死循环。
    至于后面再执行一次SQLExecDirect,就犯了逻辑错误了,执行SQLExecDirect之后,当前记录就是这个语句的结果,而update语句好像是不返回记录的。即使返回,也不是你需要的结果。可以用另外一个hstmt2来使其得以执行,但是,结果还是错的。
    方法是先用滚动循环读取记录,读取完之后再修改,也就是说:
    int   i   =szid; 
    CString   str; 
    str.Format( "update msg_record  set  flag1=1 where id=%d ",   i); 放到外面,这样就行了:
    SQLExecDirect(hstmt1,   (SQLCHAR*)"update msg_record  set  flag1=1 where flag=0 ",   SQL_NTS); 
      

  2.   

    to   Mackz :
    把SQLExecDirect(hstmt1,   (SQLCHAR*)"update msg_record  set  flag1=1 where flag=0 ",   SQL_NTS); 
    放到外面,我没有弄清是放到哪里,我试着分别放到if  else 的外面和while 的外面,这句话就又不被执行了,数据库中flag1都没有修改。
    请  Mackz 在指点一下,万般感谢
      

  3.   

    当然是循环外面。完整一点可以这样:
    // SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);这个要和上面对应
    SQLAllocStmt(hdbc1,&hstmt1);
    SQLExecDirect(hstmt1, (SQLCHAR*)"update msg_record  set  flag1=1 where flag=0 ", SQL_NTS); 
    SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);
      

  4.   

    恩,明白您的意思了,
    我的问题没有说明白一点,就是数据库的数据是在随时增加的,用户会随时添加flag1=0的信息到库中。所以,
    发送和修改不能分开操作。