Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/39: Рейтинг темы: голосов - 39, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 20

Из AdoQuery в Edit.Text

04.07.2013, 19:24. Показов 8330. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, помогите с проблемой, у самого уже мозг под вечер кипит((((

Значит необходимо получать данные ячеек с MSSQL через AdoQuery, НО используя Parameters.

Например для обновления записей в таблице в Adoquery.Sql пишу
Update Table1 SET Имя = :Name, Материал1 = :M1, Материал2 = :M2, where № = :ID;
После чего я могу оперировать переменными Name, M1, M2 по своему усмотрению.
Например:
"ADOQuery1.Parameters.ParamByName('M1'). Value:=StrToFloat(Form4.Item1)".

А вот как сделать чтение в переменные Name, M1, M2???
Очень давно не сталкивался с SQL запросами и маленько подзабыл...
Я предполагал, что запрос должен выглядеть как то так:
"Select :Name = Имя, :M1 = Материал1, :M2 = Материал2 from table1 where № = :ID"
Ну или как то так:
"Select Имя, Материал1, Материал2 from table1 where № = :ID Set :Name = Имя, :M1 = Материал1, :M2 = Материал2;"

Да, решение типа "Edit2.Text:=Adoquery1.FieldByName('Имя' ).AsString;" не предлагать ибо для этого нужно
выполнять операции типа:
"Adoquery1.Active:=True;
Adoquery1.Open; "
и
"Adoquery1.Active:=False;
Adoquery1.Close;" каждый раз. А это ОЧЕНЬ СИЛЬНО влияет на скорость опроса!
Нужно использовать только "AdoQuery1.ExecSQL;"

Ну или можно использовать хранимую процедуру, но опять таки синтаксис sql я подзабыл(((

Так сказать задача стоит в синхронизации записей между архивом устройства и архивом компьютера.
Вот как то так...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2013, 19:24
Ответы с готовыми решениями:

ADOQuery.Edit
с помощью ADOQuery запросом вывожу в dbgrid данные из 5 таблиц.по нажатию на строку dbgrid ondbclick все данные помещаются в edit....

Из ADOQuery в Edit
Помогите пожалуйста корректно вывести данные из выборки в Edit. Ситуация следующая: при попытке вывести таким образом ...

ADOQUERY Edit (Поле ввода)
у меня на форме есть ADOQUERY и 2 Edit'а запрос такой: SELECT Avtor, Nazvanie, Izdanie, God_izdatelstva FROM Spisok WHERE...

12
71 / 71 / 7
Регистрация: 19.07.2011
Сообщений: 357
04.07.2013, 21:02
что значит
"А вот как сделать чтение в переменные Name, M1, M2???"
как присвоить переменным Name, M1, M2 какие-то значения?

кладешь TEdit для соответствующей переменной, где-нибудь кнопку "OK", которая запустить на выполнение запрос

T-SQL
1
Select * from MyTable where Name = :Name and Material1 =:M1 and Materail2 =:M2
Delphi
1
2
3
4
5
6
7
With ADOQuery1 do begin
 Close;
  Parameters.ParamByName('Name').Value:=MyEdit1.Text;
  Parameters.ParamByName('M1').Value:=StrToFloat(MyEdit2.Text);
  Parameters.ParamByName('M2').Value:=StrToFloat(MyEdit3.Text);  
 Open;
End;
0
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 20
04.07.2013, 22:20  [ТС]
Цитата Сообщение от zremas Посмотреть сообщение
что значит

как присвоить переменным Name, M1, M2 какие-то значения?

кладешь TEdit для соответствующей переменной, где-нибудь кнопку "OK", которая запустить на выполнение запрос

T-SQL
1
Select * from MyTable where Name = :Name and Material1 =:M1 and Materail2 =:M2
Delphi
1
2
3
4
5
6
7
With ADOQuery1 do begin
 Close;
  Parameters.ParamByName('Name').Value:=MyEdit1.Text;
  Parameters.ParamByName('M1').Value:=StrToFloat(MyEdit2.Text);
  Parameters.ParamByName('M2').Value:=StrToFloat(MyEdit3.Text);  
 Open;
End;
Нужно не значениям базы присвоить значения edit, а edit присвоить значение параметра.
Типа
Delphi
1
2
3
4
5
6
7
With ADOQuery1 do begin
 Close;
MyEdit1.Text:=Parameters.ParamByName('Name').Value;
MyEdit2.Text:=FloatToStr(Parameters.ParamByName('M1').Value);
MyEdit3.Text:=FloatToStr(Parameters.ParamByName('M2').Value);  
 Open;
End;
Вопрос состоит в том, как правильно составить SQL запрос в AdoQuery/
0
71 / 71 / 7
Регистрация: 19.07.2011
Сообщений: 357
04.07.2013, 22:47
извините, но это бред!

Нужно не значениям базы присвоить значения edit, а edit присвоить значение параметра.
Типа
Delphi
1
2
3
4
5
6
7
With ADOQuery1 do begin
 Close;
  MyEdit1.Text:=Parameters.ParamByName('Name').Value;
  MyEdit2.Text:=FloatToStr(Parameters.ParamByName('M1').Value);
  MyEdit3.Text:=FloatToStr(Parameters.ParamByName('M2').Value);  
 Open;
End;

наверное, вопрос в том: как показать ЗНАЧЕНИЯ полей в TEdit или DBEdit?
0
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 20
04.07.2013, 23:29  [ТС]
Цитата Сообщение от zremas Посмотреть сообщение
извините, но это бред!




наверное, вопрос в том: как показать ЗНАЧЕНИЯ полей в TEdit или DBEdit?
Гм... Почему бред то???
Нет, не в DBEdit...
В общем расскажу вкратце...
Есть форма с OPC клиентом. Соответственно он коннектится к OPC серверу, читает и пишет данные.
OPC сервер работает с ПЛК. В ПЛК хранится некий архив, на данный момент стоит задача синхронизация архива ПЛК и архива в MSSQL. Запись с контроллера в MSSQL я реализовал, а вот из MSSQL в ПЛК не выходит. Точнее выходит, но метод записи не устраивает (очень долго - 2c на запись) ибо необходимо передать 100 записей по одной....
На данный момент реализован следующий код записи из MSSQL в OPC сервер:
Delphi
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
Adoquery1.Close;
 
if Form4.Item81='True' then
 
Begin
 
a1:=a1+1;
 
Adoquery1.Parameters.ParamByName('ID').Value:=a1;
 
Adoquery1.Open;
 
Form4.Item29:=FloatToStr(Form10.a1);
 
Form4.Item77:=Form10.ADOQuery1.FieldByName('Имя').AsString;
 
Form4.Item31:=Form10.ADOQuery1.FieldByName('Материал1').AsString;
 
Form4.Item32:=Form10.ADOQuery1.FieldByName('Материал2').AsString;
 
Form4.Item33:=Form10.ADOQuery1.FieldByName('Материал3').AsString;
 
Form4.Item34:=Form10.ADOQuery1.FieldByName('Материал4').AsString;
 
Form4.Item35:=Form10.ADOQuery1.FieldByName('Материал5').AsString;
 
end;
Где Form4 это форма OPC Клиента а Item это переменная программы в ПЛК. Плюс весь этот код крутится в теле таймера, но это совсем не важно.

Код SQL в ADOQUERY Такой:

T-SQL
1
2
Select ID, Имя, Материал1, Материал2, Материал3,
 Материал4, Материал5 from ARHIV_PLK where ID = :ID
Всё торможение происходит из-за постоянного открытия/закрытия AdoQuery.

Поэтому вижу только один выход из этой ситуации - это получение следующей записи из таблицы путём обновления запроса - "AdoQuery1.ExecSQL;".

В общем нужно присваивать так и только так:

Delphi
1
Form4.Item77:=Form10.Adoquery1.Parameters.ParamByName('Name').Value;
Осталось просто составить правильный sql запрос.
0
71 / 71 / 7
Регистрация: 19.07.2011
Сообщений: 357
04.07.2013, 23:44
весь концепт попахивает бредом.
--------------------------
Я правильно понял:
Получается, что некий цикл (a1:=a1+1 постоянно дергает sql запрос, каждый раз передавая новый ID.
0
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 20
04.07.2013, 23:48  [ТС]
Цитата Сообщение от zremas Посмотреть сообщение
весь концепт попахивает бредом.
--------------------------
Я правильно понял:
Получается, что некий цикл (a1:=a1+1 постоянно дергает sql запрос, каждый раз передавая новый ID.
Почему бредом? Может у меня мозг уже отказывает.... Можете что то альтернативное предложить???
Да, вы правильно поняли....
0
71 / 71 / 7
Регистрация: 19.07.2011
Сообщений: 357
04.07.2013, 23:51
решением может быть:
- вытащить на клиента ВЕСЬ датасет, созданный ОДИН раз на сервере для всех a1 от забора и до обеда
- на клиенте организовать цикл пробежки по принятому датасету и передаче данных в ПЛК
1
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
04.07.2013, 23:58
ExecSQL, батенька не поможет. Тем более, что метод этот применяется ТОЛЬКО для модифицирующих запросов.
В частности, для обновления данных (UPDATE).
Если постоянно менять параметр запроса для получения новых данных, то и хранимая процедура не поможет избежать упомянутых "тормозов".
А получение данных из таблиц базы возможен только с применением метода Open.
И не стоит здесь мудрить, потому как другого пути просто нет.
То что вы там пытаетесь показать, что "нужно присваивать так и только так:" относиться к выходным
параметрам хранимых процедур и, как выше сказано, ничем в увеличении скорости получения данных ХП не поможет.

Оптимизация скорости выполнения может быть только в одном - получить селективным запросом (SELECT) по возможности
как можно больше записей за один "Open" и с результатом запроса разбираться на клиенте (в программе).
1
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 20
05.07.2013, 00:07  [ТС]
Цитата Сообщение от zremas Посмотреть сообщение
решением может быть:
- вытащить на клиента ВЕСЬ датасет, созданный ОДИН раз на сервере для всех a1 от забора и до обеда
- на клиенте организовать цикл пробежки по принятому датасету и передаче данных в ПЛК
То есть Вы предлагаете все записи таблицы БД запихнуть сразу допустим в DBGrid, а оттуда уже пробежкой в ПЛК гнать?
Можно... Я думал об этом... Но надеялся обойтись без DBGrid... К примеру хранимой процедурой... Ну да ладно... Так значит так... Завтра буду пихать всё в DBGrid.

Добавлено через 3 минуты
Цитата Сообщение от Скандербег Посмотреть сообщение
ExecSQL, батенька не поможет. Тем более, что метод этот применяется ТОЛЬКО для модифицирующих запросов.
В частности, для обновления данных (UPDATE).
Если постоянно менять параметр запроса для получения новых данных, то и хранимая процедура не поможет избежать упомянутых "тормозов".
А получение данных из таблиц базы возможен только с применением метода Open.
И не стоит здесь мудрить, потому как другого пути просто нет.
То что вы там пытаетесь показать, что "нужно присваивать так и только так:" относиться к выходным
параметрам хранимых процедур и, как выше сказано, ничем в увеличении скорости получения данных ХП не поможет.

Оптимизация скорости выполнения может быть только в одном - получить селективным запросом (SELECT) по возможности
как можно больше записей за один "Open" и с результатом запроса разбираться на клиенте (в программе).
Опаньки! А вот про особенность ExecSQL подзабыл(((( Сори за поднятый кипиш....

Добавлено через 2 минуты
Всем спасибо за помощь! Дальше справлюсь)))
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
05.07.2013, 00:12
То есть Вы предлагаете все записи таблицы БД запихнуть сразу допустим в DBGrid, а оттуда уже пробежкой в ПЛК гнать?
Виноват, zremas, отвечу за вас (больше не буду).
Нет, нет и еще 100 раз "нет".
Когда компонент ADOQuery открывается и возвращает результат запроса - в нем как раз и сидят те данные, которые так нужны.
Грид используют только для отображения полученного результата.
Отсюда, как и сказано, надо будет пробежаться по ADOQuery (а не по DBGrid'у). Так что грид в этой ситуации не нужен.
0
71 / 71 / 7
Регистрация: 19.07.2011
Сообщений: 357
05.07.2013, 00:26
Завтра буду пихать всё в DBGrid.
DBGrid тут непричем!
Достаточно ОДИН раз получить весь датасет для всего спектра a1, а потом организовать цикл по датасету ( а не по DBGrid)
0
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 20
05.07.2013, 09:18  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
Виноват, zremas, отвечу за вас (больше не буду).
Нет, нет и еще 100 раз "нет".
Когда компонент ADOQuery открывается и возвращает результат запроса - в нем как раз и сидят те данные, которые так нужны.
Грид используют только для отображения полученного результата.
Отсюда, как и сказано, надо будет пробежаться по ADOQuery (а не по DBGrid'у). Так что грид в этой ситуации не нужен.
Не, енто само сабой... Грид нужен, для удобства сверки отправляемых и получаемых данных)))) Поэтому так))) Спасибо большое! Я дальше разберусь!)

Добавлено через 16 минут
Цитата Сообщение от zremas Посмотреть сообщение
DBGrid тут непричем!
Достаточно ОДИН раз получить весь датасет для всего спектра a1, а потом организовать цикл по датасету ( а не по DBGrid)
Как выше сказано DBGrid нужен только для удобства сверки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2013, 09:18
Помогаю со студенческими работами здесь

Dataset not in edit or insert mode (ADOQuery)
Проблема такова: нужно автоматически сохранять данные в ADOQuery при событии edit2change. Но дело в том, что возможен тот случай, когда...

ошибка ADOQuery:DATAset not in edit or insert mode
выходит ошибка при добавлении данных в таблицyу. на форме дбкомбобох в нем 2 поля да и нет.если выбираешь да, то переходишь на другую форму...

Ошибка: 'FDQuery: Parameter 'edit.Text' not found'
Мир всем и привет ! помогите пожалуйста раньше я сделал через ADOQuery не было проблем, и в чем же проблема с FDQuery? ...

Как перевести Edit.Text из String в Number (SQL)
В таблице Vakansii есть поле Vozrast типа Number. Как его сравнить с Edit.Text в SQL? Пробовал так, неполучилось: Vakansii.Vozrast ...

Ошибка "AdoQuery dataset not in edit or insert mode" при незаполненных полях
Если я не заполняю поля и нажимаю на Кнопку "ОК", то выходит ошибка "adoquery1 dataset not in edit or insert mode" можно её как-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru