![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
InterBase. Попытка соединения с локальной БД в режиме Run-Time [D7, XP]
Vasiliy © (2007-10-14 11:40:00)Здравствуйте, уважаемые мастера.
Помогите пожалуйста со следующим вопросом.
Пытаюсь провести соединение в режиме 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.
Или тут нужно подходить к решению этого вопроса по другому.
Заранее благодарен. Спасибо.
С уважением.
Vasiliy (2007-10-15 18:46:00) [1]Почитал русскую справку по Win32API.
Там все предельно ясно сказано, однако ошибка то остается...
Германн (2007-10-15 18:33:00) [2]
> В чем может быть проблема использования GetCurrentDirectory.
Читай хелп по CurrentDirectory.
Vasiliy (2007-10-15 18:28:00) [3]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.
С уважением.
DrPass (2007-10-14 23:32:00) [4]
> EvS © (14.10.07 23:04) [7]
Молодец, бери конфетку :)))
EvS (2007-10-14 23:04:00) [5]FileBase := Database_Path;
FileBase := FileBase+'\Saon\PA_L-530.GDB' ;
MainBase_IBDataBase.DatabaseName:= Database_Path ;
DrPass (2007-10-14 22:55:00) [6]
> Да я действительно проверял, путь получается верный. Пошаговым
> выполнением осуществлял
В любом случае замени, т.к. GetCurrentDirectory далеко не всегда указывает на каталог программы :)
Если путь, говоришь, правильный - тогда вероятен другой вариант. Ты используешь для работы с базой локальный протокол/embedded-версию, а это предполагает монопольный доступ к базе. Т.е. если у тебя запущена Delphi, и в дизайнтайме IBDatabase имеет Active=true, программа при попытке соединиться с той же базой получит отлуп.
Vasiliy (2007-10-14 19:32:00) [7]Извеняюсь, у что то у меня так лагнуло, что два сообщения одни и те же.
Vasiliy (2007-10-14 19:29:00) [8]>>>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:00) [9]>>>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.
Anatoly Podgoretsky (2007-10-14 12:56:00) [10]> Vasiliy (14.10.2007 11:40:00) [0]
А почему ты пытаешься указать первый попавшийся каталог?
> GetCurrentDirectory(255,Database_Path);
А что будет если Database_Path будет свыше 255 символов.
DrPass (2007-10-14 11:52:00) [11]
> Но когда работаю в режиме Design-Time и задаю в свойстве
> инстпектора объектов тот же путь то все работает.
А ты все-таки проверь, там тот же путь, что и здесь получается FileBase := FileBase+'\Saon\PA_L-530.GDB', или все-таки нет?
Вполне вероятно, что нет - т.к. GetCurrentDirectory возвращает не папку, где программа лежит, а текущий каталог. Папку программы можно получить как ExtractFilePath(Application.ExeName)