Вопрос № 178333: Уважаемые эксперты! Как многократно изменять SQL-запрос в элементе ADOQuery по событию в программе? Конкретно, по выделению элемента в списке объекта ComboBox изменять имя таблицы в SQL-запросе так, чтобы объект ADOQuery был активен и из DataSo...
Вопрос № 178333:
Уважаемые эксперты! Как многократно изменять SQL-запрос в элементе ADOQuery по событию в программе? Конкретно, по выделению элемента в списке объекта ComboBox изменять имя таблицы в SQL-запросе так, чтобы объект ADOQuery был активен и из DataSource.DataSet взять значения полученные по запросу. СУБД – SQLServer2005 Express. Среда – Delphi7. Подключение к БД через ODBC. Мой код: ADOQuery4.Active:=False; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Text:='SELECT B_CODE B_NAME
FROM C15'; ADOQuery4.Open; ADOQuery4.Active:=True; ADOQuery4.ExecSQL; Объект ADOQuery выходит из активного состояния. Соответственно из DataSource можно взять только количество записей и первое значение от запроса.
Отвечает Victor Pyrlik, Модератор :
Здравствуйте, victor_kst. вот небольшой пример.. В общем то, оформлено в виде функции - сделано специально, что бы показать что и как можно (хотя, это далеко не всё). Можно проще - например использовать Requery() и т.д. Старайтесь использовать свойство Active для открытия/закрытия набора данных - это безопасный метод. При Close и Open - если набор данных в противоречивом состоянии (открыт уже а мы вызываем Open...) выскачет ошибка - старайтесь не надеяться на то, что у вас в коде все "хорошо"
и ошибок не будет.. Для этого, используется в примере защищенный блок try Ну и очень полезно отключать на время переключения набора данных от контролов - DisableControl и после его активации включать - EnableControl - это уберет ненужно моргание в таблицах.
ExecSQL используется для выполнения команд, как правило, управляющих запросов, не возвращающих результат.
Приложение:
----- Жизнь игрушка – пока играешь сам..
Ответ отправил: Victor Pyrlik, Модератор
Ответ отправлен: 11.05.2010, 15:07
Номер ответа: 261336 Россия, Екатеринбург Тел.: 89043822027 ICQ # 490191733 Абонент Skype: stells00
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261336
на номер 1151 (Россия) |
Еще номера »
Отвечает Алексей S, 5-й класс :
Здравствуйте, victor_kst.
ADOQuery4.Active:=True; ADOQuery4.ExecSQL; Этих двух строк не надо
И если B_CODE и B_NAME это имена полей, а не имя и псевдоним, то между ними нужна запятая
И помоему ADOQuery4.SQL.Clear; уже закрывает кверю, так что ADOQuery4.Active:=False; необязателен
Ответ отправил: Алексей S, 5-й класс
Ответ отправлен: 11.05.2010, 15:28
Номер ответа: 261337
Оценка ответа: 5 Комментарий к оценке: Спасибо!
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261337
на номер 1151 (Россия) |
Еще номера »
Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, victor_kst. Могу предложить следующее решение:
Код:
ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('SELECT B_CODE, B_NAME FROM C15'); ADOQuery4.Open;
у меня в программе работает без проблем.
----- Помогли тебе, помоги и ты.
Ответ отправил: Евгений/Genia007/, Бакалавр
Ответ отправлен: 11.05.2010, 15:48
Номер ответа: 261338
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261338
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.