Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.049 c
3-1155100048
ANB
2006-08-09 09:07
2006.10.08
Как достучаться к БД FB, если файл на сетевой диске ?


3-1155033655
DelphiLexx
2006-08-08 14:40
2006.10.08
Как в DBGrid e подсвечивать конец линии сетки определенной записи


9-1136079048
Тем
2006-01-01 04:30
2006.10.08
Как сделать выделение треугольников с учётом видимости?


2-1158667789
KyRo
2006-09-19 16:09
2006.10.08
Залипание клавиш


2-1158736243
Petrovitch
2006-09-20 11:10
2006.10.08
Проблема с установкой компаненты SPELLER