Консультация № 187700
03.01.2014, 13:29
96.39 руб.
0 15 0
Здравствуйте! Прошу помощи в следующем вопросе: Работа с базой данных Microsoft Access. Вопрос получается в нескольких частях.
1. Подключение ADOQuery1 к базе данных. Так как путь к базе может менятся, то сохранение в программе не допускается. Пробую подключать как подключаю ADOConnection1 (тут все работает), выдает ошибку "Не выполнена проверка подлинности". Подключение осуществляю так
Код:
procedure TForm1.ConnectBase;
begin
ADOConnection1.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + Edit1.Text + ';' +
'Persist Security Info=False';
ADOConnection1.Connected:=True;
ADOSotr.Active:=True;

ADOQuery1.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + Edit1.Text + ';' +
'Persist Security Info=False';
ADOQuery1.Active:=True;
end;

Если выбираю в ConnectionString путь к базе, то ошибок нет. В чем тут проблема?
2. Нужно подучить количество записей в базе. Делаю такой запрос
Код:

begin
rec := 0;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select count(*) as Cnt from Sotr');
ADOQuery1.Open;
rec := rec + ADOQuery1.FieldByName('Cnt').AsInteger;
ADOQuery1.Close;
label18.Caption:=inttostr(rec);
end;

В label18 получаю на одну запись меньше чем существует в базе. Как такое возможно?
Есть еще несколько вопросов, но это уже попозже, как будет решение на эти два вопроса.
Заранее благодарю за помощь.

Обсуждение

давно
Посетитель
352040
133
03.01.2014, 16:21
общий
Второй вопрос снимается. Не внимательность вина. Все правильно считается. Остается вопрос с подключением.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
04.01.2014, 10:33
общий
Адресаты:
Судя по тому что
Если выбираю в ConnectionString путь к базе, то ошибок нет.
проблема в пустой строке подключения.
Можно сделать например так:
Код:
If Edit1.Text='' Then begin
MessageDlg('Connection error!',mtError,mbOK,0);
Exit;
end;

Добавьте эту проверку в начало вашей процедуры подключения к базе.
давно
Профессионал
153662
1070
04.01.2014, 12:30
общий
Адресаты:
Я обычно подключаю так:
Код:
 ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+ExtractFilePath(ParamStr(0))+'data\zurnal.db1.mdb'; // Добавление параметров базы
и всё, часть строки
Код:
ExtractFilePath(ParamStr(0))+'data\zurnal.db1.mdb'
меняю в зависимости от расположения базы. Либо так, если надо пароль ввести:
Код:
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0; User ID=Admin; Data Source='+ FileName + '; Persist Security Info=true; Jet OLEDB:Database Password=' + Password + ';'; // Добавление параметров базы

Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
352040
133
04.01.2014, 15:01
общий
Нет. Проблема не в этом. И проверка есть что Edit1 заполнен, несколько другим способом, но есть.
Edit1 заполнен, у меня же проходит подключение ADOConnection1
Код:
procedure TForm1.ConnectBase;
begin
ADOConnection1.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + Edit1.Text + ';' +
'Persist Security Info=False';
ADOConnection1.Connected:=True;
end;
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
04.01.2014, 16:05
общий
Адресаты:
Подключение ADOConnection1 проиходит без проблем, связь с базой есть. У меня не получается подключить ADOQuery1. И кстати будут ли они вместе работать с одной базой, или мне придется все переписывать?
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Профессионал
153662
1070
05.01.2014, 07:27
общий
Адресаты:
Принцип прописи ConnectionString для них одинаковый. А зачем тогда в ADOQuery1 Вы прописываете ConnectionString, когда можно просто указать
Код:
ADOQuery1.Connection:= ADOConnection1
и всё будет работать. Зачем тогда используется ADOConnection1? Или у Вас там и там подключаются разные базы?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
352040
133
05.01.2014, 10:26
общий
05.01.2014, 10:33
Адресаты:
Да нет. База используется одна. Я не давно с базами занялся. Через ADOQuery хотел запросы к базе делать, все таки через SQL проще спрашивать у базы. И если в ADOQuery1.Connection указываю
Код:
ADOQuery1.Connection:= ADOConnection1
при компиляции ругается "Не выполнена проверка подлинности"
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Профессионал
153662
1070
05.01.2014, 10:43
общий
Адресаты:
А в ADOConnection1.LoginPrompt что стоит, попробуйте поставить в False.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
352040
133
05.01.2014, 11:24
общий
Адресаты:
Вроде разобрался в чем проблема была.Решение вопроса с подключением

Подключение как Вы и советовали-ADOQuery1.Connection:= ADOConnection1, потом SQL запрос. И все работает.
У меня получилось такая конструкция.
Код:

var
Form1: TForm1;
sql_line:string;
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
.....
.....
If Length(Edit1.Text) < 3 Then Zapros1
else
ConnectBase;
end;

procedure TForm1.ConnectBase;
begin
ADOConnection1.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + Edit1.Text + ';' +
'Persist Security Info=False';
ADOConnection1.Connected:=True;

sql_line:='SELECT * FROM Studia
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(sql_line);
ADOQuery1.Active:=True;
All;///Запрос на количество записей в базе
end;

Благодарю за помощь. Думаю тему можно закрывать. Начну разбиратся с SQL "вопросами" к базе. Еще раз спасибо за помощь.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Профессионал
153662
1070
05.01.2014, 11:42
общий
05.01.2014, 11:46
Адресаты:
Так в чём была проблема? В этом
TADOConnection1 Свойство LoginPrompt – устанавливаем False
?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
352040
133
05.01.2014, 13:21
общий
Адресаты:
Нет, проблема была не
TADOConnection1 Свойство LoginPrompt – устанавливаем False

Я так понял что ругался на то что небыло ни какого запроса SQL
Такая ошибка возникает в том случае если в свойстве SQL компонента ADOQuery пусто, т.е. нет никакого запроса
. Я сделал как писал в ответе №9, и все заработало.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Профессионал
153662
1070
05.01.2014, 13:43
общий
05.01.2014, 13:47
Адресаты:
Я всегда прописываю простецкий запрос ещё в инспекторе обьектов, что то типа выбрать все записи из таблицы. А так да, без этого будет вылетать ошибка "ADOQuery1: Missing SQL property", "Отсутствует свойство SQL", а у Вас была другая ошибка "Не выполнена проверка подлинности".
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
352040
133
05.01.2014, 13:47
общий
Адресаты:
Ну а так как я практически только начал с базами работать, поэтому на грабли и наступил, причем простые. Главное что получилось.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Профессионал
153662
1070
05.01.2014, 14:00
общий
05.01.2014, 14:21
Адресаты:
Ну вот вылезла таже ошибка про проверку подлинности, осталось выяснить откуда. А вылазит она если в процессе разработке подключить базу в инспекторе объектов, и потом после запуска программы пытаться это сделать сново. Надо в инспекторе объектов выставить в ADOConnection1.Connected:=false; и в ADOQuery1.Active:=false; Ну а если в ADOQuery нет SQL то соответствующая ошибка выплывит после запуска программы уже после этой.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
352040
133
05.01.2014, 14:10
общий
Адресаты:
Так у меня и было.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Форма ответа