SQLSetPos()的问题。高分!!

andy_lau 2003-05-07 02:28:57
程序中使用SQLSetPos()进行定位删除纪录。但总是调用失败!
那位兄弟有着方面的例子(删除例子),贴出来看看。
高分!!
...全文
163 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_lau 2003-05-08
  • 打赏
  • 举报
回复
你说的那些我都知道,但是调用sqlsetpos总是失败,我参照的是msdn上的例子
andy_lau 2003-05-08
  • 打赏
  • 举报
回复
我的代码如下:void CDelete_demoDlg::OnDeleteone()
{
if(!m_DB.Open("zss","sa","sa"))
{
AfxMessageBox("打开zss数据源失败");
return;
}


HSTMT hstmt,hstmtdel;
RETCODE rt=SQLAllocStmt(m_DB.m_hdbc,&hstmt);
rt=SQLAllocStmt(m_DB.m_hdbc,&hstmtdel);
//SQLSetStmtAttr(hstmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_LOCK , 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0);
//SQLSetStmtAttr(hstmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0);
SQLSetStmtOption(hstmt,SQL_CONCURRENCY,SQL_CONCUR_LOCK);
//SQLSetStmtOption(hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_FORWARD_ONLY);
SQLSetCursorName(hstmt, (unsigned char*)"curt", SQL_NTS);

//SQLPrepare(hstmtdel, (unsigned char*)"DELETE FROM zss1 WHERE CURRENT OF curt", SQL_NTS);

__int64 nbigint;
char szchar[100];
long cbbig,cbchar;
long big=8;
long char1=100;

//得到内容
CString strTable="zss1";
char pszSQL[256];
sprintf(pszSQL,"select * from %s",strTable);
//AfxMessageBox(pszSQL);
rt=SQLExecDirect(hstmt,(UCHAR*)pszSQL, SQL_NTS);
if(!SQL_SUCC(rt))
{
AfxMessageBox("ExecDirect Fail!");
return;
}

//rt=SQLBindCol(hstmt, 1, SQL_C_SBIGINT, &nbigint,8, &cbbig);
if(!SQL_SUCC(rt))
{
AfxMessageBox("Bind bigint fail!");
return;
}
//rt=SQLBindCol(hstmt, 2, SQL_C_CHAR, szchar,100, &cbchar);
if(!SQL_SUCC(rt))
{
AfxMessageBox("Bind char Fail!");
return;
}


int count=0;
while ((rt = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0)) != SQL_ERROR)\
{
if (rt == SQL_NO_DATA_FOUND)
break;
count++;
if(count==1)
{
rt=SQLSetPos(hstmt,0,SQL_DELETE,SQL_LOCK_NO_CHANGE);
if(rt!=SQL_SUCCESS)
{
AfxMessageBox("SetPos Fail!");
return;
}
//AfxMessageBox("begin to del");
//rt=SQLExecDirect(hstmt,(unsigned char*)"DELETE FROM zss1 WHERE CURRENT OF curt", SQL_NTS);
if(rt!=SQL_SUCCESS)
{
AfxMessageBox("del Fail!");
return;
}


}

}
CString strNum;
strNum.Format("num=%d",count);
AfxMessageBox(strNum);



}
andy_lau 2003-05-08
  • 打赏
  • 举报
回复
谁有使用sqlsetpos进行定位删除纪录的例子,贴出来看看。
高分相赠
maoxianwang 2003-05-07
  • 打赏
  • 举报
回复
应用程序对数据源的数据更新可以通过三种方式实现:使用相应的SQL语句在数据源上执行;调用函数SQLSetPos实现记录集的定义更新;调用函数SQLBulkOperations实现数据的更新。

直接在数据源上执行SQL语句的方式,可以适用于任何的ODBC数据源,但是,对于后两种更新方式,有的数据源并不支持,应用程序可以调用函数SQLGetInfo确定数据源是否支持这两种方式。


定位更新和删除

要使用定位更新和删除功能,要按如下顺序:

1)取回记录集:

2)定位到要进行更新或删除操作的行

3)执行更新或删除操作

 

参考如下的代码:

#define ROWS 20#define STATUS_LEN 6

SQLCHAR szStatus[ROWS][STATUS_LEN], szReply[3];

SQLINTEGER cbStatus[ROWS], cbOrderID;

SQLUSMALLINT rgfRowStatus[ROWS];

SQLUINTEGER sOrderID, crow = ROWS, irow;

SQLHSTMT hstmtS, hstmtU;

SQLSetStmtAttr(hstmtS, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0);

SQLSetStmtAttr(hstmtS, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0);

SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) ROWS, 0);

SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) rgfRowStatus, 0);

SQLSetCursorName(hstmtS, "C1", SQL_NTS);

SQLExecDirect(hstmtS, "SELECT ORDERID, STATUS FROM ORDERS ", SQL_NTS);

SQLBindCol(hstmtS, 1, SQL_C_ULONG, &sOrderID, 0, &cbOrderID);

SQLBindCol(hstmtS, 2, SQL_C_CHAR, szStatus, STATUS_LEN, &cbStatus);

while ((retcode == SQLFetchScroll(hstmtS, SQL_FETCH_NEXT, 0)) != SQL_ERROR) {

if (retcode == SQL_NO_DATA_FOUND) break;

for (irow = 0; irow < crow; irow++) {

if (rgfRowStatus[irow] != SQL_ROW_DELETED)

printf("%2d %5d %*s\n", irow+1, sOrderID, NAME_LEN-1, szStatus[irow]);

} while (TRUE) { printf("\nRow number to update?");

gets(szReply); irow = atoi(szReply);

if (irow > 0 && irow <= crow) { printf("\nNew status?");

gets(szStatus[irow-1]);

SQLSetPos(hstmtS, irow, SQL_POSITION, SQL_LOCK_NO_CHANGE);

SQLPrepare(hstmtU,

"UPDATE ORDERS SET STATUS=? WHERE CURRENT OF C1", SQL_NTS);

SQLBindParameter(hstmtU, 1, SQL_PARAM_INPUT,

SQL_C_CHAR, SQL_CHAR,

STATUS_LEN, 0, szStatus[irow], 0, NULL);

SQLExecute(hstmtU); } else if (irow == 0) { break; }

}

}


用SQLBulkOperations()更新数据

函数SQLBulkOperations的操作是基于当前行集的,在调用函数SQLBulkOperations之前,必须先调用函数SQLFetch或SQLFetchScroll获取行集,然后,再执行修改或删除操作。

 

函数格式:

SQLRETURN SQLBulkOperations(SQLHSTMT StatementHandle,

SQLUSMALLINT Operation);

 

参数:

StatementHandle 参数句柄

Operation 标识执行的操作类型,可以是以下几种之一:

SQL_ADD

SQL_UPDATE_BY_BOOKMARK

SQL_DELETE_BY_BOOKMARK

SQL_FETCH_BY_BOOKMARK

 

返回值:

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE

成功返回SQL_SUCCESS,如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值。

 
maoxianwang 2003-05-07
  • 打赏
  • 举报
回复
我也没看啊

我先看看的
andy_lau 2003-05-07
  • 打赏
  • 举报
回复
看了n编msdn,还是不行,苦闷!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