Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2009, 13:42   #1
QQmb
 
Регистрация: 03.05.2009
Сообщений: 4
По умолчанию UPDATE с параметрами

Всем доброго времени суток.
Пишу программу в Delphi работающую с InterBase.
Требуется содать запрос, который менял бы значение поля. При этом хочется что бы имя поля можно было менять в программе. Для этого всего использую 3 параметра:

UPDATE TOVAR SET (:Par3)=:Par2 WHERE TOVARID=:Par1

Par2 и Par1 вопросов не вызывают, но когда я заменил значение конкретного поля на Par3 программа начала выдавать ошибку:

SQL error code=-104
Token unknown - line 1, char 17

Что не так с par3? Или в запросе нельзя заменять имя конкретного поля на параметр?
Заранее спасибо за ответы.
QQmb вне форума Ответить с цитированием
Старый 03.05.2009, 15:47   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

уже тут было что-то подобное.
Пробуйте генерить запрос "на лету":
Код:
MyQuery.SQL.Clear;
MyQuery.SQL.Add(' UPDATE TOVAR SET '+MyFieldName+
  ' = :Par2 WHERE TORARID = :Par1');
в строковой переменной MyFieldName нужное в данный момент имя поля.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2009, 16:27   #3
QQmb
 
Регистрация: 03.05.2009
Сообщений: 4
По умолчанию

Спасибо за совет, а то меня переклинило, думал придется отдельно для каждого запроса отдельный компонент создавать. Уже все переделал, все работает.
Но всё же вопрос из за интереса: можно ли сделать как я делал с Par3. Я думаю там скорее всего ошибка в записи запроса(в SQL я пока хромаю на обе ноги). Ведь таким образом можно только передавать каждый раз новое значение параметра, а не переписывать запрос, что удобнее.

Последний раз редактировалось QQmb; 03.05.2009 в 22:10.
QQmb вне форума Ответить с цитированием
Старый 03.05.2009, 20:51   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ясное дело, для сервака это какой-то косяк
ему приходит вот такой код после подстановки
Код:
UPDATE TOVAR 
SET 'my_field_name' = 1024
WHERE TOVARID = 17
и что ему прикажешь делать?
soleil@mmc вне форума Ответить с цитированием
Старый 03.05.2009, 22:09   #5
QQmb
 
Регистрация: 03.05.2009
Сообщений: 4
По умолчанию

ммм, не согласен, что ему такое приходит. Par3 (он же 'my_field_name') я назначаю в программе, так же как и Par2, Par1. То, что в эту переменную записывается необходимое имя поля(например, field1), я проверял. То есть когда запрос обрабатывается он выглядит так(учитывая параметры):

UPDATE TOVAR
SET field1 = 1024
WHERE TOVARID = 17

А это вполне выполнимая команда. Или я ошибаюсь в своих рассуждениях?
QQmb вне форума Ответить с цитированием
Старый 03.05.2009, 22:51   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от QQmb Посмотреть сообщение
Код:
UPDATE TOVAR SET (:Par3)=:Par2 WHERE TOVARID=:Par1
SQL error code=-104
Token unknown - line 1, char 17
во-первых, не нужно быть гением чтобы посчитать на какую позицию в строке идет ругань - по моему предположению это будет символ одиночной кавычки
во-вторых, я не спорю - ты честно подставляешь свое field1, но так уж работает эта подстановка, что строковый параметр будет обрамлен кавычками (это же не макрос!)
ну а чтобы попытаться меня опровергнуть попробуй свой старый вариант подстановки параметров и отлови, например, SQLMonitor-ом свой запрос (точнее, попытку его спрепейрить) или просто выведи текст получившегося запроса перед его выполнением таким образом
Код:
qUpdate.SQL.Add(...);
qUpdate.ParamByName('...').As...:=...;
...
ShowMessage(qUpdate.SQL.Text);
qUpdate.ExecSQL;
soleil@mmc вне форума Ответить с цитированием
Старый 05.05.2009, 21:01   #7
QQmb
 
Регистрация: 03.05.2009
Сообщений: 4
По умолчанию

soleil@mmc, спасибо за объяснение. сейчас окончательно понял где я ошибался и почему нельзя так делать.
QQmb вне форума Ответить с цитированием
Старый 06.05.2009, 09:12   #8
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

На самом деле, поработав в свое время с ADO понял одно - на кой кляп вообще эти параметры нужны? Почему не генерить строку динамически с переменными?
Код:
var par1,par2: char;
par1=blah;
par2=blah;
sql="update blah set"+par1+"="+par2";
Можно сделать свой класс, который будет генерировать запросы как вашей душе угодно... А родная реализация показалась мне ну оооочень уж корявой. Собственно, как и многое в dieapi
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 06.05.2009, 11:56   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
На самом деле, поработав в свое время с ADO понял одно - на кой кляп вообще эти параметры нужны? Почему не генерить строку динамически с переменными?
тхаха
интересно будет узнать какими глазами потом на вас будут смотреть юзвери и админы этих баз (речь есесно про SQL-базы типа мсскл, ибазе/фб, оракл)
а все потому что запрос будет анализироваться движком каждый раз и тем самым тормозить работу вцелом
параметры как раз позволяют избежать лишней работы сервака
soleil@mmc вне форума Ответить с цитированием
Старый 06.05.2009, 13:08   #10
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Цитата:
интересно будет узнать какими глазами потом на вас будут смотреть юзвери и админы этих баз
Примерно такими же глазами, которыми на вас будут смотреть те же админы, когда ваша софтина требует Windows на сервере. Скорость критична? О каком микрософте тогда вообще идет речь?
Зы. О каком вы анализе? Подставить переменные в строку уже есть анализ? Или ваш софт пашет напрямую с сервером, без прокси?
Впрочем - я не спорю, что возможно есть другие доводы против этого метода, но те что привели вы - крайне сомнительны (если, конечно "тхаха" за обоснование не считать.)
Добавлено:
ЗЫЗЫ. Вы про sql-движок. Прошу прощения, торможу - чет башка совсем не варит сегодня. Но насчет микрософт/скорость - все равно останусь при своем.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 06.05.2009 в 13:12.
crazy horse вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
insert и update Tanusha SQL, базы данных 4 13.03.2009 14:47
Update данных KiSH333 БД в Delphi 2 01.12.2008 13:28
c# and Access - update MAcK Общие вопросы .NET 3 20.10.2008 12:58
не работает UPDATE chekanoff БД в Delphi 1 27.02.2008 21:57
UPDATE и DELETE Дамир БД в Delphi 3 13.03.2007 01:44