Как сделать дистриб программы работы с БД?

Ivanopulo

Ситуация такая: На Delphi на писал программу работы с базой данных. База локальная (не удаленная формата MS Access, состоит из одной таблицы. Физически - один файл. Так вот, в программе для работы с БД используется Microsoft Access Driver. Запросы реализованы на SQL. Для работы использованы компонеты TTable и TQuery (SQL запросы). Программа работает на компе, где была написана. Если просто скопировать прогу и БД на другой комп, то выдается ошибка (системная, если нужно, могу привести ее содержание). Если на тот комп поставить Delphi (и все что входит в пакет дистриба то при запуске выдает, что "неизвестный псевдоним бла-бла-бла)"(Unknow Alias бла-бла-бла что исправляется настройками через Delphi.
Вопрос: как сделать так, чтобы пользователю, который у себя захочет поставить эту прогу, не пришлось самостоятельно ставить Delphi, и производить настройки?
Несколько раз пробовал создать дистриб через Install Shield Express. Дистриб создался, но после установки оного - не работает. Может неправильно создавал, так дохрена настроек, может версия не та. Кто знает/работал с Install Shield ткните что надо там настроить.
Еще, как вариант, пусть пользователю все же придется ставить Delphi (или отдельно BDE то как сделать так, чтобы программа внесла настройки сама?
В общем Help! времени мало. Посоветуйте, плз, что делать.

0000

Ботай как создавать ODBC-alias программно. Иначе каждый раз придется при установки проги запускать odbcad32 и там прописывать.
TTable и TQuery - эти компоненты работают через BDE вроде, что заставит тебя везде еще и BDE ставить. Попробуй переписать прогу на ADO или DAO компоненты.
Вот код создания алиасов через DBE (моё, архивное)

//Идентификатор базы, используещейся Dialer
hDb: hDBIDb;
...

//Инициализация BDE и создание временной базы DialerDB.
procedure StartBDE;
begin
DbiInit(nil); //Инициализируем BDE
//Добавляем временный алиас
DbiAddAlias(nil,'DialerDB',szDBASE,PChar('path: '+TmpPathTrue);
//Открываем базу по имени
DbiOpenDataBase('DialerDB',szDBASE,dbiREADWRITE,dbiOPENSHARED,nil,0,nil,nil, hDB);
DbiSetDirectory(hDB,PChar(TmpPath;
end;

//Уничтожение временной базы DialerDB и прекращение работы с BDE.
procedure StopBDE;
begin
DbiCloseDataBase(hDB); //Закрываем базу
DbiDeleteAlias(nil,'DialerDB'); //Удаляем Алиас
DBIExit; //Прекращаем работу с BDE
end;

Ivanopulo

Спасибо!
Только при употреблении в коде DbiInit... и попытке скомпилировать вылазит сообщение "Unknow identifier". М.б. что-нибудь надо в uses... дописать?

0000

uses BDE;

Andbar

Во-первых, можно работать вообще без алиасов, передавая вместо них полный путь к директории.
Во-вторых, не знаю, как с акцессовскими таблицами, но если используются Paradox-овские таблицы, точно можно не ставить весь BDE, а только тащить за собой несколько файликов... Про последнее написано в Kuliba.chm (устаревший, но всё-таки довольно хороший справочник советов по Delphi)...

0000

BDE насколько я помню все равно алиас будет создавать, когда по имени щемится.
Вместо Кулибы, лучше www.drkb.ru - крупнейший упорядоченный архив статей по Delphi.
Да и вообще, BDE это уже как FoxPro. Лучше про него вовсе забыть и использовать нечто более современное.
Аффтор топика выпей яда или перестань BDE использовать. Ну плииииззз!

Andbar

BDE насколько я помню все равно алиас будет создавать, когда по имени щемится.
гм... Ни разу не наблюдал такого самовольства.

0000

Вполне возможно, что я нагнал. Я BDE использовал 4 года назад, как первый опыт работы с SQL и первой программой, которую надо было для работы сделать, так что я тогда может не так что понял.
Указанный код это ужастное использование в Delphi, потому как это BDE API =)

kill-still

Зачем тебе прописание псевдонима?!?!?!
Если бы ты коннектился к серваку с БД, то да. А тут всё необходимое компилятор внутрь экзэшника запихнёт.
Опиши подключение к базе динамически:
   UserConnection: TADOConnection;
....
....
UserConnection.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=';
UserConnection.ConnectionString:=UserConnection.ConnectionString+UserDBPath+';';
UserConnection.ConnectionString:=UserConnection.ConnectionString+'Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="*****";';
UserConnection.ConnectionString:=UserConnection.ConnectionString+'Jet OLEDB:Engine Type=4;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;';
UserConnection.ConnectionString:=UserConnection.ConnectionString+'Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;';
UserConnection.ConnectionString:=UserConnection.ConnectionString+'Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
....
try
UserConnection.Open;
except
MessageDlg('Файл '+UserDBPath+' отсутствует или поврежден!', mtError, [mbOk],0);
exit;
end;


И забудь про создание псевдонимов.
Вот.

0000

Это ниче, что у него BDE компоненты использованы, а код у тебя для ADO?

kill-still

И чО, долго чтоли вместо TDatabase адоконнекшн зафигачить?
Я так понимаю у него вообще статика, там делов на 5 минут, если всё прямо написано.

kill-still

Если всё-таки решишь по своему делать:
 
# BLW32.DLL
# IDAPI32.DLL
# IDBAT32.DLL
# IDPDX32.DLL
# IDR20009.DLL
# USA.BLL
# CHARSET.BLL

* Раздел HKEY_LOCAL_MACHINE\Software\Borland\Database engine — параметр DLLPATH должен содержать путь к DLL-файлам BDE;
* Раздел HKEY_LOCAL_MACHINE\Software\Borland\BLW32 — параметр BLAPIPATH должен содержать путь к BLL-файлам BDE.

BDE тогда будет работать.
псевдоним можно динамически создавать.

Andbar

* Раздел HKEY_LOCAL_MACHINE\Software\Borland\Database engine — параметр DLLPATH должен содержать путь к DLL-файлам BDE; * Раздел HKEY_LOCAL_MACHINE\Software\Borland\BLW32 — параметр BLAPIPATH должен содержать путь к BLL-файлам BDE.
у меня, кажись, без этого работало, во всяком случае, инсталлер не прописывал ничего для бде.

Ivanopulo

Т.е. ты создавал дистрибутив с помощью програмы-инсталятора (типа Install Shield)? Если это так, то напиши, плиз, название проги, которой пользовался и настройки, которые ты вписал.

kill-still

Советую Inno Setup
на шилд даже лучше не смотри. =)

Andbar

Советую Inno Setup
+1.
Единствеенный минус: ассоциации для расширений файлов приходится ручками прописывать, т.е. нет специализированного средства...
А так - очень удобное и не слишком громоздкое средство

kill-still

Главное знать как это делается:
Root: HKCR; Subkey: ".моё"; ValueType: string; ValueName: ""; ValueData: "MyProgramDef"; Flags: uninsdeletevalue;
Root: HKCR; Subkey: "MyProgramDef"; ValueType: string; ValueName: ""; ValueData: "Мой Документ"; Flags: uninsdeletekey;
Root: HKCR; Subkey: "MyProgramDef\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\Прога.exe,0"; Flags: uninsdeletekey
Root: HKCR; Subkey: "MyProgramDef\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\Прога.exe"" ""%1"""; Flags: uninsdeletekey

kill-still

и не слишком громоздкое средство
Громоздкость зависит от сложности проекта =)

Andbar

Вместо 4х строчек для довольно-таки стандартного действия для инсталлятора (а по-хорошему, ещё надо проверять наличие уже заданной ассоциации и, возможно, спрашивать у юзера: мб. он не хочет переопределять) я хочу писать одну строчку. Ну, конечно, можно это через скрипты сделать, но, опять-же, многовато делать придётся.

kill-still

поставить просто в конце check: какая-нить_функция.

Andbar

поставить просто в конце check: какая-нить_функция.
Для каждого из ключей/значений? Мне кажется, что этого многовато. В конце концов, в секции файлов есть такой параметр как regserver, который регистрирует дллку. А ведь это действие тоже сводится к изменению реестра.
Повторюсь, имхо, это единственный недостаток Inno Setup.
Оставить комментарий
Имя или ник:
Комментарий: