Запрос на добавление записи в Delphi

Для работы с базой на аксесе я добавил Adoconnection, Datasource, adotable, query(не ADO), все настроил, поместил на форму кнопку "добавить". Имеется таблица "Клиент" с полями: фио_клиента, адрес, телефон. Пытаюсь записать запись, но пишет ошибку, мол неправильно употреблены слова в запросе (ругается на название полей таблицы походу) вот сам запрос:
procedure TForm2.Button1Click(Sender: TObject);
var
fio:string[45];
adr:string[97];
tel:integer;
begin
if (form2.Edit1.Text='') or (form2.Edit2.Text='') or (form2.Edit3.Text='') then showmessage('Не все поля заполнены')
else
begin
fio:=edit1.Text;
adr:=edit3.text;
tel:=strtoint(edit2.Text);
form2.Query1.Close;
form2.Query1.SQL.Clear;
form2.Query1.SQL.Add('select Клиент');
form2.Query1.SQL.Add('Replace ФИО_клиента WITH "'+ fio+'"');
form2.Query1.SQL.Add('Replace Телефон With tel');
form2.Query1.SQL.Add('Replace Адрес WITH "'+adr+'"');
form2.Query1.Open;
end;

end;
Что нужно исправить? помогите плз...Изменил Query1 на AdoQuery1. Немного изменил запрос:
form2.ADOQuery1.Close;
form2.ADOQuery1.SQL.Clear;
form2.ADOQuery1.SQL.Add('Insert Into Клиент (ФИО_клиента, телефон, адрес)');
form2.ADOQuery1.SQL.Add('Values ("'+Edit1.Text+'", "'+Edit2.Text+'", "'+Edit3.text+'")');
form2.ADOQuery1.ExecSQL;
form2.ADOQuery1.Active := true;
Теперь в ошибке пишет: "Изменения не были успешно внесены из-за повторяющихся значений в индексею Удалите индекс или переопределите его..."Зато данные добавляет, правдо надо перезапускать прогу чтобы они появились в DBGride, подозреваю что надо както его обновлять. Какая процедурка может есть стандартная? И как избавится от ошибки?
5 ответов

DBGrid через Datasource подцеплен к adotable ? А вы подцепите к ADOQuery1 и сразу будут видны обновления. (Естественно, после инсерта нужно будет делать селект.) Аdotable тогда не нужна.Другой вариант - после отработки form2.ADOQuery1.ExecSQL; сделайте Аdotable.Refresh.По поводу ошибки. У вас индексы определены или нет ни одного? Если определены, то это не ошибка, а нормальная реакция базы - не имеет права быть двух записей с одинаковым значением индексного поля, о чем и говорит сообщение "Изменения не были успешно внесены из-за повторяющихся значений в индексе. Удалите индекс или переопределите его..."


Все разобрался: form2.ADOQuery1.Active := true; Было лишним. Спс михалыч, твой совет с Запросом помог.Теперь другая проблема, делаю по аналогии на другой форме похожий запрос:
if (form3.Edit9.Text='') or (form3.Edit1.Text='') or (form3.DBLookupComboBox1.Text='') then showmessage('Не все обязательные поля заполнены')
else
begin
if (form3.Edit2.Text='') then form3.Edit2.Text:='неизвестно';
if (form3.Edit3.Text='') then form3.Edit3.Text:='0';
if (form3.Edit4.Text='') then form3.Edit4.Text:='0';
if (form3.Edit5.Text='') then form3.Edit5.Text:='0';
if (form3.Edit6.Text='') then form3.Edit6.Text:='0';
if (form3.Edit7.Text='') then form3.Edit7.Text:='0';
if (form3.Edit8.Text='') then form3.Edit8.Text:='0000000';
if (form3.Edit10.Text='') then form3.Edit10.Text:='неизвестно';
if (form3.Edit11.Text='') then form3.Edit11.Text:='0';
if (form3.Edit12.Text='') then form3.Edit12.Text:='01.01.0001';
form3.ADOQuery1.Close;
form3.ADOQuery1.SQL.Clear;
form3.ADOQuery1.SQL.Add('Insert Into объект (Тип_объекта, Количество_комнат, Этаж, Общая_площадь, Жилая_площадь, Кухня, Материал_объекта, Телефон, Год_постройки, Город, Адрес, Цена_$, ФИО_клиента)');
form3.ADOQuery1.SQL.Add('Values ("'+form3.Edit1.Text+'","'+form3.Edit3.Text+'","'+form3.Edit4.text+'","'+form3.Edit5.Text+'","'+form3.Edit6.Text+'","'+form3.Edit7.Text+'","'+form3.Edit2.Text+'","'+form3.Edit8.Text+'","'+form3.Edit12.Text+'","'+form3.Edit10.Text+'","'+form3.Edit9.Text+'","'+form3.Edit11.Text+'","'+form3.DBLookupComboBox1.Text+'")');
form3.ADOQuery1.ExecSQL;
{showmessage('Запись добавлена'); }
end;
Ругается на то, что "ошибка синтаксиса insert into". У меня в этой таблице есть еще 1 поле "Номер_заявки", в access оно стоит как автоинкрементное, но я думаю это не из-за него. ВОобщем вроде все правильно а чето бьет ошибку на синтаксис.


В таких случаях я обычно ставлю breakpoint на ту строчку где выполняется команда (в товем случае form3.ADOQuery1.ExecSQL и посмотреть как оно сформировало запрос - после чего скормить его акцессу и пусть пожурит тебя.


(в товем случае form3.ADOQuery1.ExecSQL и посмотреть как оно сформировало запрос - после чего скормить его акцессу и пусть пожурит тебя.
Все значения из эдитов берутся, проверил, а вот чего непишутся хз...


а вот чего непишутся хз...
А вот и узнай. Watch тебе в помошь. На бряке добавь в Ватч form3.ADOQuery1.SQL.Text и скопируй его значение в Акцесс