Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

InterBase. Попытка соединения с локальной БД в режиме Run-Time   Найти похожие ветки 

 
Vasiliy   (2007-10-14 11:40) [0]

Здравствуйте, уважаемые мастера.
Помогите пожалуйста со следующим вопросом.
Пытаюсь провести соединение в режиме run-time с локальной базой IB.
И при запуске выдается ошибка доступа к файлу базы данных.
Работа кода предполагается при событии OnCreate главной формы.
Вот код:

GetCurrentDirectory(255,Database_Path);  
FileBase := Database_Path;
FileBase := FileBase+"\Saon\PA_L-530.GDB";

MainBase_IBDataBase.DatabaseName:=Database_Path;
MainBase_IBDataBase.LoginPrompt := False;

MainBase_IBDataBase.Params.Insert(0,"user_name=SYSDBA");
MainBase_IBDataBase.Params.Insert(0,"password=masterkey");
MainBase_IBDataBase.Params.Insert(0,"lc_ctype=CYRL");

MainBase_IBDataBase.AllowStreamedConnected := True;
MainBase_IBDataBase.Connected := True;

MainBase_IBTransaction.Active := True;

MainBase_IBQuery.Active := True;

Дело в том что возможно качевание данной проги, работающей с БД,
на разные диски и т.д. Поэтому здесь я и определяю строку с путем
к файлу БД, и пытаюсь соединиться с ней через компонент MainBase_IBDataBase. И выходит ошибка доступа к БД. Вроде как все правильно. Но когда работаю в режиме Design-Time и задаю в свойстве инстпектора объектов тот же путь то все работает.

Не подскажите, может есть еще какой то параметр, который при изменений свойства в инспекторе объекта среда Дельфи ее тут же выставляет и поэтому все работает.
Если это так, то подскажите пожалуйста что это за параметр, чтобы его
задать в режиме Run-Time.

Или тут нужно подходить к решению этого вопроса по другому.

Заранее благодарен. Спасибо.
С уважением.


 
DrPass ©   (2007-10-14 11:52) [1]


> Но когда работаю в режиме Design-Time и задаю в свойстве
> инстпектора объектов тот же путь то все работает.

А ты все-таки проверь, там тот же путь, что и  здесь получается FileBase := FileBase+"\Saon\PA_L-530.GDB", или все-таки нет?
Вполне вероятно, что нет - т.к. GetCurrentDirectory возвращает не папку, где программа лежит, а текущий каталог. Папку программы можно получить как ExtractFilePath(Application.ExeName)


 
Anatoly Podgoretsky ©   (2007-10-14 12:56) [2]

> Vasiliy  (14.10.2007 11:40:00)  [0]

А почему ты пытаешься указать первый попавшийся каталог?

> GetCurrentDirectory(255,Database_Path);  

А что будет если Database_Path будет свыше 255 символов.


 
Vasiliy   (2007-10-14 19:29) [3]

>>>DrPass ©   (14.10.07 11:52) [1]
Да я действительно проверял, путь получается верный. Пошаговым выполнением осуществлял.  В том то и дело когда запускаю прогу, то идет возвращение папки где находится сама программа. Но я попробую поэкспериментировать с функцией ExtractFilePath(Application.ExeName).

>>>Anatoly Podgoretsky ©   (14.10.07 12:56) [2]
Не первый, а лишь тот где находится исполняемая программа. А там будет находится соответствующая другая папка, которую я указываю в программе, где и будет находиться сама БД. Это я делаю в случае, если эту программу перепишут на другой диск, скажем D: или E:. И чтобы программа работала я пока решил сделать так, на этапе разработки. Конечно, конечный вариант расположения БД можно обдумать. Но пока чтобы подготовить правильный код для работы с БД решил сделать так.
Что касается количества символов в Database_Path пока я думаю что не должен превысить числа 255. Объявлен он у меня как :
Var Database_Path: array[0..254] of Char;
Хотя вопрос конечно поставлен верно, я не задумывался над этим.Надо подумать, хотя пока не пришло в голову как лучше реализоваться это, учитывая что для API нужен PChar, а раздувать массив изначально пока не вижу смысла. Хотя идеи приветствуются.

