ODBC: SQLBulkOperations - как вставить строку данных?

Тема в разделе "WASM.WIN32", создана пользователем Kozyr__, 23 янв 2006.

  1. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Добрый день!



    Пытаюсь средствами ODBC вставить строку данных в mdb-базу. Пытаюсь сделать это с помощью SQLBulkOperations, ничего не получается. Подскажите где ошибка, вот кусок кода (инициализация SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQLDriverConnect, SQL_HANDLE_STMT опущена):
    Код (Text):
    1.         ; --- Задаем размер записи для построчного связывания
    2.         invoke SQLSetStmtAttr, hStmt, SQL_ATTR_ROW_BIND_TYPE, sizeof(ROW), 0
    3.         or     AX, AX
    4.         jnz    @exit_stmt
    5.  
    6.         ; --- Указываем, что вставляется одна строка
    7.         invoke SQLSetStmtAttr, hStmt, SQL_ATTR_ROW_ARRAY_SIZE, 1, 0
    8.         or     AX, AX
    9.         jnz    @exit_stmt
    10.  
    11.         ; --- Связывание столбцов
    12.         invoke SQLBindCol, hStmt, 1, SQL_C_LONG, offset DataRow.id,    4, offset size_id
    13.         or     AX, AX
    14.         jnz    @exit_stmt
    15.  
    16.         invoke SQLBindCol, hStmt, 2, SQL_C_LONG, offset DataRow.value, 4, offset size_value
    17.         or     AX, AX
    18.         jnz    @exit_stmt
    19.        
    20.         ; --- SQLBulkOperations
    21.         invoke SQLBulkOperations, hStmt, SQL_ADD
    22.         or     AX, AX
    23.         jnz    @exit_stmt
     
  2. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Чтобы вставить строку (SQLBulkOperations), нужно в начале указать в какую таблицу :)

    Для этого выполняем запрос:
    Код (Text):
    1. szExecTable              db  "select * from main", 0
    2. invoke SQLExecDirect, hStmt, addr szExecTable, SQL_NTS


    Вложил исходник - потомкам пригодится.

    [​IMG] 330774131__odbc.zip
     
  3. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Пытаюсь эту программу прогнать на сервере Oracle 10g

    Все отлично выполняется ODBC говорит что все прошло успешно. TCPDump показывает что данные на сервер ушли.

    Однако при просмотре данной таблицы выясняется что она пуста!!!!

    Что делать?

    Может есть еще какой-нибудь супер Commit
     
  4. Guest

    Guest Guest

    Публикаций:
    0


    Значит не правильно коннектишся к драйверу оракла или еще что. Читай экзелиона.

    Приведи полный пример и лог просмотрщика траффика, если данные не добавились - на то есть причина. SQLGetDiagRec то же бы не мешало вызывать, чтоб понять суть ошибки
     
  5. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Пример программы

    Строка подключения к драйверу через SQLDriverConnect

    такая

    'DRIVER={Microsoft ODBC for Oracle};UID=SB;PWD=jhnjgtl;SERVER=SBORA;'



    таблица Temp имеет два поля типа Number

    'ID' и 'VALUE'



    После выполнения SQLBulkOperation al=SQL_SUCCESS

    SQLGetDiagRec возвращает SQL_NO_DATA



    struc Row id,sizeid, Value, sizevalue

    {

    .id DD id

    .sizeid DD sizeid

    .Value DD Value

    .sizevalue DD sizevalue

    }



    probe Row 1, 4,100,4

    _InsertCall DB 'Select * from Temp',0





    invoke SQLAllocHandle, SQL_HANDLE_STMT, [BDDATA.hConn], InsertCallSTMT



    invoke SQLSetStmtAttr, [InsertCallSTMT], SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_DYNAMIC, 0

    invoke SQLSetStmtAttr, [InsertCallSTMT], SQL_ATTR_CONCURRENCY, SQL_CONCUR_LOCK, 0

    invoke SQLSetStmtAttr, [InsertCallSTMT], SQL_ATTR_ROW_ARRAY_SIZE, 1, 0

    invoke SQLSetStmtAttr, [InsertCallSTMT], SQL_ATTR_ROW_BIND_TYPE, 16, 0



    mov ebx, probe

    mov esi,ebx

    add esi,4

    invoke SQLBindCol, [InsertCallSTMT],1, SQL_INTEGER, ebx,0, esi

    add ebx,8

    add esi,8

    invoke SQLBindCol, [InsertCallSTMT],2, SQL_INTEGER, ebx,0, esi

    invoke SQLExecDirect, [InsertCallSTMT], _InsertCall,SQL_NTS



    invoke SQLBulkOperations, [InsertCallSTMT], SQL_ADD



    invoke SQLEndTran, SQL_HANDLE_DBC, [BDDATA.hConn],0

    invoke SQLFreeStmt, [InsertCallSTMT], SQL_CLOSE