要做的程序大意是:
从数据库查询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; } }
从数据库查询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; } }
至于后面再执行一次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);
把SQLExecDirect(hstmt1, (SQLCHAR*)"update msg_record set flag1=1 where flag=0 ", SQL_NTS);
放到外面,我没有弄清是放到哪里,我试着分别放到if else 的外面和while 的外面,这句话就又不被执行了,数据库中flag1都没有修改。
请 Mackz 在指点一下,万般感谢
// 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);
我的问题没有说明白一点,就是数据库的数据是在随时增加的,用户会随时添加flag1=0的信息到库中。所以,
发送和修改不能分开操作。