![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись результата 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