Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизЗапись результата select`a в переменную... Найти похожие ветки
← →
vegarulez © (2006-09-21 22:56) [0]Добрейшего всем времени суток! У меня такой вопрос: надо апдейтить запись в табличке по какому-то значению... то бишь 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-21 23:22) [1]1. +"" where ID="+IntToStr(xid));
2. SQLQuery-DataSetProvider-ClientDataSet или SQLDataSet
Все подробности в F1
← →
vegarulez © (2006-09-22 06:23) [2]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, а потом уже подставить в запрос так как ты и написал.
И вот я не знаю как вернуть результат селекта в переменную.
← →
Ketmar © (2006-09-22 06:49) [3]>[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 07:00) [4]так max(id) это же единичное значение... а не набор значений...
или я неправ....
сечас попробую так сделать...
← →
Ketmar © (2006-09-22 07:34) [5]>[4] vegarulez(c) 22-Sep-XLI A.S., 07:00
>так max(id) это же единичное значение... а не
>набор значений...
а хоть и не одного. select возвращает множество. в котором может и не быть элементов. но это -- множество. тебе же не придёт в голову написать на дельфиif <элемент> = <множество>
? вот и тут так же.
← →
vegarulez © (2006-09-22 07:58) [6]понил...
Ещё тогда попутно вопрос...
Делал дома в Delphi 6 пришёл на работу тут стоит 7-ой так вот открываю проект он говорит типа TSQLClientDataSet нот фаунд....
И действительно я его тоже не наблюдаю на вкладке дбэкспреса...
А у меня взамодействие БД с табличкой через него строилось
SQLConnection1 -> SQLTable1 -> SQLClientDataSet -> DataSource -> DBGrid
Как теперь быть?
← →
Johnmen © (2006-09-22 09:32) [7]
> vegarulez © (22.09.06 07:00) [4]
> так max(id) это же единичное значение... а не набор значений.
> ..или я неправ....сечас попробую так сделать...
Запрос с max(id) верный, но у тебя старая версия MySQL, где ещё не поддерживаются вложенные запросы.
> vegarulez © (22.09.06 07:58) [6]
[1] пункт 2
← →
Ketmar © (2006-09-22 09:36) [8]>[7] Johnmen(c) 22-Sep-XLI A.S., 09:32
>Запрос с max(id) верный, но у тебя старая версия
>MySQL, где ещё не поддерживаются вложенные
>запросы.
чисто логически -- ни разу не верный. ну не может элемент сравниваться с множеством. или я вообще в жизни ничего больше не понимаю. то, что какой-то сервер такое поддерживает -- это не фича. это баг. %-)
← →
Palladin © (2006-09-22 09:48) [9]:) MSSQL поддерживает... баг T-SQLя...
там можно и так сделать
set @tmp=(Select max(id) from table1)
← →
Palladin © (2006-09-22 09:53) [10]кстати баг даже и полезный... на уровне запросов можно контролировать данные на предмет неоднозначности, бо, естественно, при возврате более чем одного значения запрос не прокатит...
← →
Ketmar © (2006-09-22 09:56) [11]>[9] Palladin(c) 22-Sep-XLI A.S., 09:48
>:) MSSQL поддерживает... баг T-SQLя...
так много кто поддерживает. но от этого оно не становится логичным и объяснимым. %-)
>там можно и так сделать
>set @tmp=(Select max(id) from table1)
а вот хранить множества в переменных никакой религией не запрещено. %-)
зыж да, я понимаю, что множество из одного элемента вполне можно трактовать как просто одно отдельное значение. и что транслятору хватит мозгов догадаться до такой трактовки. но это неверный подход. провоцирует дурной стиль написания кода. имо.
← →
Ketmar © (2006-09-22 09:58) [12]>[10] Palladin(c) 22-Sep-XLI A.S., 09:53
>можно контролировать данные на предмет
>неоднозначности, бо, естественно, при возврате
>более чем одного значения запрос не прокатит...
давай начнём с того, что SQL вообще далеко не идеальный язык для подобных задач. а контролировать валидность при помощи хаков -- это вообще что-то с чем-то. имо. %-)
← →
Palladin © (2006-09-22 09:59) [13]
> а вот хранить множества в переменных никакой религией не
> запрещено. %-)
а вот и не угадал :)
declare @tmp int
← →
Palladin © (2006-09-22 10:00) [14]
> Ketmar © (22.09.06 09:58) [12]
так то оно так... но это здорово помогает локализировать проблемму... имо :)
← →
Ketmar © (2006-09-22 10:03) [15]>[13] Palladin(c) 22-Sep-XLI A.S., 09:59
>а вот и не угадал :)
>declare @tmp int
да я так и понял. вот это как раз нелогично и неверно.
>[14] Palladin(c) 22-Sep-XLI A.S., 10:00
>так то оно так... но это здорово помогает
>локализировать проблемму... имо :)
ну да. если инструмент изначально кривой, то и "лечится" такими же кривыми хаками (это я об SQL).
← →
Ketmar © (2006-09-22 10:04) [16]вообще, очень страшный ночной кошмар -- это выборка данных из XML при помощи SQL. даже звучит матерно...
← →
Johnmen © (2006-09-22 10:22) [17]
> Ketmar © (22.09.06 09:36) [8]
>чисто логически -- ни разу не верный.
> ну не может элемент сравниваться с множеством. или я вообще
> в жизни ничего больше не понимаю. то, что какой-то сервер
> такое поддерживает -- это не фича. это баг. %-)
max(...) не есть множество, а есть единственное значение в контексте [2]
← →
Ketmar © (2006-09-22 10:29) [18]>[17] Johnmen(c) 22-Sep-XLI A.S., 10:22
>max(...) не есть множество, а есть единственное
>значение в контексте [2]
а меня вообще умиляет способность select"а возвращать что угодно. например, вычислять математику в том же MS SQL. логика разработчиков, видимо, была зверски изнасилована и расчленена.
← →
Johnmen © (2006-09-22 10:55) [19]
> Ketmar © (22.09.06 10:29) [18]
Не знаю, как там "вычислять математику в том же MS SQL", но разработчики стандарта SQL, сначала 89 потом 92 потом 99, наверное, были не дураки...:)
И чётко описали что есть SELECT, как он работает, и что есть агрегатные ф-ии.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.043 c