Как удалить определенные строки из Access через Delphi? - PullRequest
1 голос
/ 22 марта 2012
while not TBLOrder.Eof do
begin
  TBLOrder.Locate('OrderID', Total, []);
  TBLOrder.Delete;
end;

Это просто удаляет каждую строку в моей базе данных Access, что действительно раздражает.

Я пытаюсь заставить программу удалить выбранную строку (итого).

Из того, что я понимаю, он должен найти выбранную строку, которая равна Total. например Если Total = 3, он должен найти строку, где OrderID = 3, а затем удалить эту строку.

Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Попробуйте вместо этого (процедура Макса требует от вас перебрать весь набор данных, что нормально, если в нем много строк):

while (TblOrder.Locate('OrderID', Total, [])) do
  TblOrder.Delete;

TDataSet.Locate возвращает логическое значение; если это правда, найденная запись становится активной, и вы можете удалить ее. Если он возвращает False (то есть запись не найдена), вызов Delete никогда не выполняется.

Кстати, проблема с вашим исходным кодом заключается в том, что вы проверяете на Eof, но никогда не проверяете, находит ли Locate запись; вы просто удаляете любую запись, а затем снова проверяете Eof. Если вы не на Eof, вы звоните Locate, игнорируете, нашла ли запись запись и удаляете любую строку, в которой вы находитесь. Затем это повторяется снова и снова до тех пор, пока не останется больше записей, и в этот момент Eof вернет true, и вы прервете цикл.

2 голосов
/ 22 марта 2012

Если есть только одна строка, в которой ORDERID равен 3, вам не нужен цикл WHILE.

Если вы ожидаете более одной строки с ORDERID, равным 3, сделайте следующее:

TBLOrder.first; // you could also do the locate here if it's a big table
while not TBLOrder.Eof do
begin
 if TBLOrder.FieldByName('OrderID').AsInteger = 3 then
   TBLOrder.delete
 else
   TBLOrder.next;
 end;

В противном случае вы также можете использовать SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...