27.04.2006, 12:35 | #1 |
Участник
|
Help! DLL описание функции в аксапте
Доброго всем времени суток
есть DLL с заголовком на С. Требуется произвести вызов из аксапты. Проблема в том, что не работает. На С прототип выглядит так: Код: ISC_STATUS ISC_EXPORT isc_attach_database (ISC_STATUS ISC_FAR *, short, char ISC_FAR *, isc_db_handle ISC_FAR *, short, char ISC_FAR *); Код: isc_attach_database = new DllFunction(GDS32, "isc_attach_database"); isc_attach_database.returns(ExtTypes::DWord); isc_attach_database.arg(ExtTypes::Pointer, ExtTypes::Word, ExtTypes::String, ExtTypes::Pointer, ExtTypes::Word, ExtTypes::String); Код: isc_db_handle DB; ISC_STATUS status_vector[20]; short dpb_buf_len=20; char dpb_buf[]={ isc_dpb_version1, //версия буфера isc_dpb_user_name, //начинается кластер параметра имя пользователя 6, //длина этого параметра 6 байт 'S','Y','S','D','B','A', //строка имени пользователя isc_dpb_password, //начинается кластер пароля пользователя 9, //длина его 9 байт 'm','a','s','t','e','r','k','e','y' //сам пароль }; isc_attach_database(status_vector, strlen(str), str, &DB,dpb_buf_len,dpb_buf)); Подскажите, плз, в чем грабли... |
|
27.04.2006, 12:58 | #2 |
Участник
|
Цитата:
Сообщение от ivas
Код: isc_attach_database(status_vector, strlen(str), str, &DB,dpb_buf_len,dpb_buf)); В Аксапте, как и в Java нет операции взятия адреса. Это принципиальное отличие джавы от C. Во-вторых, чтобы передать область памяти нельзя использовать аксаптовский массив. Массив в Аксапте намного более сложная штука, чем кажется. Читайте доку. Чтобы передавать параметры наружу лучше использовать SafeArray. Он же используется для работы с Variant. Опять же поищите доку и примеры использования в семействе классов tutorial* |
|
27.04.2006, 13:10 | #3 |
Участник
|
Цитата:
Цитата:
Сообщение от ivas Код: isc_attach_database(status_vector, strlen(str), str, &DB,dpb_buf_len,dpb_buf)); Во-первых, я не знаю что означает конструкция &DB в Аксапте. в аксапте инициализируем как DB = new Binary(4); |
|
27.04.2006, 13:18 | #4 |
Участник
|
в аксапте вызываем так:
Код: isc_attach_database.call(status, strlen(DB_name), DB_name, DB, 20, dpb)) Код: Binary status = new Binary(80); Binary dpb = new Binary(20); dpb.byte(0, #isc_dpb_version1); dpb.byte(1, #isc_dpb_user_name); dpb.byte(2, 6); dpb.string(3, 'SYSDBA'); dpb.byte(9, #isc_dpb_password); dpb.byte(10, 9); dpb.string(11, 'MASTERKEY'); |
|
27.04.2006, 13:29 | #5 |
Участник
|
Цитата:
Сообщение от ivas
это код на С ...
в аксапте инициализируем как DB = new Binary(4); Тогда непонятно. Посмотрите, например, классы WinAPI WinAVI ChartFX BarCode и его потомков HeapLog чтобы увидеть примеры использования. |
|
27.04.2006, 13:48 | #6 |
Участник
|
в общем стоит задача подключиться к бд InterBase и при этом получить курсор который можно апдейтить
стандартное подключение с помощью odbc драйвера работает, но при попытке апдейта курсора система говорит Цитата:
Метод 'Update' в COM-объекте класса '_Recordset' возвратил код ошибки 0x800A0CB3 (<неизвестно>), который означает:
Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки. в котором определена масса методов работы с курсором и подключение можно выполнить через ODBC драйвер. Может кто подскажет как использовать эти классы с префиксом DSO их структура оч. похожа на CCADOConnection, CCADORecordset Последний раз редактировалось ivas; 27.04.2006 в 13:52. |
|
27.04.2006, 14:44 | #7 |
злыдень
|
Какой драйвер? Gemini ?
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
27.04.2006, 15:52 | #8 |
Участник
|
драйвер firebird
и gemini тоже есть оба работают... вопрос в апдейте указателя |
|
27.04.2006, 15:56 | #9 |
злыдень
|
Лови..
PHP код:
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
27.04.2006, 15:57 | #10 |
злыдень
|
Не влез гад..
Это через джемини и CCAdo
PHP код:
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
27.04.2006, 16:02 | #11 |
Участник
|
А почему у Вас последний параметр в C объявлен как char*, в Ax ExtTypes::string, а передается Binary(20)? Axpata так не въедет. Нужно либо объявлять как ExtTypes::Pointer, либо передавать как string
|
|
27.04.2006, 16:15 | #12 |
Участник
|
спасибо заответ, но имелось в виду несколько другое у тебя апдейт происходит с помощью явно заданного sql запроса, это мы делать умеем
необходимо нечто вроде этого: Код: command.activeConnection(cn); command.commandText("select * from goods"); rs = command.execute(); while (!rs.eof()) { rs.recordSet().Update(2, "aaaa"); rs.moveNext(); } Цитата:
А почему у Вас последний параметр в C объявлен как char*, в Ax ExtTypes::string, а передается Binary(20)? Axpata так не въедет. Нужно либо объявлять как ExtTypes::Pointer, либо передавать как string
сейчас выдает ошибку idc_login тоесть видимо жрет последний параметр но неможет его развернуть пробовали и как pointer и как dpb.string(0) (в первом варианте) не работает... |
|
27.04.2006, 16:36 | #13 |
Участник
|
косяк нашли
вот в этой строке: PHP код:
PHP код:
|
|
27.04.2006, 16:42 | #14 |
злыдень
|
Ты добился обновляемого резалтсета??? Драйвера ж его не поддерживают!, во всяком случае джемини...
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
27.04.2006, 16:57 | #15 |
Участник
|
Мы подключили базу с помощью DLL. %)))
Кстати, почему Цитата:
Драйвера ж его не поддерживают!, во всяком случае джемини...
А как себя ведет FireBird? И что на счет классов DSO*, в частности DSORecordset? Там же есть поддержка курсора на обновление и т.д..... а оно должно работать с любым ODBC драйвером... |
|
27.04.2006, 17:05 | #16 |
злыдень
|
Дело не в СУБД и не в классах. Сами драйвера не позволяют. Обсуждалось например здесь
Аксапта в качестве клиента для фаербёрда - это прикольно , туда ей и место
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
27.04.2006, 19:15 | #17 |
Administrator
|
Есть рабочий примерчик.... Но правда как было верно подмечено на sql.ru - работает на Access. Не проверял на других БД.
X++: // Экспорт из Axapta через ADO в другую базу данных заданной таблицы static void tutorial_WriteADO(Args _args) { CCADOConnection cn = new CCADOConnection(); CCADOCommand command = new CCADOCommand(); CCADORecordset rcs; Str connectionString; str tableName = "VENDTABLE"; FilePath filePath = "D:\\zz.mdb"; anytype newValue; #CCADO ; connectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;'; connectionString += 'Data Source=' + filePath + ';'; connectionString += 'Mode=ReadWrite;'; connectionString += 'Persist Security Info=False'; cn.open(connectionString); rcs = new CCADORecordset(); rcs.open(tableName, cn, #adOpenKeyset, #adLockOptimistic, #adCmdTable); rcs.addNew(); for (i = 1; i <= rcs.fields().count(); i++) { rcs.fields().itemIdx(i - 1).setValue(newValue); } rcs.update(); } методы: X++: void addNew() { recordSet.AddNew(); } void update() { recordSet.update(); } X++: // Установка значения (real, date, int, str) void setValue(anytype _value) { switch (typeof(_value)) { case Types::Date: field.value(COMVariant::createFromDate(_value)); break; case Types::Enum, Types::Integer: field.value(COMVariant::createFromInt(_value)); break; case Types::Real: field.value(COMVariant::createFromReal(_value)); break; case Types::RString, Types::String, Types::VarString: field.value(COMVariant::createFromStr(_value)); break; default: field.value(COMVariant::createNoValue()); } } Поэтому обновляемые рекордсеты не сильно распространены. Гораздо гибче и удобнее SQL - операторы UPDATE, INSERT, DELETE
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 27.04.2006 в 19:22. |
|