Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

Несколько вопросов о работе с БД Access   Найти похожие ветки 

 
Kostafey ©   (2006-01-26 23:11) [0]

Прошу совета у уважаемых мастеров по следующим вопросам:
  1)Есть некая БД, которая корректно работает только на PC с установленной Delphi и Access. Возможность запуска БД на PC без Delphi (но при условии наличия установленной Access) обеспечивает библиотека qtintf70.dll. Однако хотелось бы достичь независимоти программы и от самой Access. (При отсутствии Access выдает сообщение о том что не может найти драйвера по умолчанию).
  2)Даже при наличии на PC СУБД Acess и библиотеки qtintf70.dll, но отсутствии самой Delphi сетка (DBGrid) не отображет талицы, а только запросы - имеются ввиду не компоненты Table\Query, а таблицы и запросы самого файла БД (на PC с Delphi - все отображается без проблем)
 3)Как лучше всего произвести обновление отображения (например в той же сетке) изменений информации. Refresh - ничего не дает. Я же просто закываю и затем заново открываю наборы данных (Active:=false/true) - ясно, что это не рационально.
 Спасибо уже за то что дочитали это до конца. Буду признателен за Ваши советы.


 
sniknik ©   (2006-01-26 23:31) [1]

> Буду признателен за Ваши советы.
совет один - смени программиста, вернее найди и закажи ему программу если она еще нужна. т.к. эту писал ламер однозначно...

1) qtintf70.dll это замена об борланда линуксового QT, на котором там все овновано практически а в виндах он и даром не надь...
если прогу специально не делали с CLX вместо VCL то значит положили компонент другой (/использовали модули) с той платформы.
аксесс тут полностью ни при чем.

2) судя по компонентам использовалось BDE, а судя по отсутствию характерных сообщений об его отсутствии (дельфи не стоит и самостоятельно не ставился), вывод ощибок просто "стрятали"...
аксесс и тут полностью ни при чем. плюс не причем и дельфи (первый случай тоже под сомнением).

3) нормальный способ, а зачастую единственный...


 
Kostafey ©   (2006-01-26 23:46) [2]


> совет один - смени программиста, вернее найди и закажи ему
> программу если она еще нужна. т.к. эту писал ламер однозначно.
> ..

??? так я и пишу эту прогу, а что до ламера, то см. название раздела форума. :)

> если прогу специально не делали с CLX вместо VCL

Да, прога под VCL

>  положили компонент другой (/использовали модули) с той
> платформы

Какие к черту модули, при чем тут Linux. Доступ происходит через стандартный ADOConnection. Библиотеку  qtintf70.dll программа сама запрашивает.

>  судя по компонентам использовалось BDE

Это верно

>  вывод ощибок просто "стрятали"...

Тоже верно !

> аксесс и тут полностью ни при чем. плюс не причем и дельфи
> (первый случай тоже под сомнением).

А в как же таки обеспечить независимость от Аccess&Delphi ???

> 3) нормальный способ, а зачастую единственный...

Ok! Спасибо, правда уже при небольшом количестве записей происходит ощутимая пауза, а ведь БД даже не начала еще заполняться !


 
Kostafey ©   (2006-01-26 23:52) [3]


> >  вывод ощибок просто "стрятали"...
>
> Тоже верно !

Ох ! Не правда ! Оказывается ошибок нет вовсе !
Обработчиков ошибок на переключение таблиц/запросов нет -
ОШИБКА НЕ ВЫДАЕТСЯ, ХОТЯ ЕЕ ВЫВОД И НЕ СПРЯТАН, а сетка просто становится пустой при переключении с запроса на таблицу!


 
sniknik ©   (2006-01-27 00:02) [4]

> ??? так я и пишу эту прогу, а что до ламера, то см. название раздела форума. :)
а чего же ты пишеш "Есть некая БД"??? писал бы правду - "пишу программу ..."

> Какие к черту модули, при чем тут Linux. Доступ происходит через стандартный ADOConnection. Библиотеку
> qtintf70.dll программа сама запрашивает.
просто так не запросит... а раза запрашивает значит чтото из нее использовалось. библиотека предназначена для эмуляции(/кросплатформенности) программ на уровне кода, типа пишеш в винде после перекомпиляеш прогу в линуксе и получаеш программу для линукса, блаж конечно, но вот при том тут линух.

> А в как же таки обеспечить независимость от Аccess&Delphi ???
написать прогу правильно. (у каждого свои понятия правильности) примерный принцип - не использовать лишнего, а что нужно(без чего не удалось обойтись) таскать с собой (например включив в созданный для проги сетап).

по моему BDE в работе с аксесс явно лишнее, qt-шный модуль тоже, а прятать ошибки нехорошо... они для того и выводятся чтобы по ним судить о том что именно "глюкнуло".


 
sniknik ©   (2006-01-27 00:03) [5]

