Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Несколько вопросов о работе с БД Access [D7, XP]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо