我打算用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分 都给了。
由于不太了解这个方法,只是参照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分 都给了。
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)iRowCount, 0);
SQLBulkOperations(hstmt, SQL_DELETE_BY_BOOKMARK);
需要循环么?不是块状删除么?
rc = SQLBulkOperations(hstmt, SQL_DELETE_BY_BOOKMARK);
if(rc == SQL_SUCCESS)
{count++; //这里才记录有效的删除行}
else
{...这里提示是第几行出错}
说明一下:
成功返回SQL_SUCCESS,如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值。 你还要检查一下是否总记录行数足够,是否取得某一句出错,是否由于加了while条件导致记录数不足等等。