![]() |
| ||
|
|
Новости |
Поиск |
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) - ясно, что это не рационально.
Спасибо уже за то что дочитали это до конца. Буду признателен за Ваши советы.
msguns (2006-02-02 09:23:00) [1]Сколько просыпано бисера впустую ;((
Просьба не обижаться ;)
Almaz (2006-02-02 02:25:00) [2]
> 3)Как лучше всего произвести обновление отображения (например
> в той же сетке) изменений информации. Refresh - ничего не
> дает. Я же просто закываю и затем заново открываю наборы
> данных (Active:=false/true) - ясно, что это не рационально.
>
> Можно и так.
ДляTADODataSet, ИМХО, лучше использовать методRequery(не путать с Refresh ;))
Удачи.
Kostafey (2006-02-01 21:03:00) [3]
> 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
sniknik (2006-02-01 20:37:00) [4]говорил же не пользуйся ADOTable (в данном случае он конечно не при чем, но разве трудно изначально начинать с "правильных" компонент? ADOTable/ADOQuery "неправильные" не пользуйся ими )
для ADODataSet делай запрос SELECT * FROM [Full]
(Full подозрительно похоже на какоето зарезервированное слово, во всяком случае может быть им, поэтому кавычки)
если делать аналог с ADOTable (датасет с установленным cmdTable вместо cmdText по умолчанию) то просто указывай [Full] в командной строке (оно так и вставится в формируемый компонентом запрос, и если слово зарезервировано ошибки не будет)
Kostafey (2006-02-01 17:32:00) [5]Еще раз 10^3 извинений: возвращаю тему на верх форума
Kostafey (2006-01-31 22:24:00) [6]Прошу прощения за назойливость, может то-нибудь ответит на
> Kostafey © (31.01.06 01:01) [43]
Kostafey (2006-01-31 01:01:00) [7]
> > выдает: Не было задано свойство доступное только для чтения
>
> На какую строчку?
На включение базы: (притом одинаково будь то 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 - находится в каталоге программы, в файле есть запрос и таблицы.
YurikGL (2006-01-30 22:14:00) [8]
> выдает: Не было задано свойство доступное только для чтения
На какую строчку?
> Совершенно не хочет работать с запросом самого Access- файла.
Код давай....
Kostafey (2006-01-30 20:14:00) [9]И еше одна интересная штука.
Начал экспериментировать с пустой программой
Provider=Microsoft.Jet.OLEDB.4.0
Совершенно не хочет работать с запросом самого Access- файла.
Выдает: "Неопознанная ошибка".
К таблицам подключает - не вопрос.
Приходится дополнительный Query делать.
Kostafey (2006-01-30 19:54:00) [10]
> Тяжело повторить код, приведенный в [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;
выдает: Не было задано свойство доступное только для чтения
вот.
YurikGL (2006-01-30 16:48:00) [11]
> Kostafey © (30.01.06 12:30) [38]
Data Source=db1.mdb
а не
Data Source=База данных MS Access
Тяжело повторить код, приведенный в [37] ?
Kostafey (2006-01-30 12:30:00) [12]Кажется, я понял где собака зарыта.
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-29 20:23:00) [13]
> 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
sniknik (2006-01-29 20:19:00) [14]> 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)
теперь положи базу по аналогичному пути на другом компе, без дельфи... ошибок нет?
тепрь закрой конект в десигне, и открывай по кнопке (опять единстенной добавленной)
опять нет?
тогда разбирайся где путаешся. ты сам путаеш, а не комп/дельфи/адо/ и т.д. они не вноваты. (вообще прими это за аксиому, если есть глюк то это твой, так как другие вероятности очень мизерные)
Kostafey (2006-01-29 19:59:00) [15]
> похоже секрет...
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 19:51:00) [16]похоже секрет...
скажи нафига то как ты ее определяеш?
у тебя конкретная ошибка в конкретном месте с КОНКРЕТНЫМИ параметрами. неужели трудно понять, что ошибка зависит от значений параметров, и нужны именно они, единственные и неповторимые, те, при которых глюки и происходят.
никакие другие, также как и способ их получения, к делу(глюку) отношения не имеют.
> Видимо 90% драйверов привносится с самой Delphi
бред. ни ADO ни Jet к дельфи отношения не имеют.
> Есть какие-нибудь соображения по этому поводу ?
да, сображение такого плана - вся ветка развод. это единственное разумное обьяснение превратному истолкованию буквально всего...
Kostafey (2006-01-29 19:44:00) [17]Вообще, я кажется по-немногу начинаю понимать в чем проблема.
Видимо 90% драйверов привносится с самой Delphi, нужно подобрать такой
СonnectionString, чтобы она выполнялась на PC без Delphi, либо (как кто-то на Королевстве Delphi присоветовал) вместе с программой должен быть установщик драйверов ADO или что-то в этом роде.
Есть какие-нибудь соображения по этому поводу ?
Kostafey (2006-01-29 19:32:00) [18]
> 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;
sniknik (2006-01-29 19:07:00) [19]DB_Path секрет?
Kostafey (2006-01-29 18:52:00) [20]
> '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;