ADOQuery.Delete

HobbytF
Дата: 16.12.2019 14:12:13
Приветствую.

Требуется удалить запись из набора DataSet.

ADOQuery.SQL.Text:='select article from table where article='0005';
ADOQuery.Open;
ADOQuery.Locate('article','0005',[loPartialKey]);
ShowMessage(ADOQuery.FieldByName('article').AsString);
ADOQuery.Delete;
ShowMessage(ADOQuery.FieldByName('article').AsString);


При первом запуске программы первый ShowMessage показывает article, а второй показывает NULL. Этого я и добиваюсь.
Но при последующих запусках программы даже первый ShowMessage показывает NULL.
Запись в базе данных не удалена, но она больше не отображается.

Для чего я это делаю: Есть два больших набора данных, которые мне требуется сравнить. Прохожу циклом по первому набору данных и нахожу соответствующую запись из второго. Если запись существует, удаляю ее из второго набора. В итоге во втором наборе останутся только записи, отсутствующие в первом.
Может есть более элегантное решение?
kv67
Дата: 16.12.2019 14:36:32
HobbytF,

ADOQuery.SQL.Text:='delete from table where article=''0005''';
ADOQuery.ExecSQL;
Квейд
Дата: 16.12.2019 14:46:22
HobbytF

Для чего я это делаю: Есть два больших набора данных, которые мне требуется сравнить. Прохожу циклом по первому набору данных и нахожу соответствующую запись из второго. Если запись существует, удаляю ее из второго набора. В итоге во втором наборе останутся только записи, отсутствующие в первом.

Может есть более элегантное решение?

Есть. Выполнить всего один запрос вроде такого
DELETE FROM TABLE2 WHERE ARTICLE IN (SELECT ARTICLE FROM TABLE1)
HobbytF
Дата: 16.12.2019 15:10:27
kv67
HobbytF,

ADOQuery.SQL.Text:='delete from table where article=''0005''';
ADOQuery.ExecSQL;


Нет, мне не нужно удалять эту запись из базы данных. Мне нужно только найти разницу.
HobbytF
Дата: 16.12.2019 15:11:18
Квейд
HobbytF

Для чего я это делаю: Есть два больших набора данных, которые мне требуется сравнить. Прохожу циклом по первому набору данных и нахожу соответствующую запись из второго. Если запись существует, удаляю ее из второго набора. В итоге во втором наборе останутся только записи, отсутствующие в первом.

Может есть более элегантное решение?

Есть. Выполнить всего один запрос вроде такого
DELETE FROM TABLE2 WHERE ARTICLE IN (SELECT ARTICLE FROM TABLE1)


Это тоже удаление из базы. У мне нужно на этапе обработки этих датасетов.
kv67
Дата: 16.12.2019 15:16:40
HobbytF,

ADOQuery.SQL.Text:='select article from table2 where article not in (select article from table1)';
ADOQuery.Open;
_Vasilisk_
Дата: 16.12.2019 15:56:01
HobbytF
Нет, мне не нужно удалять эту запись из базы данных. Мне нужно только найти разницу.
HobbytF
ADOQuery.Delete;
Вы как-то определитесь
HobbytF
Дата: 16.12.2019 21:14:25
kv67
HobbytF,

ADOQuery.SQL.Text:='select article from table2 where article not in (select article from table1)';
ADOQuery.Open;


Это тоже не то. Дело в том, что первый датасет формируется из бд oracle, второй - из postgresql. Задача - их сравнить в приложении. Все, что можно сделать в бд, я уже сделал.
HobbytF
Дата: 16.12.2019 21:20:14
_Vasilisk_
HobbytF
Нет, мне не нужно удалять эту запись из базы данных. Мне нужно только найти разницу.
HobbytF
ADOQuery.Delete;
Вы как-то определитесь


Да вроде определенно сказал. Нужно удалить запись из датасета, а не из базы. Может быть я неправильно термины употреляю. В результате ADOQuery.Open формируется набор данных - датасет. Вот что я имею в виду. Другой вопрос - что делает метод delete? Он и из базы не удаляет, и из датасета удаляет напрочь (описал в первом посте).
HobbytF
Дата: 16.12.2019 21:58:15
HobbytF
_Vasilisk_
пропущено...
пропущено...
Вы как-то определитесь


Да вроде определенно сказал. Нужно удалить запись из датасета, а не из базы. Может быть я неправильно термины употреляю. В результате ADOQuery.Open формируется набор данных - датасет. Вот что я имею в виду. Другой вопрос - что делает метод delete? Он и из базы не удаляет, и из датасета удаляет напрочь (описал в первом посте).


Дико извиняюсь. ADOQuery.Delete все-таки удаляет запись из базы. А это совершенно не нужно. Значит этот метод не подходит. Вообще, есть ли такой метод, который удовлетворяет моей потребности?