Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.068 c