Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / invalid namber при удаление записей из БД / 10 сообщений из 10, страница 1 из 1
19.02.2020, 09:59
    #39928295
elimpion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
Здравствуйте, возникает ошибка при удаление 2х записей, ошибка возникает при передаче id
id имеет значение '11025220,11025314' (без ковычек). Подскажите как решить данную проблему
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
const sqldel='delete code n '+
             ' where n.reason = :reason   '+
             '   and n.codeid in (:codeid)';
var
  Query : TOraQuery;
  TransMgrE : TTransMgr;
  id: string;
  i: integer;
begin
  inherited;

  for i:=0 to dspcode.Grid.SelCount - 1 do //dbgrdh1.SelectedField
  begin
    dspcode.DataSource.DataSet.GotoBookmark(Pointer(dspcode.Grid.SelectedRows.items[i]));
    id:=id + VarToStr(dspcode.DataSource.DataSet.FieldByName('codeid').Value) + ', ';
  end;

  id:= Copy(id, 1, Length(id)- 2);

  if scrReasonsId.IsEmpty then
    exit;
  if GetConfirmation('Удалить связку?') then begin
    TransMgrE := FApp.QI.GetTransMgr;
    Query:=FQI.CreateQuery;
    Query.SQL.Text:=sqldel;
    Query.ParamByName('reason').Text:=scrReasonsId.FieldByName('reason').Text;
    Query.ParamByName('codeid').Text:=id; //'11025220,11025314';
    TransMgrE[FApp.QI.DataBase].StartTransaction;
    try
      Query.ExecSQL;
    except
      raise;
      TransMgrE[FApp.QI.DataBase].RollBack;
      exit;
    end;
    TransMgrE[FApp.QI.DataBase].Commit;
    Refresh;
    FQI.FreeQuery(Query);
  end;
...
Рейтинг: 0 / 0
19.02.2020, 10:08
    #39928299
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
elimpion,

Ошибка возникает, потому что текст запроса преобразовывается в следующий:
Код: sql
1.
delete code n where n.reason = '<sample_reason>' and n.codeid in ('11025220,11025314')


Поэтому решение 1) удалять по одному коду в единой транзакции; 2) зависит от того, какой сервер СУБД: можно разбирать строку кодов на стороне SQL-сервера в специальной процедуре или использовать временную таблицу, которую заполнить с клиента.
...
Рейтинг: 0 / 0
19.02.2020, 10:14
    #39928302
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
Код: pascal
1.
2.
3.
4.
5.
6.
  const sqldel='delete code n '+
             ' where n.reason = :reason   '+
             '   and n.codeid in (%s)';
 ..............................................
  Query.SQL.Text:=Format(sqldel, [id]);
 ..............................................
...
Рейтинг: 0 / 0
19.02.2020, 10:38
    #39928308
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
в некоторый серверах есть табличные параметры
...
Рейтинг: 0 / 0
19.02.2020, 10:53
    #39928318
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
elimpion
при удаление 2х записей


Код: pascal
1.
 '   and n.codeid in (:code_One, :code_Two)';
...
Рейтинг: 0 / 0
19.02.2020, 11:52
    #39928352
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
elimpion
Подскажите как решить данную проблему

Наиболее удачный по вменяемость/сложность способ -

Код: pascal
1.
2.
3.
4.
...
             '   and n.codeid in (&codeid)';
...
    Query.MacroByName('codeid').Text:=id;


Но не все компоненты доступа к БД это поддерживают.
...
Рейтинг: 0 / 0
19.02.2020, 12:06
    #39928359
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
elimpion
2х записей
еще не забывать что у субд бывают ограничения на кол-во в списке in, так что может есть смысл сразу переделать на процедуру, доп. таблицу и т.п.
ну или в несколько итераций по 1000 (или сколько там у вашей базы можно раз речь об оракле)
...
Рейтинг: 0 / 0
19.02.2020, 12:11
    #39928364
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
если список удаляемых записей "овер дофига",
то имеет смысл воспользоваться временной таблицей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.02.2020, 17:57
    #39928601
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
Для желающих получить "in с параметром" в FireBird придумали вот такую селективную процедурку: https://www.sql.ru/forum/607154-2/kak-v-in-podstavit-spisok-parametrov-hranyashhiysya-v-peremennoy?mid=6686267#6686267
...
Рейтинг: 0 / 0
19.02.2020, 18:09
    #39928609
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invalid namber при удаление записей из БД
softwarer
Но не все компоненты доступа к БД это поддерживают.

Тогда
Код: pascal
1.
Format ('... in (%s)...', [ids]);
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / invalid namber при удаление записей из БД / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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