> а сетка просто становится пустой при переключении с запроса на таблицу!
а вот это похоже на знаменитую ошибку в 17й строке.


 
sniknik ©   (2006-01-27 00:12) [6]

> Обработчиков ошибок на переключение таблиц/запросов нет -
> ...
зато они есть до того... на открытии. насколько телепатор позволяет ход событий. запросы сделаны через ADO - "сетка" заполнена, таблицы в BDE - на открытии дало ошибку о неустановлености оного (которая "ушла" в никуда), открытие не состоялось датасет пустой... переключение на него - "сетка" пустая (ошибки нет! просто переключение на ранее сбойнуший датасет).


 
Kostafey ©   (2006-01-27 00:18) [7]


> а чего же ты пишеш "Есть некая БД"??? писал бы правду -
> "пишу программу ..."

Буду иметь в виду.

> из нее использовалось. библиотека предназначена для эмуляции(/кросплатформенности)...
не использовать лишнего

Ну уж насчет кросплатформенности, то норочно я ничего такого не вносил...
Хм. Да что же там может быть "лишнего" ???

uses DB, DBTables, ADODB; Qt, DBCtrls, Grids;

Вот и все вроде, по БД-то собственно, а остальное уже стандыртный набор для форм...

> по моему BDE в работе с аксесс явно лишнее, qt-шный модуль

Ух ты ! Вот СПАСИБО ! Удалил его - все без проблем откомпилировалось !

> а прятать ошибки нехорошо...

Это нужно для первого запуска программы на новом PC, когда она еще не нашла расположение БД, а компоненты е ней подключенные ее требуют

> > А в как же таки обеспечить независимость от Аccess&Delphi
> ???
> написать прогу правильно. (у каждого свои понятия правильности)
> примерный принцип - не использовать лишнего, а что нужно(без
> чего не удалось обойтись) таскать с собой (например включив
> в созданный для проги сетап).

Ну примерно это я и подозревал, но тут возникает ряд ламерских вопросов:
1) Что должен вклчать этот самый сетап ?
2) Как его сделать ?


 
Kostafey ©   (2006-01-27 00:26) [8]


> > а сетка просто становится пустой при переключении с запроса
> на таблицу!
> а вот это похоже на знаменитую ошибку в 17й строке.

С оной не знаком. Просветите неведующих.

> > Обработчиков ошибок на переключение таблиц/запросов нет
> зато они есть до того... на открытии. насколько телепатор
> позволяет ход событий. запросы сделаны через ADO - "сетка"
> заполнена,

До сих пор согласен

> таблицы в BDE - на открытии дало ошибку о неустановлености
> оного (которая "ушла" в никуда),

Как же это произошло, если на PC на котором пишется прога все работает как по маслу ?

>открытие не состоялось датасет пустой... переключение на него - "сетка" >пустая  (ошибки нет! просто переключение на ранее сбойнуший датасет).

Вообше то что ты говоришь похоже на првду. Хотя это и не дает ответ как бороться с этим багом.


 
Плохиш ©   (2006-01-27 00:34) [9]


> > а вот это похоже на знаменитую ошибку в 17й строке.
>
> С оной не знаком. Просветите неведующих.

Это говорит о том, что всем уже надоело телепатировать и пора бы привести проблеммный код.


 
Kostafey ©   (2006-01-27 00:38) [10]


> Это говорит о том, что всем уже надоело телепатировать и
> пора бы привести проблеммный код.

Дак я пытаюсь выянить где ж этот проблемный код (и в коде ли проблема вообще). Я могу хоть все исходники программы скинуть (по почте) - не вопрос.


 
Плохиш ©   (2006-01-27 00:42) [11]


> Kostafey ©   (27.01.06 00:38) [10]

Для чего существует встроенный в делфи отладчик знаешь?


 
Kostafey ©   (2006-01-27 00:45) [12]


> пора бы привести проблеммный код.

Хотя вот некие моменты:

function Start_DataBase(FileName:string):boolean;
begin
 BEGIN
   DB_Path:=FileName;
   try
     DataModule1.DB_Load(DB_Path);
   except
     DataModule1.ADOTable4.Active:=false;
     DataModule1.ADOConnection1.Connected:=false;
     Start_DataBase:=false;
     exit;
   end;
   with DataModule1 do
   begin
     ADOConnection1.Connected:=true;
     ADOTable1.TableName:="Code";
     ADOTable2.TableName:="Source";
     ADOTable3.TableName:="Author";
     ADOTable4.TableName:="Full";
     ADOTable1.Active:=true;
     ADOTable2.Active:=true;
     ADOTable3.Active:=true;
     ADOTable4.Active:=true;
   end;
   GridIni;
   Start_DataBase:=true;
 END;
end;
//.......
procedure TDataModule1.DB_Load(DB_Path:string);
begin
 ADOConnection1.Connected:=false;
 ADOConnection1.ConnectionString:=DataCall_h1+DB_Path+DataCall_h2+DB_Path;
 ADOConnection1.DefaultDatabase:=DB_Path;
 ADOConnection1.Connected:=true;
end;
//..........
//при этом:
const DataCall_h1:String="Provider=MSDASQL.1;Persist Security Info=False;Data Source=База данных MS Access;Extended Properties="DSN=База данных MS Access;DBQ=";
     DataCall_h2:String=";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;";Initial Catalog=";


Видимо ошибка в том что
     ADOTable1.TableName:="Code";
     ADOTable2.TableName:="Source";
     ADOTable3.TableName:="Author";
     ADOTable1.Active:=true;
     ADOTable2.Active:=true;
     ADOTable3.Active:=true;
не сработали (Code","Source","Author" - таблицы)
А вот запрос:
     ADOTable4.TableName:="Full";
     ADOTable4.Active:=true;
сработал.


 
Kostafey ©   (2006-01-27 00:46) [13]


> Для чего существует встроенный в делфи отладчик знаешь?

Да, но вот в чем трабл:
ПРОГРАММА НЕ ЗАПУСКАЕТСЯ В СРЕДЕ DELPHI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Работает только ее откомпилированный вариант !


 
Kostafey ©   (2006-01-27 00:49) [14]


> Плохиш ©   (27.01.06 00:42) [11]

Вы, похоже, мой вопрос(ы) не совсем поняли ?


 
sniknik ©   (2006-01-27 11:43) [15]

> Хм. Да что же там может быть "лишнего" ???
> uses DB, DBTables, ADODB; Qt, DBCtrls, Grids;
DBTables - BDE
Qt - QT

> Это нужно для первого запуска программы на новом PC, когда она еще не нашла расположение БД, а компоненты е ней
> подключенные ее требуют
бред. не могут они ничего требовать пока ты сам не скахеш им чтото выполнить... так вот до этого проверяй на присетствие базы и все, а ошибку на подключении всетаки раскрой (то что база есть еще недостаточно чтобы гарантировано подключилось... ошибка скажет почему не удалось)

> Как же это произошло, если на PC на котором пишется прога все работает как по маслу ?
на компе где работает все нужное установлено (еще бы на нем же и писалось) и ошибок нет

> Дак я пытаюсь выянить где ж этот проблемный код (и в коде ли проблема вообще).
занимаясь самообманом и пряча от себя же сообщения о критичных ошибках? не наш метод.

> Хотя вот некие моменты:
переписать все! нафих! срочно!!!!
ADOTable1 - это самый жуткий баг борланда в адо, категорически не рекомендуется не то что использовать, но даже смотреть на него...

> //при этом:
> const DataCall_h1:String="Provider=MSDASQL.1;Persist Security
> Info=False;Data Source=База данных MS Access;Extended Properties="DSN=База
> данных MS Access;DBQ=";
>      DataCall_h2:String=";DriverId=25;FIL=MS Access;MaxBufferSize=2048;
> PageTimeout=5;";Initial Catalog=";

используется ODBC-шный DSN который может быть на другом языке, или полностью отсутствовать... ты его уставливал? тогда зачем пользуешся?
всеэто меняется на
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+База+";Persist Security Info=False"

> не сработали (Code","Source","Author" - таблицы)
а ты этого не сам хотел? а зачем exit; тогда?


 
msguns ©   (2006-01-27 13:06) [16]

Судя по всему, у него еще в проекте стоит Active=true всем датасетным компонентам и, естно, соответствующему коннекту


 
Kostafey ©   (2006-01-27 18:34) [17]


> > Это нужно для первого запуска программы на новом PC, когда
> она еще не нашла расположение БД, а компоненты е ней
> > подключенные ее требуют
> бред. не могут они ничего требовать пока ты сам не скахеш
> им чтото выполнить... так вот до этого проверяй на присетствие
> базы и все, а ошибку на подключении всетаки раскрой (то
> что база есть еще недостаточно чтобы гарантировано подключилось.
> .. ошибка скажет почему не удалось)

Ну хорошо, а как же тогда "загасть" ошибку попытки открытия БД если неизвестен ее путь ?

> Хм. Да что же там может быть "лишнего" ???
> DBTables - BDE
> ADOTable1 - это самый жуткий баг борланда в адо, категорически
> не рекомендуется не то что использовать, но даже смотреть
> на него...

Возможно, я его сам первый раз использую, а что же тогда применить вместо него ? Разве можно использовать обычные Table ? И если так, то как  из БД "достать" таблицы и запросы ?

> "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+База+";Persist
> Security Info=False"

А по какому принципу пишется этот Provider=...

> > не сработали (Code","Source","Author" - таблицы)
> а ты этого не сам хотел? а зачем exit; тогда?

exit -есть нормальное явление когда не найден сам физческий файл БД


 
YurikGL ©   (2006-01-28 08:47) [18]


> Ну хорошо, а как же тогда "загасть" ошибку попытки открытия
> БД если неизвестен ее путь ?

Перед компиляцей программы у всех ADOConnection, ADOTable, ADODataset и т.д. выставляй active в false;
Активируй их лишь тогда, когда надо, например в onShow главной формы.
Тогда ошибку можно будет "загасить" так


try
ADOConnection1.Properties["Data Source"].Value:=nastr.basepath;//путь к базе
ADOConnection1.Connected:=true;
except
showMessage("База не найдена."):
end;


nastr.basepath я раньше загрузил из ini-файла...


> Возможно, я его сам первый раз использую, а что же тогда
> применить вместо него ?

Очень советую использовать связку ADOConnection+ADODataset.


 
sniknik ©   (2006-01-28 10:53) [19]

> showMessage("База не найдена."):
это тоже неправильно.
база может быть залокирована/открыта в монопольном режиме кемто другим, у тебя может не быть прав на ее чтение/директория где она лежит для тебя закрыта, испорчена в конце концов/не база а просто файл с таким именем... возможно чтото еще.
а ты заменил весь спектр возможных ошибок на безликое "База не найдена."... если ты только для подобных сообщений try except используеш, то лучше не используй вообще. т.к. подобные "русификации" очень потом усложняют сопровождение программы.


 
YurikGL ©   (2006-01-28 14:18) [20]


> sniknik ©   (28.01.06 10:53) [19]

Исправляюсь...

> Ну хорошо, а как же тогда "загасть" ошибку попытки открытия
> БД если неизвестен ее путь ?

Ее путь все равно где-то должен храниться. Если он неизвестен, то строка, хранящая путь либо должна быть пустая либо должна содержать известный (хотя возможно и неверный путь). Тогда нужно просто посмотреть: если строчка пустая, то сказать пользователю, что путь к базе не задан. Если не пустая, то попробовать присоединиться через try..except и в случае исключения выдать пользователю сообщение о том, что "базу открыть невозможно, причинами этого могут быть...то что указал sniknik..."


 
sniknik ©   (2006-01-28 15:23) [21]

> "базу открыть невозможно, причинами этого могут быть...то что указал sniknik..."
лучше дать стандартный мессейдж стандартной ошибки (что и выдается без try except), там будет конкретное и явное указание причины, а не перечислять (я например не могу себе представить всех возможных причин от чего не отроется, а уж ковырятся перебирать варианты вместо точного знания от чего это, так просто заломает).


 
YurikGL ©   (2006-01-28 22:49) [22]


> sniknik ©   (28.01.06 15:23) [21]

типа такого?
   
   try
...
   except
     on e:exception do
       raise Exception.Create("Невозможно подключиться к базе. Причина ошибки:"+#13+e.Message);
   end;


 
sniknik ©   (2006-01-29 00:34) [23]

> типа такого?
ну можно и так. стардарта сам понимаеш нет, дело личных предпочтений, самое главное чтобы инфа не терялась.

но сам я делаю немного по другому

procedure ErrorMsgToLog(const Msg: string; E: Exception);
var
 F: TextFile;
 isExists: boolean;
 wMsg: string;
begin
 try
   DateTimeToString(wMsg, "dd/mm/yyyy hh:nn:ss:zzz", Now);
   isExists:= FileExists(Err_File);
   if isExists then CutLog(Err_File, Err_Size);
   AssignFile(F, Err_File);
   if isExists then Append(F)
                else Rewrite(F);
   if isExists then WriteLn(F, #13#10"["+wMsg+"]")
                else WriteLn(F, "["+wMsg+"]");
   WriteLn(F, Msg);
   WriteLn(F, E.ClassName+" : "+E.Message);
   Flush(F);
   CloseFile(F);
 except {NOTHING} end;
end;

procedure TScaleForm.DoIfErrof(const Msg: string; E: Exception);
begin
 ErrorMsgToLog(Msg, E);
 Application.MessageBox(PChar(E.Message), BOX_ERR, MB_OK or MB_ICONSTOP or MB_TASKMODAL);
end;

procedure TScaleForm.SetAccessMode;
begin
 try
   ....
 except
   on E: Exception do DoIfErrof("Список весов. Переоткрытие при настройке доступа.", E);
 end;
end;


т.е. попутно сохраняю ошибку в лог, со временем когда произошло, где произошло (мое сообщение), классом и сообщением самого ексепта.
очень помогает потом, от раздраженных любителей говорить загадками "- у вас глюк в программе разберитесь...", "- а что за глюк? сообщение приведите" "- а я знаю? ваша программа, ваши глюки разбирайтесь!!!". читаеш потом логи, и видиш что "наши" глюки это на самом деле проблемы сети, сбой на дисках, и т.д. и т.п.
от того чей это глюк кстати, после зависит сумма на счете... т.что доказательства не повредят.

плюс перекрываю Application.OnException, только там мое сообщение (где произошло) носит глобальный "оттенок"  - "Ошибка приложения" . т.е. получается разделяю на предусмотренные (там где закрыл по try except)  ошибки и не предусмотренные. (в принципе основное внимание как раз на непредусмотренные глюки надо обращать, так получается, потому как если предусмотрено на открытии возможность "неоткрытия" базы, то это работа внедренцев, не туда базу положили/... т.д. разберутся, а если ошибка есть и в том месте где ты и не предполагал... то это уже лично твое)


 
Kostafey ©   (2006-01-29 15:28) [24]

Значит установил на своем PC пустую ОС - Windows2000 и начал экспериментировать.
Отключил обработку ошибок. Установил на новой ОС Access.
Вот что получилось.
Пишет сообщение:
[Microsoft][OBC Driver Manager] Data source name not found and no default driver specified
Все, других багов нет. Сетка не показывает ничего ни таблицы, ни запросы.

Да, кстати

> sniknik ©   (27.01.06 11:43) [15]

> используется ODBC-шный DSN который может быть на другом
> языке, или полностью отсутствовать... ты его уставливал?
>  тогда зачем пользуешся?
> всеэто меняется на
> "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+База+";Persist
> Security Info=False"

Не работает вовсе. Если же исправить синтаксическую ошибку, т.е.:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"База"+";Persist
Security Info=False"
Сетка будет пуста даже на ОС на которой ведется разработка !

Я оставил в виде:
"Provider=MSDASQL.1;Persist Security Info=False;Data Source=База данных MS Access;Extended Properties="";

Но все же ключевая проблема остается не решенной: как запустить прогу на другом PC (новой ОС) ??????


 
YurikGL ©   (2006-01-29 16:22) [25]


> Kostafey ©   (29.01.06 15:28) [24]

Глянь пример http://www.delphimaster.ru/articles/dbtoword/index.html
Там идет подключение к access - базе... работает на другом PC новой ОС :)

>Data Source="+"База"
Это - что? Если путь к базе, то там наверняка должен быть mdb-к


 
Kostafey ©   (2006-01-29 17:02) [26]


> YurikGL ©   (29.01.06 16:22) [25]
> Глянь пример http://www.delphimaster.ru/articles/dbtoword/index.
> html
> Там идет подключение к access - базе... работает на другом
> PC новой ОС :)

Не-а, па "полной" ОС - все как по маслу, а на новой ОС Win2000+Access - построчно выдаер ошибку класс не зарегистрирован, а через InterBase вообще никак не регирует!

> >Data Source="+"База"
> Это - что? Если путь к базе, то там наверняка должен быть
> mdb-к

А это что такое "mdb-к" ?


 
YurikGL ©   (2006-01-29 17:58) [27]


> А это что такое "mdb-к"

файл базы Microsodt Access


 
sniknik ©   (2006-01-29 18:28) [28]

> [Microsoft][OBC Driver Manager] Data source name not found and no default driver specified
> Все, других багов нет. Сетка не показывает ничего ни таблицы, ни запросы.
см. msguns ©   (27.01.06 13:06) [16]
и отключай конекты дизайна перед компиляцией проекта. (той базы к которой при написании подсоеденен НАВЕРНЯКА не будет на другой машине)

> Не работает вовсе. Если же исправить синтаксическую ошибку, т.е.
> Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"База"+";Persist Security Info=False"
ужасс... такого еще не видел... ;) чтобы ТАК интерпретировали переменную...
я вот к примеру понял что обозначает твое DB_Path, хотя явного указания не было, и не пытался из этого строку сделать...

оно как по твоему, по щучьему велению, путь и саму базу найдет? в трвоей интерпретации.


 
Kostafey ©   (2006-01-29 18:39) [29]


> см. msguns ©   (27.01.06 13:06) [16]

Ладно, буду сейчас все это делать (деваться некуда - авось поможет).

> и отключай конекты дизайна перед компиляцией проекта. (той
> базы к которой при написании подсоеденен НАВЕРНЯКА не будет
> на другой машине)

Будет она - куда ж йе датся просто путь другой будет

> > Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"База"+";
> Persist Security Info=False"
> ужасс... такого еще не видел... ;) чтобы ТАК интерпретировали
> переменную...

:))) sorry

