Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Запись результата 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.045 c
2-1158769175
vegarulez
2006-09-20 20:19
2006.10.08
Не появляется контекстная справка-выбиралка, после точки...


2-1158484364
dreamse
2006-09-17 13:12
2006.10.08
Ошибка в переборе компонентов


2-1159094363
Серый
2006-09-24 14:39
2006.10.08
Вещественные переменные


1-1156630433
Konstantin555
2006-08-27 02:13
2006.10.08
Как получить заголовок, автора письма БЕЗ ЗАГРУЗКИ ПИСЬМА?


2-1153135361
xman
2006-07-17 15:22
2006.10.08
File not found: Proxies.dcu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский