![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько вопросов о работе с БД Access [D7, XP]
Kostafey © (2006-01-26 23:11:00)Прошу совета у уважаемых мастеров по следующим вопросам:
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) - ясно, что это не рационально.
Спасибо уже за то что дочитали это до конца. Буду признателен за Ваши советы.
Kostafey (2006-01-29 18:39:00) [21]
> см. msguns © (27.01.06 13:06) [16]
Ладно, буду сейчас все это делать (деваться некуда - авось поможет).
> и отключай конекты дизайна перед компиляцией проекта. (той
> базы к которой при написании подсоеденен НАВЕРНЯКА не будет
> на другой машине)
Будет она - куда ж йе датся просто путь другой будет
> > Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+'База'+';
> Persist Security Info=False'
> ужасс... такого еще не видел... ;) чтобы ТАК интерпретировали
> переменную...
:))) sorry
> оно как по твоему, по щучьему велению, путь и саму базу
> найдет? в трвоей интерпретации.
Именно. На новой ОС (на PC где идет разработка) уж точно, а на новом PC - можно путь прописать во внешний файл - типа конфиг, и уж с этим путем и работать.
sniknik (2006-01-29 18:28:00) [22]> [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, хотя явного указания не было, и не пытался из этого строку сделать...
оно как по твоему, по щучьему велению, путь и саму базу найдет? в трвоей интерпретации.
YurikGL (2006-01-29 17:58:00) [23]
> А это что такое "mdb-к"
файл базы Microsodt Access
Kostafey (2006-01-29 17:02:00) [24]
> 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 16:22:00) [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 15:28:00) [26]Значит установил на своем 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 (новой ОС) ??????
sniknik (2006-01-29 00:34:00) [27]> типа такого?
ну можно и так. стардарта сам понимаеш нет, дело личных предпочтений, самое главное чтобы инфа не терялась.
но сам я делаю немного по другому
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) ошибки и не предусмотренные. (в принципе основное внимание как раз на непредусмотренные глюки надо обращать, так получается, потому как если предусмотрено на открытии возможность "неоткрытия" базы, то это работа внедренцев, не туда базу положили/... т.д. разберутся, а если ошибка есть и в том месте где ты и не предполагал... то это уже лично твое)
YurikGL (2006-01-28 22:49:00) [28]
> sniknik © (28.01.06 15:23) [21]
типа такого?
try
...
except
on e:exception do
raise Exception.Create('Невозможно подключиться к базе. Причина ошибки:'+#13+e.Message);
end;
sniknik (2006-01-28 15:23:00) [29]> "базу открыть невозможно, причинами этого могут быть...то что указал sniknik..."
лучше дать стандартный мессейдж стандартной ошибки (что и выдается без try except), там будет конкретное и явное указание причины, а не перечислять (я например не могу себе представить всех возможных причин от чего не отроется, а уж ковырятся перебирать варианты вместо точного знания от чего это, так просто заломает).
YurikGL (2006-01-28 14:18:00) [30]
> sniknik © (28.01.06 10:53) [19]
Исправляюсь...
> Ну хорошо, а как же тогда "загасть" ошибку попытки открытия
> БД если неизвестен ее путь ?
Ее путь все равно где-то должен храниться. Если он неизвестен, то строка, хранящая путь либо должна быть пустая либо должна содержать известный(хотя возможно и неверный путь). Тогда нужно просто посмотреть: если строчка пустая, то сказать пользователю, что путь к базе не задан. Если не пустая, то попробовать присоединиться через try..except и в случае исключения выдать пользователю сообщение о том, что "базу открыть невозможно, причинами этого могут быть...то что указал sniknik..."
sniknik (2006-01-28 10:53:00) [31]> showMessage('База не найдена.'):
это тоже неправильно.
база может быть залокирована/открыта в монопольном режиме кемто другим, у тебя может не быть прав на ее чтение/директория где она лежит для тебя закрыта, испорчена в конце концов/не база а просто файл с таким именем... возможно чтото еще.
а ты заменил весь спектр возможных ошибок на безликое 'База не найдена.'... если ты только для подобных сообщений try except используеш, то лучше не используй вообще. т.к. подобные "русификации" очень потом усложняют сопровождение программы.
YurikGL (2006-01-28 08:47:00) [32]
> Ну хорошо, а как же тогда "загасть" ошибку попытки открытия
> БД если неизвестен ее путь ?
Перед компиляцей программы у всех 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.
Kostafey (2006-01-27 18:34:00) [33]
> > Это нужно для первого запуска программы на новом PC, когда
> она еще не нашла расположение БД, а компоненты е ней
> > подключенные ее требуют
> бред. не могут они ничего требовать пока ты сам не скахеш
> им чтото выполнить... так вот до этого проверяй на присетствие
> базы и все, а ошибку на подключении всетаки раскрой (то
> что база есть еще недостаточно чтобы гарантировано подключилось.
> .. ошибка скажет почему не удалось)
Ну хорошо, а как же тогда "загасть" ошибку попытки открытия БД если неизвестен ее путь ?
> Хм. Да что же там может быть "лишнего" ???
> DBTables - BDE
> ADOTable1 - это самый жуткий баг борланда в адо, категорически
> не рекомендуется не то что использовать, но даже смотреть
> на него...
Возможно, я его сам первый раз использую, а что же тогда применить вместо него ? Разве можно использовать обычные Table ? И если так, то как из БД "достать" таблицы и запросы ?
> 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+База+';Persist
> Security Info=False'
А по какому принципу пишется этот Provider=...
> > не сработали (Code','Source','Author' - таблицы)
> а ты этого не сам хотел? а зачем exit; тогда?
exit -есть нормальное явление когда не найден сам физческий файл БД
msguns (2006-01-27 13:06:00) [34]Судя по всему, у него еще в проекте стоит Active=true всем датасетным компонентам и, естно, соответствующему коннекту
sniknik (2006-01-27 11:43:00) [35]> Хм. Да что же там может быть "лишнего" ???
> 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; тогда?
Kostafey (2006-01-27 00:49:00) [36]
> Плохиш © (27.01.06 00:42) [11]
Вы, похоже, мой вопрос(ы) не совсем поняли ?
Kostafey (2006-01-27 00:46:00) [37]
> Для чего существует встроенный в делфи отладчик знаешь?
Да, но вот в чем трабл:
ПРОГРАММА НЕ ЗАПУСКАЕТСЯ В СРЕДЕ DELPHI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Работает только ее откомпилированный вариант !
Kostafey (2006-01-27 00:45:00) [38]
> пора бы привести проблеммный код.
Хотя вот некие моменты:
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;
сработал.
Плохиш (2006-01-27 00:42:00) [39]
> Kostafey © (27.01.06 00:38) [10]
Для чего существует встроенный в делфи отладчик знаешь?
Kostafey (2006-01-27 00:38:00) [40]
> Это говорит о том, что всем уже надоело телепатировать и
> пора бы привести проблеммный код.
Дак я пытаюсь выянить где ж этот проблемный код (и в коде ли проблема вообще). Я могу хоть все исходники программы скинуть (по почте) - не вопрос.