> оно как по твоему, по щучьему велению, путь и саму базу
> найдет? в трвоей интерпретации.

Именно. На новой ОС (на PC где идет разработка) уж точно, а на новом PC - можно путь прописать во внешний файл - типа конфиг, и уж с этим путем и работать.


 
Kostafey ©   (2006-01-29 18:52) [30]


> "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+База+";Persist
> Security Info=False"

Нет, тоже не работает. Выдает:
Не было задано свойтсво, доступное только для чтения

const DataCall_h1:String="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
       DataCall_h2:String=";Persist Security Info=False";
...
 ADOConnection1.ConnectionString:=DataCall_h1+DB_Path+DataCall_h2;


 
sniknik ©   (2006-01-29 19:07) [31]

DB_Path секрет?


 
Kostafey ©   (2006-01-29 19:32) [32]


> sniknik ©   (29.01.06 19:07) [31]
>
> DB_Path секрет?

:)

var  DB_Path:String;
...
procedure TForm1.FormShow(Sender: TObject);
begin
 ReadName:=Read_From_Config;
 if ReadName.Success then Start_DataBase(ReadName.FileName);
end;
...
function Start_DataBase(FileName:string):boolean;
begin
 BEGIN
   DB_Path:=FileName;
   DataModule1.DB_Load(DB_Path);
