Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
ВнизTpFibsdatabase и Dll Найти похожие ветки
← →
yaric (2003-12-04 18:14) [0]Привет всем у меня возникла следующая проблема кто знает
помогите:
открываю из длл библиотеки форму на котрой лежит
TpFibTransaction, Database передается как параметр из основного приложения. Передача параметров проходит нормально, однако когда
я пытаюсь как то работать через эту БД возникают ошибки при вызове метода TpFibDataset.Open
← →
Vlad (2003-12-04 18:23) [1]Ты не привел ни сообщения об ошибке ни пример кода своей программы. Телепаты в отпуске.
← →
yaric (2003-12-04 18:35) [2]Привожу
Длл:
library mdidll;
uses
SysUtils,
Classes,
Forms,
pFibDatabase,
uBookOptions in "uBookOptions.pas" {frmBookOptions},
uMain_Book_Ini in "uMain_Book_Ini.pas";
var
DA : TApplication;
DS : TScreen;
procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin
DS := Screen;
Screen := TScreen(Scr);
DA := Application;
Application := TApplication(App);
end;
procedure DonePlugin; StdCall;
begin
Screen := DS;
Application := DA;
end;
function CreateMDI(AOwner:TComponent; Database:TpFibDatabase; FS:TFormStyle; Book_Date:TDateTime): integer; StdCall;
begin
Result :=integer(TfrmBookOptions.Create(AOwner,Database,FS,Book_Date));
end;
exports
InitPlugin,
DonePlugin,
CreateMDI;
begin
end.
← →
Sandman25 (2003-12-04 18:37) [3]procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin
Выделенную строку лучше убрать.
← →
yaric (2003-12-04 18:39) [4]Коструктор формы которая вызывается из библиотеки
constructor TfrmBookOptions.Create(AOwner: TComponent;
Database: TpFibDatabase;FS:TFormStyle; Curr_Date:TdateTime;);
begin
inherited Create(AOwner);
self.formstyle:=FS;
WorkDatabase:=Database;
ReadTransaction.DefaultDatabase:=Database;
WriteTransaction.DefaultDatabase:=Database;
Curr_data:=Curr_Date;
end;
← →
yaric (2003-12-04 18:40) [5]А почему выделенную строку нужно убрать?
← →
Sandman25 (2003-12-04 18:41) [6]Потому что тем самым
DS := Screen
присваивает значение локальной переменной (которая дальше даже не используется), а не модульной, как планировалось.
← →
yaric (2003-12-04 18:42) [7]Место в методе формы где происходит ошибка
procedure TfrmBookOptions.GetCurrRazdStDBInfo;
var date_str:string;
temp_dataset:TpFibDataSet;
begin
dateTimetostring(date_str,"dd.mm.yyyy", Curr_data);
temp_dataset:=TpFibDataSet.Create(self);
temp_dataset.Database:=WorkDatabase;
temp_dataset.Transaction:=ReadTransaction;
try
temp_dataset.SQLs.SelectSQL.Text:=" SELECT * FROM BU_SPR_RAZD_ST_SELECT("+""""+date_str+""""+","+IntToStr(DEFAULT_ROOT_ID)+") WHERE ID_RAZD_ST="+IntToStr(Curr_Id_RzdSt);
temp_dataset.Open--!!Вот здесь происходит Access Violation;
← →
yaric (2003-12-04 18:44) [8]Да согласен сглупил
А может какие идеи есть насчет ошибки связанной с Open?
← →
Sandman25 (2003-12-04 18:46) [9]>А может какие идеи есть насчет ошибки связанной с Open?
Почти никаких, кроме того, что, возможно, не стоит создавать формы с владельцем Application.
FIBDataset я никогда не использовал и даже не видел, помочь ничем не могу.
← →
yaric (2003-12-04 18:49) [10]А почему не рекомендуется создавать формы с владельцем Application?
← →
Sandman25 (2003-12-04 18:51) [11]Это же Application не DLL, а хоста (вызывающего приложения).
При таком создании в Application хоста добавляется ссылка на эту форму DLL, и при выходе из программы Application попытается ее очистить, вызывая тем самым access violation.
← →
yaric (2003-12-04 18:57) [12]Спасибо >>Sandman25 разъяснил
Ну кто нибуть теперь подскажите что делать с коннектом к БД??
← →
Johnmen (2003-12-04 18:57) [13]>yaric
Нажимай последовательно:
File-New-Other-DLL Wisard получишь болванку для библиотеки.
Внимательнейшим образом прочти закомментаренный текст !
:)))
← →
Vlad (2003-12-04 19:13) [14]
> Johnmen © (04.12.03 18:57) [13]
Думаешь из-за ShareMem? Она ведь вроде при работе со стрингами нужна ?
Мне кажется что в момент вызова библиотечной процедуры экземпляр TpFibDatabase не создан.
← →
yaric (2003-12-04 19:13) [15]Я прочитал
та мнаписано что проблемы могут возникнуть с передачей
параметров типа string но я же с параметрами таких типов не работаю. Так в чем тогда дело
← →
yaric (2003-12-04 19:15) [16]yaric>>vlad
а как его создать
← →
Vlad (2003-12-04 19:17) [17]Если он у тебя на форме лежит, то он сам создастся в момент создания формы. Если же ты его динамически создаешь, то так:
FibDatabase1:=TpFibDatabase.Create(nil)
Затем заполнить нужные проперти, и только после этого вызывать библиотечную процедуру.
← →
yaric (2003-12-04 19:20) [18]Так посмотри я же это делаю
текст метода в котором происходит ошибка я привел
← →
yaric (2003-12-04 19:21) [19]Так посмотри я же это делаю
текст метода в котором происходит ошибка я привел
← →
Vlad (2003-12-04 19:23) [20]Может я чего не вижу (вечер уже и устал), но по моему ты создаешь экземпляр TpFibDataSet, а где создается TpFibDatabase - не видно. Видно лишь что она передается в процедуру в кач-ве параметра.
← →
yaric (2003-12-04 19:35) [21]А TpFibDatabase передается через параметры в функцию которая
из длл вызывается
← →
Vlad (2003-12-04 19:42) [22]Для проверки можешь вот перед этой строчкой
temp_dataset.Open
написать следующее:
if Assigned(WorkDataBase) then showmessage ("Vlad © был не прав") else showmessage ("Vlad © был прав")
О результатах увиденного сообщи
← →
yaric (2003-12-04 19:49) [23]"Vlad © был не прав"
а ошибка все равно осталась
я тут потрейсил немного и оказалось
что ошибка возникает когда я пытаюсь начать транзакцию
в длл
← →
Vlad (2003-12-04 19:53) [24]
> yaric (04.12.03 19:49) [23]
Так, уже лучше.
Но что-то в коде не видно, где ты пытаешься начать транзакцию.
← →
yaric (2003-12-04 19:55) [25]А когда я метод Open вызываю то сам temp_dataset
проверяет если транзакция к которой он привязан на
активна то стартует ее
← →
Vlad (2003-12-04 19:59) [26]
> yaric (04.12.03 19:55) [25]
Сие означает что у temp_dataset есть событие BeforeOpen и ты его не привел или еще что-то умалчиваешь.
← →
yaric (2003-12-04 20:02) [27]Не ну ты же видишь(см.код) что я создаю локальный экземпляр TpFibDataSet
и ни какие BeforeOpen я для него не определяю
← →
Vlad (2003-12-04 20:04) [28]
> yaric (04.12.03 20:02) [27]
Тогда как вот это понимать ?
> я тут потрейсил немного и оказалось
> что ошибка возникает когда я пытаюсь начать транзакцию
> в длл
Еще раз спрашиваю - где ты пытаешься начать транзакцию ?
← →
Johnmen (2003-12-05 09:14) [29]>Vlad ©
Да, похоже дело не в шаремем...
>где ты пытаешься начать транзакцию ?
Просто она стартует неявно, если указано в опциях фибдатасета poStartTransaction=True...
>yaric
Приведи (еще раз) вызов процедуры из приложения и ее реализацию в длл.
← →
yaric (2003-12-05 11:17) [30]>>Johnmen
Да ты прав транзакция действительно стартует неявно
и как оказывается стартует нормально
Я тут еще потрейсил немного и оказывается бока наступают когда
мы залазим внутрь класса TpFibDataSet. Пока разобраться не могу
может у кого какая идея по этому поводу есть
← →
Vlad (2003-12-05 12:14) [31]Возможно переменная temp_dataset объявлена еще где-то, помимо
процедуры TfrmBookOptions.GetCurrRazdStDBInfo
И еще одно маленькое предположение, попробуй вместо
temp_dataset:=TpFibDataSet.Create(self);
написать
temp_dataset:=TpFibDataSet.Create(nil);
← →
yaric (2003-12-05 15:53) [32]Попробовал эффект тотже
то же самое когда пытаюсь передавать в библиотеку и транзакцию
← →
yaric (2003-12-05 15:54) [33]Попробовал эффект тотже
то же самое когда пытаюсь передавать в библиотеку и транзакцию
← →
Vlad (2003-12-05 18:52) [34]Тогда мыслей больше нет.
Если только в вызове процедуры что-то не так, хотя...
Ответь-ка на Johnmen © (05.12.03 09:14) [29]
← →
yaric (2003-12-08 12:28) [35]Все народ всем спасибо
разобрался
просто надо передавать в библиотеку DBHandle: TISC_DB_HANDLE
и все нормально,
но соединение должно быть уже установленно
а в конце работы приложения вызывать еще одну функцию из библиотеки которая будет рубить коннект
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.011 c