Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не могу понять, что влияет на ошибку  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Добрый день! Может кто-нибудь подскажет где кроется решение проблемы!
В БД 2 таблицы - мастер - Remont и детейл - Dannie_Komissia_Remont (список комиссии ФИО и должность), в делфи (Сиэтл) использую компоненты ADO, соединены по первичному ключу ID_Remont основной таблицы. В Делфи хочу, чтобы в детейл добавлялись поля из не связанной таблицы Sotrydnik (список персонала ФИО и должность). Вешаю на нажатие кнопки такой код:
if(ADOQuery19.Active)
then ADOQuery19.Close;
ADOQuery19.SQL.Add('INSERT INTO Dannie_Komissia_Remont (ID_Remont, FIO, Dolznost) SELECT ID_Remont='''+ADODataSet1.FieldByName('ID_Remont').AsString+''', FIO, PDKK FROM Sotrydnik WHERE PDKK IN (''Заместитель председателя комиссии'',''Член комиссии'') ORDER BY PDKK,FIO DESC');
ADOQuery19.ExecSQL;
ADOTable1.Close;
ADOTable1.Open;

Работает не корректно - в первый раз когда создаешь новую запись всё нормально, в связанную таблицу заносятся записи (4шт.) с нужным ID и потом на форме всё отображается. Когда во вторую новую запись вставляю комиссию - в БД уже заносятся записи с текущим и предыдущим ID (8шт.) и так далее, все предыдущие записи обрабатываются, что ,естественно, не правильно - должны записываться только с текущим ID, на котором стоит курсор!

Уже дня три понять не могу в чём проблема. Есть какие идеи в чем кроется проблема? В настройках компонент ADO или в базе что-то надо подкрутить? А может я опять всё не правильно сделал?
Заранее спасибо сочуствующим ))
7 дек 18, 12:56    [21756930]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
FOGOT-BAstA,

какие еще ID? Вы выбираете все строки по условию ''Заместитель председателя комиссии'',''Член комиссии''. Добавьте в выражение фильтра WHERE and not exists (select ...), если не хотите выбирать существующие.
7 дек 18, 13:11    [21756957]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2375
FOGOT-BAstA
должны записываться только с текущим ID, на котором стоит курсор!

так вы скажите об этом серверу базы данных.
с помощью волшебного слова WHERE
7 дек 18, 13:19    [21756970]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
iiyama
Member

Откуда:
Сообщений: 642
FOGOT-BAstA,
Немного офф, для передачи значений в запрос используйте параметры. Собирать так запрос-дурной тон.
7 дек 18, 14:19    [21757071]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Спасибо за ответы!
В менеджере SQL запрос выполняется правильно, в таблицу при указании конкретного ID_Remont в Dannie_Komissia_Remont добавляется необходимые 4 записи.
Владислав Колосов
FOGOT-BAstA,
Я же их из Sotrydnik выбираю, там 4 записи таких! Можно EXISTS, а можно IN, который я и использую...
какие еще ID? Вы выбираете все строки по условию ''Заместитель председателя комиссии'',''Член комиссии''. Добавьте в выражение фильтра WHERE and not exists (select ...), если не хотите выбирать существующие.

StarikNavy,
ID_Remont='''+ADODataSet1.FieldByName('ID_Remont').AsString+'''

Вот тут я ведь указываю конкретный текущий ID из Датасета, который надо внести в те 4 строки, которые выбираются из Sotrydnik. Как-то по другому сделать можно средствами SQL?
Странно, что при внесении записей из Delphi добавляет вновь созданные в сессии ID_Remont в выборку
iiyama,
С параметрами постоянный гемор, надо их определять правильно...дольше возиться, уж привык напрямую писать
10 дек 18, 08:10    [21758770]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
FOGOT-BAstA
С параметрами постоянный гемор, надо их определять правильно...дольше возиться, уж привык напрямую писать

Really? А потом кто-нибудь из вредности заведет тебе в поле ID_remont значение
', '', ''; DROP TABLE Dennie_Komissia_Remont; SELECT 1' 

и будешь ты по-старинке на форуме вопрошать "доколе?!"
10 дек 18, 11:14    [21758881]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
FOGOT-BAstA,

выбирайте по cdjtve фильтру, но исключите те ID которые уже перенесены, я об этом писал. Исключить можно использую not exists().
10 дек 18, 12:41    [21759002]     Ответить | Цитировать Сообщить модератору
 Re: Не могу понять, что влияет на ошибку  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Руслан Дамирович,
Успокойтесь, таких вопросов от меня пока не было и не будет. Тем более ID напрямую беру из DataSet'а, параметр тоже его брать будет оттуда же, так какая разница? Поле инкрементное, ключевое, числовое, пользователь его не видит и оно защищено от редактирования. Свои теоретические домыслы оставьте при себе. А если пользователь сможет в приложении каким-то образом написать SQL код с такими записями, то это уже не вопрос передачи параметров...
Владислав Колосов,
Спасибо, теперь вроде стало более понятно, что Вы имели ввиду. Но в таком случае думаю надо дописывать большой алгоритм считывания всех предыдущих ID, которые были введены в сессии.
Я всё-таки грешил на компонент ADOQuery, в обработчике кнопки написал вот так
if(ADOQuery19.Active)
then ADOQuery19.Close;
ADOQuery19.SQL.Add('INSERT INTO Dannie_Komissia_Remont (ID_Remont, FIO, Dolznost) SELECT ID_Remont='''+ADODataSet1.FieldByName('ID_Remont').AsString+''', FIO, PDKK FROM Sotrydnik WHERE PDKK IN (''Заместитель председателя комиссии'',''Член комиссии'') ORDER BY PDKK,FIO DESC');
ADOQuery19.ExecSQL;
ADOQuery19.SQL.Clear;
ADOQuery19.Close;
ADOTable1.Close;
ADOTable1.Open;

и всё стало вводиться корректно...
13 дек 18, 09:44    [21762452]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить