|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Не выполняется UPDATE
Пишу запрос такого типа:
Код:
ClientDataSet.CommandText:='UPDATE [Таблица 1] SET [Количество]='+ '(SELECT SUM([Количество]) FROM [Таблица 2] WHERE [Идентификатор]=:Id),'+ '[Сумма]=(SELECT SUM([Сумма]) FROM [Таблица 2] WHERE [Идентификатор]=:Id) '+ 'WHERE [Идентификатор]=:Id'; ClientDataSet.Params.ParamByName('Id').AsString:= ClientDataSet.FieldByName('Идентификатор').AsString; ClientDataSet.Execute; Какой запрос ему нужен? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#2
|
||||
|
||||
Google в помощь |
#3
|
||||
|
||||
Цитата:
При описанных здесь проблемах, как я понял, UPDATE не выполняется вообще. У меня же, простые запросы типа "UPDATE Таблица SET [Поле]=Значение WHERE [№]=3" выполняются без проблем. Проблема появилась именно тогда, когда я попытался применить вложенные запросы. Сейчас я написал так: Код:
ClientDataSet.CommandText:='UPDATE [Таблица1] SET [Количество]='+ '(SELECT SUM([Количество]) FROM [Таблица2] WHERE [Идентификатор]=:Id),'+ '[Сумма]=(SELECT SUM([Сумма]) FROM [Таблица2] WHERE [Идентификатор]=:Id) '+ 'WHERE [Идентификатор]=:Id'; ClientDataSet.Params.Clear; ClientDataSet.Params.Add; ClientDataSet.Params[0].DataType:=ftWideString; ClientDataSet.Params[0].Name:='Id'; ClientDataSet.Params[0].ParamType:=ptInputOutput; ClientDataSet.Params[0].Size:=50; ClientDataSet.Params.ParamByName('Id').AsString:= ClientDataSet.FieldByName('Идентификатор').AsString; ClientDataSet.Execute; Теперь он мне другую ошибку выдаёт: "Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена." Если я правильно понимаю, структура запроса его больше не волнует. Что же теперь не так? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#4
|
||||
|
||||
Ну это уже поконкретнее.
Как раз надо сейчас смотреть на запрос. Это означает, что данные из какого-то поля получены с ошибкой. Идентификатор какого типа поле? Google в помощь |
#5
|
||||
|
||||
Идентификатор - поле строкового типа.
Генерируется процедурой из случайного набора символов и времени создания записи с точностью до миллисекунды, например: VЧFУMAhQbINкxInа16052012235953271. Я проверял, в обеих таблицах значение идентификатора верное. Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому Последний раз редактировалось Klassenas, 17.05.2012 в 21:01. |
#6
|
||||
|
||||
Может проблема в том, что надо явно задать имя для подзапроса?
Код:
ClientDataSet.CommandText:='UPDATE [Таблица1] SET [Количество]='+ '(SELECT SUM([Количество]) FROM [Таблица2] WHERE [Идентификатор]=:Id) as Tmp1,'+ '[Сумма]=(SELECT SUM([Сумма]) FROM [Таблица2] WHERE [Идентификатор]=:Id) as Tmp2'+ 'WHERE [Идентификатор]=:Id'; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
Цитата:
Google в помощь |
#8
|
||||
|
||||
Ни первый, ни второй способ, ни оба вместе не помогли.
А как можно проверить те самые значения всех состояний, о которых говорится в сообщении об ошибке? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#9
|
||||
|
||||
Ну раз ничего не помогает, будем экспериментировать:
Код:
ClientDataSet.CommandText:='UPDATE [Таблица1] SET [Количество]= 3 WHERE [Идентификатор]=:Id'; P.S. И стоит попробовать получить результат запроса: Код:
SELECT SUM([Количество]), SUM([Сумма]) FROM [Таблица 2] WHERE [Идентификатор]=:Id Google в помощь Последний раз редактировалось Ildar-tsr, 18.05.2012 в 07:05. |
#10
|
||||
|
||||
Интересно девки пляшут!
Если пишу так: Код:
ClientDataSet.CommandText:='UPDATE [Таблица1] SET [Количество]= 3 WHERE [Идентификатор]=:Id'; То выскакивает сообщение об ошибке. А если так: Код:
ClientDataSet.CommandText:='UPDATE [Таблица1] SET [Количество]= 3 WHERE [Идентификатор]=''VЧFУMAhQbINкxInа16052012235953271'''; То всё работает. По ходу какой-то косяк с использованием параметров. Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#11
|
||||
|
||||
Код:
ClientDataSet.Params.ParamByName('Id').DataType:= ftString; ClientDataSet.Params.ParamByName('Id').Value:= ClientDataSet.FieldByName('Идентификатор').AsString; Google в помощь |
#12
|
||||
|
||||
Код:
.Params.ParamByName('').AsString Код:
DataType := ftString; Self.Value := Value; Пишу программы за еду. __________________ |
#13
|
||||
|
||||
Цитата:
Что имелось в виду? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#14
|
||||
|
||||
Может, проблема на сервере, в компоненте DataSetProvider или ADODataSet?
Есть у этих компонентов опции, которые могут нарушить процесс выполнения запроса с параметром? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#15
|
||||
|
||||
А проблема-то действительно на сервере!
Я на серваке в компоненте ADODataSet создал параметр, идентичный тому, что в клиентском запросе, так он теперь сразу при подключении эту ошибку выдаёт! Хотя при подключении используется запрос без параметров. По ходу, его смущает само наличие параметра. Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |