|  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. | 
|  |