Добрый день! Пытаюсь средствами ODBC вставить строку данных в mdb-базу. Пытаюсь сделать это с помощью SQLBulkOperations, ничего не получается. Подскажите где ошибка, вот кусок кода (инициализация SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQLDriverConnect, SQL_HANDLE_STMT опущена): Код (Text): ; --- Задаем размер записи для построчного связывания invoke SQLSetStmtAttr, hStmt, SQL_ATTR_ROW_BIND_TYPE, sizeof(ROW), 0 or AX, AX jnz @exit_stmt ; --- Указываем, что вставляется одна строка invoke SQLSetStmtAttr, hStmt, SQL_ATTR_ROW_ARRAY_SIZE, 1, 0 or AX, AX jnz @exit_stmt ; --- Связывание столбцов invoke SQLBindCol, hStmt, 1, SQL_C_LONG, offset DataRow.id, 4, offset size_id or AX, AX jnz @exit_stmt invoke SQLBindCol, hStmt, 2, SQL_C_LONG, offset DataRow.value, 4, offset size_value or AX, AX jnz @exit_stmt ; --- SQLBulkOperations invoke SQLBulkOperations, hStmt, SQL_ADD or AX, AX jnz @exit_stmt
Чтобы вставить строку (SQLBulkOperations), нужно в начале указать в какую таблицу Для этого выполняем запрос: Код (Text): szExecTable db "select * from main", 0 invoke SQLExecDirect, hStmt, addr szExecTable, SQL_NTS Вложил исходник - потомкам пригодится. 330774131__odbc.zip
Пытаюсь эту программу прогнать на сервере Oracle 10g Все отлично выполняется ODBC говорит что все прошло успешно. TCPDump показывает что данные на сервер ушли. Однако при просмотре данной таблицы выясняется что она пуста!!!! Что делать? Может есть еще какой-нибудь супер Commit
Значит не правильно коннектишся к драйверу оракла или еще что. Читай экзелиона. Приведи полный пример и лог просмотрщика траффика, если данные не добавились - на то есть причина. SQLGetDiagRec то же бы не мешало вызывать, чтоб понять суть ошибки
Пример программы Строка подключения к драйверу через 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