...
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 begin
   DB_Path:=OpenDialog1.FileName;
   if Start_DataBase(DB_Path) then
     Write_To_Config(DB_Path);
 end;
end;


 
Kostafey ©   (2006-01-29 19:44) [33]

Вообще, я кажется по-немногу начинаю понимать в чем проблема.
Видимо 90% драйверов привносится с самой Delphi, нужно подобрать такой
СonnectionString, чтобы она выполнялась на PC без Delphi, либо (как кто-то на Королевстве Delphi присоветовал) вместе с программой должен быть установщик драйверов ADO или что-то в этом роде.
Есть какие-нибудь соображения по этому поводу ?


 
sniknik ©   (2006-01-29 19:51) [34]

похоже секрет...

скажи нафига то как ты ее определяеш?
у тебя конкретная ошибка в конкретном месте с КОНКРЕТНЫМИ параметрами. неужели трудно понять, что ошибка зависит от значений параметров, и нужны именно они, единственные и неповторимые, те, при которых глюки и происходят.
никакие другие, также как и способ их получения, к делу(глюку) отношения не имеют.

> Видимо 90% драйверов привносится с самой Delphi
бред. ни ADO ни Jet к дельфи отношения не имеют.

> Есть какие-нибудь соображения по этому поводу ?
да, сображение такого плана - вся ветка развод. это единственное разумное обьяснение превратному истолкованию буквально всего...


 
Kostafey ©   (2006-01-29 19:59) [35]