И все же надеюсь подскажите, что не так в моем коде подключения к БД InterBase в run-time.

С уважением, Vasiliy.


 
Vasiliy   (2007-10-14 19:29) [4]

>>>DrPass ©   (14.10.07 11:52) [1]
Да я действительно проверял, путь получается верный. Пошаговым выполнением осуществлял.  В том то и дело когда запускаю прогу, то идет возвращение папки где находится сама программа. Но я попробую поэкспериментировать с функцией ExtractFilePath(Application.ExeName).

>>>Anatoly Podgoretsky ©   (14.10.07 12:56) [2]
Не первый, а лишь тот где находится исполняемая программа. А там будет находится соответствующая другая папка, которую я указываю в программе, где и будет находиться сама БД. Это я делаю в случае, если эту программу перепишут на другой диск, скажем D: или E:. И чтобы программа работала я пока решил сделать так, на этапе разработки. Конечно, конечный вариант расположения БД можно обдумать. Но пока чтобы подготовить правильный код для работы с БД решил сделать так.
Что касается количества символов в Database_Path пока я думаю что не должен превысить числа 255. Объявлен он у меня как :
Var Database_Path: array[0..254] of Char;
Хотя вопрос конечно поставлен верно, я не задумывался над этим.Надо подумать, хотя пока не пришло в голову как лучше реализоваться это, учитывая что для API нужен PChar, а раздувать массив изначально пока не вижу смысла. Хотя идеи приветствуются.

И все же надеюсь подскажите, что не так в моем коде подключения к БД InterBase в run-time.

С уважением, Vasiliy.


 
Vasiliy   (2007-10-14 19:32) [5]

Извеняюсь, у что то у меня  так лагнуло, что два сообщения одни и те же.


 
DrPass ©   (2007-10-14 22:55) [6]


> Да я действительно проверял, путь получается верный. Пошаговым
> выполнением осуществлял

В любом случае замени, т.к. GetCurrentDirectory далеко не всегда указывает на каталог программы :)

Если путь, говоришь, правильный - тогда вероятен другой вариант. Ты используешь для работы с базой локальный протокол/embedded-версию, а это предполагает монопольный доступ к базе. Т.е. если у тебя запущена Delphi, и в дизайнтайме IBDatabase имеет Active=true, программа при попытке соединиться с той же базой получит отлуп.


 
EvS ©   (2007-10-14 23:04) [7]

FileBase := Database_Path;
FileBase := FileBase+"\Saon\PA_L-530.GDB";

MainBase_IBDataBase.DatabaseName:=Database_Path;


 
DrPass ©   (2007-10-14 23:32) [8]


> EvS ©   (14.10.07 23:04) [7]

Молодец, бери конфетку :)))


 
Vasiliy   (2007-10-15 18:28) [9]

DrPass ©   (14.10.07 23:32) [8]

Извеняюсь, это опечатка. И все в коде я давно уже поправил так как указано.
Вроде проблема решилась, исполузуя ExtractFilePath(Application.ExeName).
Вот код:

FileBase := ExtractFilePath(Application.ExeName);
FileBase := FileBase+"Saon\PA_L-530.GDB";


Но вот использование функции GetCurrentDirectory(255,Database_Path) вызывает ошибку доступа, описанную выше.
В чем может быть проблема использования GetCurrentDirectory.

С уважением.


 
Германн ©   (2007-10-15 18:33) [10]


> В чем может быть проблема использования GetCurrentDirectory.

Читай хелп по CurrentDirectory.


 
Vasiliy   (2007-10-15 18:46) [11]

Почитал русскую справку по Win32API.
Там все предельно ясно сказано, однако ошибка то остается...



Страницы: 1 вся ветка

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
4-1178464604
sinus
2007-05-06 19:16
2007.11.11
Запустить программу от имени другого пользователя


2-1192797770
Neo
2007-10-19 16:42
2007.11.11
поиск топ100


3-1183576692
lavrenty
2007-07-04 23:18
2007.11.11
Не срабатывает Refresh


8-1168929934
_Dimm
2007-01-16 09:45
2007.11.11
DSPack - PlayCap


2-1192617485
malyar
2007-10-17 14:38
2007.11.11
месага от колёсика мыши