SQLBulkOperations [ODBC] и массовый импорт в БД

Тема в разделе "LANGS.C", создана пользователем koderr, 16 сен 2007.

  1. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Пробую простейший пример:

    Код (Text):
    1. #include <windows.h>
    2. #include <sqlext.h>
    3.  
    4. #define MAX_INSERT_COUNT 10
    5.  
    6. int main()
    7. {
    8.     SQLCHAR szConn[1024];
    9.     SQLCHAR szConnectString[] = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=D:\\Temp\\db1.mdb";
    10.     SQLSMALLINT dwStrLen;
    11.  
    12.     SQLINTEGER i, id[MAX_INSERT_COUNT+1];
    13.     SQLCHAR name[MAX_INSERT_COUNT][40], txt[MAX_INSERT_COUNT][60];
    14.  
    15.     SQLHANDLE hEnv;
    16.     SQLHANDLE hConn;
    17.     SQLHSTMT hstmt;
    18.  
    19.     SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
    20.     SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);
    21.     SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn);
    22.  
    23.     SQLDriverConnect(hConn, NULL, szConnectString, sizeof(szConnectString), szConn, 1024, &dwStrLen, SQL_DRIVER_COMPLETE);
    24.  
    25.     SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hstmt);
    26.  
    27.     SQLExecDirect(hstmt, "DROP TABLE t_bulk_insert;", SQL_NTS);
    28.     SQLExecDirect(hstmt, "CREATE TABLE t_bulk_insert (id INT, v VARCHAR(100), txt TEXT);", SQL_NTS);
    29.  
    30.     SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_STATIC, 0);  //fails
    31.     SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)MAX_INSERT_COUNT, 0);
    32.     SQLSetStmtAttr(hstmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_ROWVER, 0);  //fails
    33.  
    34.     SQLBindCol(hstmt, 1, SQL_C_LONG, id, 0, NULL);
    35.     SQLBindCol(hstmt, 2, SQL_C_CHAR, name, sizeof(name[0]), NULL);
    36.     SQLBindCol(hstmt, 3, SQL_C_CHAR, txt, sizeof(txt[0]), NULL);
    37.  
    38.     SQLExecDirect(hstmt, "SELECT id, v, txt FROM t_bulk_insert;", SQL_NTS);
    39.  
    40.  
    41.     for (i = 0; i < MAX_INSERT_COUNT; i++)
    42.     {
    43.         id[i]= i;
    44.         wsprintf((char *)name[i], "Varchar%d", i);
    45.         wsprintf((char *)txt[i],  "Text%d", i);
    46.     }
    47.  
    48.     SQLBulkOperations(hstmt, SQL_ADD);  //fails
    49.  
    50.     SQLFreeStmt(hstmt, SQL_UNBIND);
    51.     SQLFreeStmt(hstmt, SQL_CLOSE);
    52.  
    53.     SQLCloseCursor(hstmt);
    54.     SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    55.  
    56.     SQLDisconnect(hConn);
    57.  
    58.     SQLFreeHandle(SQL_HANDLE_DBC, hConn);
    59.     SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    60.  
    61.     return 0;
    62. }
    Комментарием fails отмечены функции, завершающиеся с ошибкой SQL_ERROR.
    Если кто-то разбирался с этой темой, прошу помощи.
     
  2. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Вот строчки из диагностического лога:

    Код (Text):
    1. ...
    2.  
    3. zlotest         c88-efc ENTER SQLSetStmtAttr
    4.         SQLHSTMT            00892138
    5.         SQLINTEGER                   6 <SQL_ATTR_CURSOR_TYPE>
    6.         SQLPOINTER          0x00000003
    7.         SQLINTEGER                   0
    8.  
    9. zlotest         c88-efc EXIT  SQLSetStmtAttr  with return code -1 (SQL_ERROR)
    10.         SQLHSTMT            00892138
    11.         SQLINTEGER                   6 <SQL_ATTR_CURSOR_TYPE>
    12.         SQLPOINTER          0x00000003
    13.         SQLINTEGER                   0
    14.  
    15.         DIAG [24000] [Microsoft][Диспетчер драйверов ODBC] Недопустимое состояние курсора (0)
    16.  
    17. ...
    18.  
    19. zlotest         c88-efc ENTER SQLSetStmtAttr
    20.         SQLHSTMT            00892138
    21.         SQLINTEGER                   7 <SQL_ATTR_CONCURRENCY>
    22.         SQLPOINTER          0x00000003
    23.         SQLINTEGER                   0
    24.  
    25. zlotest         c88-efc EXIT  SQLSetStmtAttr  with return code -1 (SQL_ERROR)
    26.         SQLHSTMT            00892138
    27.         SQLINTEGER                   7 <SQL_ATTR_CONCURRENCY>
    28.         SQLPOINTER          0x00000003
    29.         SQLINTEGER                   0
    30.  
    31.         DIAG [24000] [Microsoft][Диспетчер драйверов ODBC] Недопустимое состояние курсора (0)
    32.  
    33. ...
    34.  
    35. zlotest         c88-efc ENTER SQLBulkOperations
    36.         SQLHSTMT            00892138
    37.         SQLSMALLINT                  4
    38.  
    39. zlotest         c88-efc EXIT  SQLBulkOperations  with return code -1 (SQL_ERROR)
    40.         SQLHSTMT            00892138
    41.         SQLSMALLINT                  4
    42.  
    43.         DIAG [HY092] [Microsoft][Драйвер ODBC Microsoft Access]Недопустимый идентификатор атрибута или параметра  (87)