Проблема с Delphi и Access: EDatabaseError: Field not Found!
Имеется проект на delphi который работает с БД access. Я переименовал одно поле из столбца таблицы access, сменил его имя также на новое во всех местах проекта где оно есть, во всех SQL вызовах. И при вызове ADOQuery, который должен использовать его имя, с помощью ADOQuery.Open, я получаю ошибку Delphi и Access: EDatabaseError: Field not Found, причем имя поля, которое значится ненайденным-старое и нигде не используется больше! В чем может быть проблема? ? Может обновить как-то проект надо, в Access я нажимал кнопку "Обновить всё" - не помогает. При возврате к старому имени всё хорошо работает.
1 ответов
Драйвер ODBC для MS Access работает в реальном режиме с базой на прямую!
Код как правельно соедениться и работать с Access через ODBC :
Код как правельно соедениться и работать с Access через ODBC :
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.ConnectionString := 'Provider=MSDASQL.1;Persist Security' +
#20'Info=False;Data Source=MS Access Database';
try
ADOConnection1.Open;
ADOQuery1.Connection := ADOConnection1;
try
ADOQuery1.SQL.Text := 'SELECT [Поле1],[Поле2] FROM [Тест1] WHERE' +
#20'[Поле1]=:key_name';
ADOQuery1.Parameters.ParamByName('key_name').Value := '^ключ1';
ADOQuery1.Open;
while not ADOQuery1.Eof do
try
Memo1.Lines.Add('' +
ADOQuery1.FieldByName('Поле1').AsString + ' = ' +
ADOQuery1.FieldByName('Поле2').AsString {ENDL} );
finally
ADOQuery1.Next;
end;
finally
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.ClearFields;
end;
finally
if ADOConnection1.Connected then
ADOConnection1.Close;
end;
end;
Желательно использовать преконструктор TQuery на подобие :
begin
ADOConnection1.ConnectionString := 'Provider=MSDASQL.1;Persist Security' +
#20'Info=False;Data Source=MS Access Database';
try
ADOConnection1.Open;
ADOQuery1.Connection := ADOConnection1;
try
ADOQuery1.SQL.Text := 'SELECT [Поле1],[Поле2] FROM [Тест1] WHERE' +
#20'[Поле1]=:key_name';
ADOQuery1.Parameters.ParamByName('key_name').Value := '^ключ1';
ADOQuery1.Open;
while not ADOQuery1.Eof do
try
Memo1.Lines.Add('' +
ADOQuery1.FieldByName('Поле1').AsString + ' = ' +
ADOQuery1.FieldByName('Поле2').AsString {ENDL} );
finally
ADOQuery1.Next;
end;
finally
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.ClearFields;
end;
finally
if ADOConnection1.Connected then
ADOConnection1.Close;
end;
end;
Желательно использовать преконструктор TQuery на подобие :
function TfmMain.NewQuery(SQL_ID: string): TUniQuery;
begin
Result := TUniQuery.Create(Self);
Result.Connection := UniConn;
Result.SQL.Text := ConfSQL( SQL_ID );
end;
var MyNewQuery: TUniQuery;
MyNewQuery := NewQuery('TEST_QUERY');
try
// Тут что-то делаем
finally
FreeAndNil(MyNewQuery);
end
Результат выполнения в Memo1 появилось :
ps: Вроде всё работает. Попробуй удалить .dcu файлы и перекомпелировать проект, возможно ошибка там.
pss: Тут есть группа "Pascal & Delphi" там быстрее ответ получить можно. Воросы группы я проверяю 1 раз в неделю.
begin
Result := TUniQuery.Create(Self);
Result.Connection := UniConn;
Result.SQL.Text := ConfSQL( SQL_ID );
end;
var MyNewQuery: TUniQuery;
MyNewQuery := NewQuery('TEST_QUERY');
try
// Тут что-то делаем
finally
FreeAndNil(MyNewQuery);
end
Результат выполнения в Memo1 появилось :
Memo1
^Ключ1=Херня1
^Ключ1=ХерняАААА
ps: Вроде всё работает. Попробуй удалить .dcu файлы и перекомпелировать проект, возможно ошибка там.
pss: Тут есть группа "Pascal & Delphi" там быстрее ответ получить можно. Воросы группы я проверяю 1 раз в неделю.