Пробую простейший пример: Код (Text): #include <windows.h> #include <sqlext.h> #define MAX_INSERT_COUNT 10 int main() { SQLCHAR szConn[1024]; SQLCHAR szConnectString[] = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=D:\\Temp\\db1.mdb"; SQLSMALLINT dwStrLen; SQLINTEGER i, id[MAX_INSERT_COUNT+1]; SQLCHAR name[MAX_INSERT_COUNT][40], txt[MAX_INSERT_COUNT][60]; SQLHANDLE hEnv; SQLHANDLE hConn; SQLHSTMT hstmt; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn); SQLDriverConnect(hConn, NULL, szConnectString, sizeof(szConnectString), szConn, 1024, &dwStrLen, SQL_DRIVER_COMPLETE); SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hstmt); SQLExecDirect(hstmt, "DROP TABLE t_bulk_insert;", SQL_NTS); SQLExecDirect(hstmt, "CREATE TABLE t_bulk_insert (id INT, v VARCHAR(100), txt TEXT);", SQL_NTS); SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_STATIC, 0); //fails SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)MAX_INSERT_COUNT, 0); SQLSetStmtAttr(hstmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_ROWVER, 0); //fails SQLBindCol(hstmt, 1, SQL_C_LONG, id, 0, NULL); SQLBindCol(hstmt, 2, SQL_C_CHAR, name, sizeof(name[0]), NULL); SQLBindCol(hstmt, 3, SQL_C_CHAR, txt, sizeof(txt[0]), NULL); SQLExecDirect(hstmt, "SELECT id, v, txt FROM t_bulk_insert;", SQL_NTS); for (i = 0; i < MAX_INSERT_COUNT; i++) { id[i]= i; wsprintf((char *)name[i], "Varchar%d", i); wsprintf((char *)txt[i], "Text%d", i); } SQLBulkOperations(hstmt, SQL_ADD); //fails SQLFreeStmt(hstmt, SQL_UNBIND); SQLFreeStmt(hstmt, SQL_CLOSE); SQLCloseCursor(hstmt); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hConn); SQLFreeHandle(SQL_HANDLE_DBC, hConn); SQLFreeHandle(SQL_HANDLE_ENV, hEnv); return 0; } Комментарием fails отмечены функции, завершающиеся с ошибкой SQL_ERROR. Если кто-то разбирался с этой темой, прошу помощи.
Вот строчки из диагностического лога: Код (Text): ... zlotest c88-efc ENTER SQLSetStmtAttr SQLHSTMT 00892138 SQLINTEGER 6 <SQL_ATTR_CURSOR_TYPE> SQLPOINTER 0x00000003 SQLINTEGER 0 zlotest c88-efc EXIT SQLSetStmtAttr with return code -1 (SQL_ERROR) SQLHSTMT 00892138 SQLINTEGER 6 <SQL_ATTR_CURSOR_TYPE> SQLPOINTER 0x00000003 SQLINTEGER 0 DIAG [24000] [Microsoft][Диспетчер драйверов ODBC] Недопустимое состояние курсора (0) ... zlotest c88-efc ENTER SQLSetStmtAttr SQLHSTMT 00892138 SQLINTEGER 7 <SQL_ATTR_CONCURRENCY> SQLPOINTER 0x00000003 SQLINTEGER 0 zlotest c88-efc EXIT SQLSetStmtAttr with return code -1 (SQL_ERROR) SQLHSTMT 00892138 SQLINTEGER 7 <SQL_ATTR_CONCURRENCY> SQLPOINTER 0x00000003 SQLINTEGER 0 DIAG [24000] [Microsoft][Диспетчер драйверов ODBC] Недопустимое состояние курсора (0) ... zlotest c88-efc ENTER SQLBulkOperations SQLHSTMT 00892138 SQLSMALLINT 4 zlotest c88-efc EXIT SQLBulkOperations with return code -1 (SQL_ERROR) SQLHSTMT 00892138 SQLSMALLINT 4 DIAG [HY092] [Microsoft][Драйвер ODBC Microsoft Access]Недопустимый идентификатор атрибута или параметра (87)