> похоже секрет...

C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb
Я просто хотел показать, что это значение получаемое через OpenDialog1.Filename - в случае если что не так.

> > Видимо 90% драйверов привносится с самой Delphi
> бред. ни ADO ни Jet к дельфи отношения не имеют.

Я и говорю, мол не знаю, просто предполагаю..

> да, сображение такого плана - вся ветка развод. это единственное
> разумное обьяснение превратному истолкованию буквально всего.
> ..

Да ладно. Зачем так.


 
sniknik ©   (2006-01-29 20:19) [36]

> C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb
ну так возми и прямо в дизайнтайме загони в конектстринг строку ->

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb;Persist Security Info=False

лучше всего в чистом проекте с единственным компонентом конекта, для исключения влияния постороннего кода.
и установи там же connected в true. открылось? (запросит пароль установи LoginPrompt в false)

теперь положи базу по аналогичному пути на другом компе, без дельфи... ошибок нет?
тепрь закрой конект в десигне, и открывай по кнопке (опять единстенной добавленной)  
опять нет?

тогда разбирайся где путаешся. ты сам путаеш, а не комп/дельфи/адо/ и т.д. они не вноваты. (вообще прими это за аксиому, если есть глюк то это твой, так как другие вероятности очень мизерные)


 
YurikGL ©   (2006-01-29 20:23) [37]


> Kostafey ©  

Значит так.....
Пусть sniknik ©  сейчас опять будет ругаться, что мол код кривой, но даю путь, который должен заработать....

 TNastr=Record
   basepath:string
   end;

procedure TFormMain.FormShow(Sender: TObject);
begin
loadnastr;
ADOConnection1.Connected:=False;
ADOConnection1.ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb;Persist Security Info=False";
ADOConnection1.Properties["Data Source"].Value:=nastr.basepath;
ADOConnection1.Connected:=true;
end;

procedure TFormMain.LoadNastr;
var
IFl:TIniFile;
Begin
 IFl:=TIniFile.Create(ExtractFilePath(Application.ExeName)+"mail.ini");
 if FileExists(ExtractFilePath(Application.ExeName)+"mail.ini") then
   FormMain.Nastr.basepath:=IFl.ReadString("Database options","Path",FormMain.Nastr.basepath)
                          else FormMain.Nastr.basepath:="db1.mdb";//путь по умолчанию
 IFl.Free;
End;


Внутреность mail.ini. Содержит фактический путь к базе данных

[Database options]
Path=db1.mdb


 
Kostafey ©   (2006-01-30 12:30) [38]

Кажется, я понял где собака зарыта.
3 варианта кода:
1-й вариант

var DB_Path:String;
...
     DB_Path:="C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb";

     ADOConnection1.ConnectionString:=
       "Provider=MSDASQL.1;Persist Security Info=False;"+
       "Data Source=База данных MS Access;Initial Catalog="+
       +DB_Path;

2-й вариант

const
 DB_Path:String="C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb";
...
     ADOConnection1.ConnectionString:=
       "Provider=MSDASQL.1;Persist Security Info=False;"+
       "Data Source=База данных MS Access;Initial Catalog="+
       +DB_Path;

3-й вариант

     ADOConnection1.ConnectionString:=
       "Provider=MSDASQL.1;Persist Security Info=False;"+
       "Data Source=База данных MS Access;Initial Catalog="+
       "C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb";

Так вот все 3 варианта выполняются на PC на котором ведется разработка, но на другом PC (вернее новой ОС -Win2k) выполняется только 3-й вариант кода, 1 и 2 -й выдают:
[Microsoft][OBC Driver Manager] Data source name not found and no default driver specified

Странно даже.


 
YurikGL ©   (2006-01-30 16:48) [39]


> Kostafey ©   (30.01.06 12:30) [38]


Data Source=db1.mdb
а не
Data Source=База данных MS Access

Тяжело повторить код, приведенный в [37] ?


 
Kostafey ©   (2006-01-30 19:54) [40]


> Тяжело повторить код, приведенный в [37] ?

Да нет не тяжело, просто на такой код он выдает:
Не было задано свойство доступное только для чтения

> Data Source=db1.mdb
> а не
> Data Source=База данных MS Access

А это имеет какое-то значение ???
Мне показальсь что собственно путь задается:
ADOConnection1.Properties["Data Source"].Value:=nastr.basepath;

Ну да не важно, как я и говорил, код

function Start_DataBase(FileName:string):boolean;
begin
 BEGIN
   DB_Path:="C:\Program Files\PRG_all\PRG_Code\PRO_Code_Store\Code_Store_v1.01\AccessDB.mdb";
   with DataModule1 do
   begin
     ADOConnection1.Connected:=False;
     ADOConnection1.ConnectionString:=
       "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=AccessDB.mdb;Persist Security Info=False";
     ADOConnection1.Properties["Data Source"].Value:=DB_Path;
     ADOConnection1.Connected:=true;
     ADOTable1.Active:=true;
     ADOTable2.Active:=true;
     ADOTable3.Active:=true;
     ADOQuery_Full.Active:=true;
     ADOQuery1.Active:=true;
     DataSource_Code.Enabled:=true;
     DataSource_Source.Enabled:=true;
     DataSource_Autor.Enabled:=true;
     DataSource1.Enabled:=true;
     DataSource2.Enabled:=true;
     DataSourceQuery.Enabled:=true;
   end;
   GridIni;
   Start_DataBase:=true;
 END;
end;
выдает: Не было задано свойство доступное только для чтения
вот.


 
Kostafey ©   (2006-01-30 20:14) [41]

И еше одна интересная штука.
Начал экспериментировать с пустой программой
Provider=Microsoft.Jet.OLEDB.4.0
Совершенно не хочет работать с запросом самого Access- файла.
Выдает: "Неопознанная ошибка".
К таблицам  подключает - не вопрос.
Приходится дополнительный Query делать.


 
YurikGL ©   (2006-01-30 22:14) [42]


> выдает: Не было задано свойство доступное только для чтения

На какую строчку?


> Совершенно не хочет работать с запросом самого Access- файла.
Код давай....


 
Kostafey ©   (2006-01-31 01:01) [43]


> > выдает: Не было задано свойство доступное только для чтения
>
> На какую строчку?

На включение базы: (притом одинаково будь то run-time, либо Object Inspector)

ADOConnection1.Connected:=true;


> > Совершенно не хочет работать с запросом самого Access-
>  файла.
> Код давай....

Нулевой проект.
UDataModule - DataModule1
Unit1 - Form1
ПРИВОЖУ ВЕСЬ:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, DBGrids, UDataModule, IniFiles;

type

TNastr=Record
  basepath:string
  end;

 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   procedure FormShow(Sender: TObject);
   procedure LoadNastr;
 private
   { Private declarations }
 public
   nastr:TNastr;
   { Public declarations }
 end;

var
 Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
 loadnastr;
 with DataModule1 do begin
 ADOConnection1.Connected:=False;
 ADOConnection1.ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb;Persist Security Info=False";
 ADOConnection1.Properties["Data Source"].Value:=nastr.basepath;
 ADOConnection1.Connected:=true;
 ADOTable1.Active:=true;
 DataSource1.Enabled:=true;
 end;
end;

procedure TForm1.LoadNastr;
var
IFl:TIniFile;
Begin
IFl:=TIniFile.Create(ExtractFilePath(Application.ExeName)+"mail.ini");
if FileExists(ExtractFilePath(Application.ExeName)+"mail.ini") then
  Form1.Nastr.basepath:=IFl.ReadString("Database options","Path",Form1.Nastr.basepath)
                         else Form1.Nastr.basepath:="db1.mdb";//путь по умолчанию
IFl.Free;
End;

end.

При этом в код UDataModule я вручную ничего не вписывал.
В свойстве ADOTable TableName = "Full" - имя запроса.
Выдает: "Неопознанная ошибка"
Если заменить на имя таблицы TableName = "Code" - все нормально работает

mail.ini содержит:
[Database options]
Path=db1.mdb

db1.mdb - находится в каталоге программы, в файле есть запрос и таблицы.


 
Kostafey ©   (2006-01-31 22:24) [44]

Прошу прощения за назойливость, может то-нибудь ответит на

> Kostafey ©   (31.01.06 01:01) [43]


 
Kostafey ©   (2006-02-01 17:32) [45]

Еще раз 10^3 извинений: возвращаю тему на верх форума


 
sniknik ©   (2006-02-01 20:37) [46]

говорил же не пользуйся ADOTable (в данном случае он конечно не при чем, но разве трудно изначально начинать с "правильных" компонент? ADOTable/ADOQuery "неправильные" не пользуйся ими )

для ADODataSet делай запрос SELECT * FROM [Full]
(Full подозрительно похоже на какоето зарезервированное слово, во всяком случае может быть им, поэтому кавычки)

если делать аналог с ADOTable  (датасет с установленным cmdTable вместо cmdText по умолчанию) то просто указывай [Full] в командной строке (оно так и вставится в формируемый компонентом запрос, и если слово зарезервировано ошибки не будет)


 
Kostafey ©   (2006-02-01 21:03) [47]


> sniknik ©   (01.02.06 20:37) [46]
>
> говорил же не пользуйся ADOTable (в данном случае он конечно
> не при чем, но разве трудно изначально начинать с "правильных"
> компонент? ADOTable/ADOQuery "неправильные" не пользуйся
> ими )

Интересно, а почему же все-таки вы их так не любите ?
Ладно, прогу я сегодня думаю закончить !

ПОДВОЖУ ИТОГИ
Отвечаю на свои вопросы так как я понял по итогам ветки форума:
 1)Есть некая БД, которая корректно работает только на PC с установленной Delphi и Access. Возможность запуска БД на PC без Delphi (но при условии наличия установленной Access) обеспечивает библиотека qtintf70.dll. Однако хотелось бы достичь независимоти программы и от самой Access. (При отсутствии Access выдает сообщение о том что не может найти драйвера по умолчанию).
При Provider=MSDASQL.1 нормально работающую программу на не девелоперском компе написать практически невозможно (по целому ряду причин).
При Provider=Microsoft.Jet.OLEDB.4.0 Невозможно непосредственно поделючится к запросу через ADOTable.
Запрос на подключение qtintf70.dll. при доступе к БД через ADO - результат случайного добавления в подключаемые модули QT.
Вообще Delphi - программа может работать с Access - базой без каких-либо ухищрений, без наличия установленной Access.
 2)Даже при наличии на PC СУБД Acess и библиотеки qtintf70.dll, но отсутствии самой Delphi сетка (DBGrid) не отображет талицы, а только запросы - имеются ввиду не компоненты Table\Query, а таблицы и запросы самого файла БД (на PC с Delphi - все отображается без проблем)
Кстати, редкий случай, как правило, не показывается ничего.
Provider должен быть Microsoft.Jet.OLEDB.4.0
3)Как лучше всего произвести обновление отображения (например в той же сетке) изменений информации. Refresh - ничего не дает. Я же просто закываю и затем заново открываю наборы данных (Active:=false/true) - ясно, что это не рационально.
Можно и так.

Благодарю всех за оказанную помошь !
СПЕШИАЛ СЭНЬКС ФО
YurikGL
sniknik


 
Almaz ©   (2006-02-02 02:25) [48]


> 3)Как лучше всего произвести обновление отображения (например
> в той же сетке) изменений информации. Refresh - ничего не
> дает. Я же просто закываю и затем заново открываю наборы
> данных (Active:=false/true) - ясно, что это не рационально.
>
> Можно и так.

Для TADODataSet , ИМХО, лучше использовать метод Requery (не путать с Refresh ;))

Удачи.


 
msguns ©   (2006-02-02 09:23) [49]

Сколько просыпано бисера впустую ;((
Просьба не обижаться ;)



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

Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.65 MB
Время: 0.038 c
15-1138284610
Dec
2006-01-26 17:10
2006.02.19
gif-рисунок


3-1135671102
alsov
2005-12-27 11:11
2006.02.19
Как сделать линк из MSSQL в Oracle


8-1122035208
Wm.DIGGER
2005-07-22 16:26
2006.02.19
Как узнать название кодека по его тэгу :)


2-1138896565
park
2006-02-02 19:09
2006.02.19
Не запускается скомпилированая программа


2-1138979999
User2
2006-02-03 18:19
2006.02.19
коннект с SQL SERVER по сети





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский