Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2013, 20:16   #1
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию Ошибка в ADO Query при добавлении новых данных

Доброго времени суток, форумчане у меня к вам вопрос?!
Работаю в Delphi 2010 с таблицей в базе данных Access 2003 через ADO.
Для добавления новых данных использую вот этот код :
Код:
procedure TForm4.BitBtn17Click(Sender: TObject);
begin
With datamodule3.ADOQuery37 do begin
  Connection:=datamodule3.ADOConnection1;
  insert;
  FieldByName('Наименование').Value:=DBEdit3.Text;
 post;
  end;
  With datamodule3.ADOQuery37 do begin
  Connection:=datamodule3.ADOConnection1;
  Edit;
  FieldByName('цена').Value:=DBEdit4.Text;
 post;
  end;
   With datamodule3.ADOQuery37 do begin
  Connection:=datamodule3.ADOConnection1;
  Edit;
  FieldByName('КОД_ОКЕИ').Value:=DBEdit6.Text;
 post;
  end;
  With datamodule3.ADOQuery37 do begin
  Connection:=datamodule3.ADOConnection1;
  Edit;
  FieldByName('масса_брутто').Value:=DBEdit8.Text;
 post;
  end;
  LabeledEdit3.text:=DBEdit2.Text;
  LabeledEdit2.text:=DBEdit5.Text;
  LabeledEdit4.text:=DBEdit1.Text;
end;
он отлично работает всё хорошо получается
но потом мне необходимо всё удалить из таблицы и я использую для этого нижеследующий код :
Код:
procedure TForm4.BitBtn18Click(Sender: TObject);
begin
  DataModule3.ADOQuery37.Close;
  DataModule3.ADOQuery37.sql.Clear;
  DataModule3.ADOQuery37.SQL.Add('DELETE from TORG'); {все данные из таблицы удаляете?! Не страшно?}
  DataModule3.ADOQuery37.ExecSQL;
end;
этот код прекрасно работает и всё удаляет оставляя пустую таблицу вот но потом мне надо обновить таблицу и заново внести в неё новые данные (Данная таблица используется для временного хранения данных при новой последующей операции над ней она должна быть пуста ) .
Так вот я делаю так :
Код:
procedure TForm4.BitBtn16Click(Sender: TObject);
begin
DataModule3.ADOQuery37.Edit;
DataModule3.ADOQuery37.post;
DataModule3.ADOQuery37.Refresh;
end;
и в итоге получаю ошибку, приходиться выключать программу и заново её запускать тогда всё работает короче я могу провернуть только один раз такой алгоритм работы над данными и заново приходиться всё включать это не хорошо подскажите что я не так сделал в чём проблема а ?
Изображения
Тип файла: jpg 87р.JPG (77.0 Кб, 118 просмотров)
reihtmonbern вне форума Ответить с цитированием
Старый 15.12.2013, 21:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Правильно получаешь. После ExecSQL тебе нужно его окрыть методом Open, указав запрос. Вот только потом уже можно работать с компонентом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2013, 22:12   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

согласен с ответом Stilet
а я бы рекомендовал не жадничать, не экономить на датасетах и для удаления использовать отдельный датасет!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2013, 22:48   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Connection:=datamodule3.ADOConnecti on1;
А это зачем каждый раз? В данном случае просто пустое действие. Но если вдруг и на самом деле указатель на другой компонент будет, то датасет просто закроется и опять ...on a closed dataset
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.12.2013, 09:05   #5
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Правильно получаешь. После ExecSQL тебе нужно его окрыть методом Open, указав запрос. Вот только потом уже можно работать с компонентом.
Так что ли :
Код:
procedure TForm4.BitBtn16Click(Sender: TObject);
begin
DataModule3.ADOQuery37.Open;
DataModule3.ADOQuery37.SQL.Add('select * from TORG');
DataModule3.ADOQuery37.Edit;
DataModule3.ADOQuery37.post;
DataModule3.ADOQuery37.Refresh;
end;
??? КАК правильно то надо я чего то не очень понял !?
reihtmonbern вне форума Ответить с цитированием
Старый 16.12.2013, 09:12   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

нет.
сначала запрос нужно поместить. а уже потом открывать:
Код:
DataModule3.ADOQuery37.Close; {на всякий случай}
DataModule3.ADOQuery37.SQL.Clear; {если испльзуете ADD - тогда нужно обязательно предварительно стереть старый текст!}
DataModule3.ADOQuery37.SQL.Add('select * from TORG');
DataModule3.ADOQuery37.Open;
....
p.s. а зачем на пустом датасете выполнять Edit и Post ?!!! Вы же удалили ВСЕ записи из таблицы, что Вы собрались редактировать методом Edit ?! Не удивлюсь, если Вы получите ещё другую ошибку!

p.p.s. Не могу понять, чего Вы пытаетесь добиться, какую именно задачу решаете таким кодом?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при добавлении записи Itachi БД в Delphi 1 10.06.2011 13:30
Не обновляются данные в базу данных при добавлении новой строки! в чем ошибка?!!!! Elly-lll Помощь студентам 2 17.05.2011 22:57
Ошибка при добавлении данных в бд prizrak1390 PHP 3 29.07.2010 22:47
Ошибка при добавлении данных Ehha1234 БД в Delphi 0 19.06.2010 20:33
MSSQL Server>Delphi. Ошибка при добавлении данных POPOV БД в Delphi 1 20.04.2010 21:42