Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись результата select`a в переменную... [D6, XP]


vegarulez ©   (2006-09-21 22:56:00) 

Добрейшего всем времени суток! У меня такой вопрос: надо апдейтить запись в табличке по какому-то значению... то бишь where бла-бла-бла = самсинг...
использую dbExpress + MySQL

procedure TForm1.Button2Click(Sender: TObject);
var
xid:integer;
begin
Form1.SQLQuery1.SQL.Clear;
Form1.SQLQuery1.SQL.Add('update `test1` set `num`="'+ Form1.Edit1.Text +'",`sum`='+ Form1.Edit2.Text +', `datetime`="'+ Form1.Edit3.Text +'", `sec`="'+ Form1.Edit4.Text +'" where ID=17');
Form1.SQLQuery1.ExecSQL();
Form1.SQLQuery1.SQL.Clear;
Form1.SQLClientDataSet1.Refresh;
end;

таким образом я апдейчу тока запись с номером 17 а мне надо апдейтить запись с любым номером? взависимости от переменной...

поэтому возникает несколько вопросов:
1. как в переменную xid загнать значение выполненного селекта из базы?
2. (вытекает из предыдущего)... С помощью чего  (какого элемента это можно сделать), насколько я понимаю SQLQuery не годится так как работает тока в 1 сторону не возвращая параметров...

я предполагаю что это делается с помощью SQLClientDataSet. но как? каким методом вернуть значение id в переменную xid?...

Подскажите плз...

P.s. Если вставлять в запросе сверху вмето 17 допустим select max(ID) from test1...  то он ругается...
поэтому хочу там вставлять переменную, в которую передам результам этого запроса...


Johnmen   (2006-09-22 10:55:00) [1]


> Ketmar ©   (22.09.06 10:29) [18]


Не знаю, как там "вычислять математику в том же MS SQL", но разработчики стандарта SQL, сначала 89 потом 92 потом 99, наверное, были не дураки...:)
И чётко описали что есть SELECT, как он работает, и что есть агрегатные ф-ии.


Ketmar   (2006-09-22 10:29:00) [2]

>[17] Johnmen(c) 22-Sep-XLI A.S., 10:22
>max(...) не есть множество, а есть единственное
>значение в контексте [2]
а меня вообще умиляет способность select'а возвращать что угодно. например, вычислять математику в том же MS SQL. логика разработчиков, видимо, была зверски изнасилована и расчленена.


Johnmen   (2006-09-22 10:22:00) [3]


> Ketmar ©   (22.09.06 09:36) [8]
>чисто логически -- ни разу не верный.
> ну не может элемент сравниваться с множеством. или я вообще
> в жизни ничего больше не понимаю. то, что какой-то сервер
> такое поддерживает -- это не фича. это баг. %-)


max(...) не есть множество, а есть единственное значение в контексте [2]


Ketmar   (2006-09-22 10:04:00) [4]

вообще, очень страшный ночной кошмар -- это выборка данных из XML при помощи SQL. даже звучит матерно...


Ketmar   (2006-09-22 10:03:00) [5]

>[13] Palladin(c) 22-Sep-XLI A.S., 09:59
>а вот и не угадал :)
>declare @tmp int
да я так и понял. вот это как раз нелогично и неверно.

>[14] Palladin(c) 22-Sep-XLI A.S., 10:00
>так то оно так... но это здорово помогает
>локализировать проблемму... имо :)
ну да. если инструмент изначально кривой, то и "лечится" такими же кривыми хаками (это я об SQL).


Palladin   (2006-09-22 10:00:00) [6]


> Ketmar ©   (22.09.06 09:58) [12]

так то оно так... но это здорово помогает локализировать проблемму... имо :)


Palladin   (2006-09-22 09:59:00) [7]


> а вот хранить множества в переменных никакой религией не
> запрещено. %-)

а вот и не угадал :)

declare @tmp int


Ketmar   (2006-09-22 09:58:00) [8]

>[10] Palladin(c) 22-Sep-XLI A.S., 09:53
>можно контролировать данные на предмет
>неоднозначности, бо, естественно, при возврате
>более чем одного значения запрос не прокатит...
давай начнём с того, что SQL вообще далеко не идеальный язык для подобных задач. а контролировать валидность при помощи хаков -- это вообще что-то с чем-то. имо. %-)


Ketmar   (2006-09-22 09:56:00) [9]

>[9] Palladin(c) 22-Sep-XLI A.S., 09:48
>:) MSSQL поддерживает... баг T-SQLя...
так много кто поддерживает. но от этого оно не становится логичным и объяснимым. %-)

>там можно и так сделать
>set @tmp=(Select max(id) from table1)
а вот хранить множества в переменных никакой религией не запрещено. %-)

зыж да, я понимаю, что множество из одного элемента вполне можно трактовать как просто одно отдельное значение. и что транслятору хватит мозгов догадаться до такой трактовки. но это неверный подход. провоцирует дурной стиль написания кода. имо.


Palladin   (2006-09-22 09:53:00) [10]

кстати баг даже и полезный... на уровне запросов можно контролировать данные на предмет неоднозначности, бо, естественно, при возврате более чем одного значения запрос не прокатит...


Palladin   (2006-09-22 09:48:00) [11]

:) MSSQL поддерживает... баг T-SQLя...

там можно и так сделать
set @tmp=(Select max(id) from table1)


Ketmar   (2006-09-22 09:36:00) [12]

>[7] Johnmen(c) 22-Sep-XLI A.S., 09:32
>Запрос с max(id) верный, но у тебя старая версия
>MySQL, где ещё не поддерживаются вложенные
>запросы.
чисто логически -- ни разу не верный. ну не может элемент сравниваться с множеством. или я вообще в жизни ничего больше не понимаю. то, что какой-то сервер такое поддерживает -- это не фича. это баг. %-)


Johnmen   (2006-09-22 09:32:00) [13]


> vegarulez ©   (22.09.06 07:00) [4]
> так max(id) это же единичное значение... а не набор значений.
> ..или я неправ....сечас попробую так сделать...


Запрос с max(id) верный, но у тебя старая версия MySQL, где ещё не поддерживаются вложенные запросы.


> vegarulez ©   (22.09.06 07:58) [6]


[1] пункт 2


vegarulez   (2006-09-22 07:58:00) [14]

понил...
Ещё тогда попутно вопрос...
Делал дома в Delphi 6 пришёл на работу тут стоит 7-ой так вот открываю проект он говорит типа TSQLClientDataSet нот фаунд....
И действительно я его тоже не наблюдаю на вкладке дбэкспреса...

А у меня взамодействие БД с табличкой через него строилось

SQLConnection1 -> SQLTable1 -> SQLClientDataSet-> DataSource -> DBGrid

Как теперь быть?


Ketmar   (2006-09-22 07:34:00) [15]

>[4] vegarulez(c) 22-Sep-XLI A.S., 07:00
>так max(id) это же единичное значение... а не
>набор значений...
а хоть и не одного. select возвращает множество. в котором может и не быть элементов. но это -- множество. тебе же не придёт в голову написать на дельфи if <элемент> = <множество>? вот и тут так же.


vegarulez   (2006-09-22 07:00:00) [16]

так max(id) это же единичное значение... а не набор значений...
или я неправ....
сечас попробую так сделать...


Ketmar   (2006-09-22 06:49:00) [17]

>[2] vegarulez(c) 22-Sep-XLI A.S., 06:23
>+', `datetime`="'+ C +'", `sec`="'+ D +'" where
>ID= (select max(ID) from test1)'
>и когда так пишу он ругается...
потому что с мануалами не дружим. "where id in (select...".


vegarulez   (2006-09-22 06:23:00) [18]

1.  это то я понимаю.... как вставить переменную в запрос.
Я спрашиваю про другое...
Мне надо вот что...

'update `test1` set `num`="'+ A +'",`sum`='+ B +', `datetime`="'+ C +'", `sec`="'+ D +'" where ID= (select max(ID) from test1)'

и когда так пишу он ругается...

поэтому сначала хочу результат select max(ID) from test1 поместить в переменную xid, а потом уже подставить в запрос так как ты и написал.

И вот я не знаю как вернуть результат селекта в переменную.


Johnmen   (2006-09-21 23:22:00) [19]

1. +'" where ID='+IntToStr(xid));
2. SQLQuery-DataSetProvider-ClientDataSet или SQLDataSet
Все подробности в F1


Наверх

Титульная страница Поиск, карта сайта Написать письмо