powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADOQuery.Delete
18 сообщений из 18, страница 1 из 1
ADOQuery.Delete
    #39903463
HobbytF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.

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

Код: pascal
1.
2.
3.
4.
5.
6.
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.
Запись в базе данных не удалена, но она больше не отображается.

Для чего я это делаю: Есть два больших набора данных, которые мне требуется сравнить. Прохожу циклом по первому набору данных и нахожу соответствующую запись из второго. Если запись существует, удаляю ее из второго набора. В итоге во втором наборе останутся только записи, отсутствующие в первом.
Может есть более элегантное решение?
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903482
kv67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HobbytF,

Код: pascal
1.
2.
ADOQuery.SQL.Text:='delete from table where article=''0005''';
ADOQuery.ExecSQL;
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903488
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HobbytF

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

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

Есть. Выполнить всего один запрос вроде такого
Код: plsql
1.
DELETE FROM TABLE2 WHERE ARTICLE IN (SELECT ARTICLE FROM TABLE1)
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903524
HobbytF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kv67
HobbytF,

Код: pascal
1.
2.
ADOQuery.SQL.Text:='delete from table where article=''0005''';
ADOQuery.ExecSQL;



Нет, мне не нужно удалять эту запись из базы данных. Мне нужно только найти разницу.
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903526
HobbytF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд
HobbytF

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

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

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



Это тоже удаление из базы. У мне нужно на этапе обработки этих датасетов.
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903532
kv67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HobbytF,

Код: pascal
1.
2.
ADOQuery.SQL.Text:='select article from table2 where article not in (select article from table1)';
ADOQuery.Open;
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903564
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HobbytF
Нет, мне не нужно удалять эту запись из базы данных. Мне нужно только найти разницу.
HobbytF
Код: pascal
1.
ADOQuery.Delete;

Вы как-то определитесь
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903716
HobbytF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kv67
HobbytF,

Код: pascal
1.
2.
ADOQuery.SQL.Text:='select article from table2 where article not in (select article from table1)';
ADOQuery.Open;



Это тоже не то. Дело в том, что первый датасет формируется из бд oracle, второй - из postgresql. Задача - их сравнить в приложении. Все, что можно сделать в бд, я уже сделал.
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903719
HobbytF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
HobbytF
Нет, мне не нужно удалять эту запись из базы данных. Мне нужно только найти разницу.
HobbytF
Код: pascal
1.
ADOQuery.Delete;

Вы как-то определитесь


Да вроде определенно сказал. Нужно удалить запись из датасета, а не из базы. Может быть я неправильно термины употреляю. В результате ADOQuery.Open формируется набор данных - датасет. Вот что я имею в виду. Другой вопрос - что делает метод delete? Он и из базы не удаляет, и из датасета удаляет напрочь (описал в первом посте).
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903740
HobbytF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HobbytF
_Vasilisk_
пропущено...
пропущено...
Вы как-то определитесь


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


Дико извиняюсь. ADOQuery.Delete все-таки удаляет запись из базы. А это совершенно не нужно. Значит этот метод не подходит. Вообще, есть ли такой метод, который удовлетворяет моей потребности?
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903755
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HobbytF
Вообще, есть ли такой метод, который удовлетворяет моей потребности?

Метод есть, просто вы не можете сформулировать чего хотите
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903759
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
HobbytF
Вообще, есть ли такой метод, который удовлетворяет моей потребности?

Метод есть, просто вы не можете сформулировать чего хотите

Перевожу: он хочет сравнить две таблицы в разных СУБД и получить разницу в датасете.
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903767
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HobbytF
kv67
HobbytF,

Код: pascal
1.
2.
ADOQuery.SQL.Text:='select article from table2 where article not in (select article from table1)';
ADOQuery.Open;



Это тоже не то. Дело в том, что первый датасет формируется из бд oracle, второй - из postgresql. Задача - их сравнить в приложении. Все, что можно сделать в бд, я уже сделал.

Самое смешное, что то, что вы хотите делается именно в СУБД. Либо один сервер линкуется к другому, либо с помощью openquery.
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903773
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравниваем ПЕРВЫЙ датасет со ВТОРЫМ (а ведь можно и сравнивать наоборот) на клиенте
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dataset1.Open;
Dataset2.Open;
Dataset1.First;
while not Dataset1.Eof do begin
  if Dataset2.Locate('Id',Dataset1['Id'],[]) then begin
    // да, такой Id есть во втором датасете
  end;
  Dataset1.Nest;
end;
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903774
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Сравниваем ПЕРВЫЙ датасет со ВТОРЫМ (а ведь можно и сравнивать наоборот) на клиенте
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dataset1.Open;
Dataset2.Open;
Dataset1.First;
while not Dataset1.Eof do begin
  if Dataset2.Locate('Id',Dataset1['Id'],[]) then begin
    // да, такой Id есть во втором датасете
  end;
  Dataset1.Nest;
end;


автор...Есть два больших набора данных, которые мне требуется сравнить. ...
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903787
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор...Есть два больших набора данных, которые мне требуется сравнить. ...
Для человека который не разбирается что такое Delete и 1000 записей - большой набор данных
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903829
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HobbytF
ADOQuery.Delete все-таки удаляет запись из базы. А это совершенно не нужно. Значит этот метод не подходит. Вообще, есть ли такой метод, который удовлетворяет моей потребности?

1) Попробуйте использовать memory DataSet. По-крайней мере, удаление записи у них не удаляет записи на сервере.
2) Переливаете из второй БД в первую нужную таблицу и сравниваете на стороне SQL.
...
Рейтинг: 0 / 0
ADOQuery.Delete
    #39903865
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще применить CachedUpdates, если у компонента есть такая фича
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADOQuery.Delete
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]