Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.038 c
2-1192559427
Norm Iridium
2007-10-16 22:30
2007.11.11
Как слить два файла и отсортировать?


15-1191930668
Nucer
2007-10-09 15:51
2007.11.11
Как правильно писать программы?


8-1168776768
andr1962
2007-01-14 15:12
2007.11.11
Помогите с directdraw


2-1192716272
AntonS
2007-10-18 18:04
2007.11.11
Уничтожить класс в другой форме.


2-1192513567
F@T@L_Err0r
2007-10-16 09:46
2007.11.11
COM1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский