我打算用SQLBulkOperations进行数据集删除,现在出现的问题是,我设定预想是一次删除100行,但实际数据库里只有61行被删除了。
由于不太了解这个方法,只是参照MSDN写的代码,不知道是哪里出了问题,希望了解的前辈加以指导。不尽感谢!
代码如下
----------------------------------------------------------------------------------------------------------
typedef struct tagCustStruct {
   SQLCHAR Book[10];
   SQLINTEGER BookLen;
} CustStruct;无关声明略
     int iRowCount = 100;
    SQLUSMALLINT   RowStatusArray[100];
    SQLINTEGER     BindOffset = 0;
    CustStruct     CustArray[4000];    SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN, 0);
    SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)SQL_BIND_BY_COLUMN, 0);
    SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)iRowCount, 0);
    SQLSetStmtAttr(hstmt, SQL_ATTR_USE_BOOKMARKS, (SQLPOINTER)SQL_UB_VARIABLE, 0);
    SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER)RowStatusArray, 0);
    SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_OFFSET_PTR, &BindOffset, 0);    // 绑定BOOKMARK列
    rc = SQLBindCol(hstmt, 0, SQL_C_VARBOOKMARK, CustArray[0].Book, sizeof(CustArray[0].Book), &CustArray[0].BookLen);    // 绑定表的其他各列
    for (int i = 0; i < iColCount; i++) {
        SQLBindCol(hstmt, i+1, SQL_C_WCHAR, (SQLWCHAR *)DataPtr + OffsetArray[i],
                   ColLenArray[i], &m_cbData);
    }    // 执行SQL (SELECT COL1, COL2, COL3 FROM TABLE 类似这样的SQL)
    rc = SQLExecDirectW(hstmt, (SQLWCHAR *)lpSQL, SQL_NTS);
    if(RC_NOTSUCCESSFUL(rc)){
        DaCheckResult(SQL_HANDLE_STMT, hstmt);
        return DA_NG;
    }    int iCount = 0;    // 循环结果集
    while((rc = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0)) != SQL_ERROR)
    {
        // 没有数据则跳出
        if(rc == SQL_NO_DATA_FOUND) break;        // 执行次数
        ++iCount;
        // 结果集内数据全部删除(例:100行)
        rc = SQLBulkOperations(hstmt, SQL_DELETE_BY_BOOKMARK);
        if(rc == SQL_NO_DATA_FOUND) break;        if(RC_NOTSUCCESSFUL(rc)){
            DaCheckResult(SQL_HANDLE_STMT, hstmt);
            return DA_NG;
        }
        // COMMIT函数
        DaEndTran(true);
    }
    
希望大家帮忙,只有65分 都给了。

解决方案 »

  1.   

    没用过SQLBulkOperations,不过msdn上面不是由例子的么?好好看看
    SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)iRowCount, 0);
    SQLBulkOperations(hstmt, SQL_DELETE_BY_BOOKMARK);
    需要循环么?不是块状删除么?
      

  2.   

    你在这一句后加一个判断看看:
    rc = SQLBulkOperations(hstmt, SQL_DELETE_BY_BOOKMARK); 
            if(rc == SQL_SUCCESS) 
               {count++; //这里才记录有效的删除行}
            else
               {...这里提示是第几行出错}
     
    说明一下:
    成功返回SQL_SUCCESS,如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值。 你还要检查一下是否总记录行数足够,是否取得某一句出错,是否由于加了while条件导致记录数不足等等。