![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Пишу запрос такого типа:
Код:
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
|
||||
|
||||
|
|
|
#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
|
||||
|
||||
|
Ну это уже поконкретнее.
Как раз надо сейчас смотреть на запрос. Это означает, что данные из какого-то поля получены с ошибкой. Идентификатор какого типа поле? |
|
#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
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Ни первый, ни второй способ, ни оба вместе не помогли.
А как можно проверить те самые значения всех состояний, о которых говорится в сообщении об ошибке? |
|
#9
|
||||
|
||||
|
Ну раз ничего не помогает, будем экспериментировать:
Код:
ClientDataSet.CommandText:='UPDATE [Таблица1] SET [Количество]= 3 WHERE [Идентификатор]=:Id'; P.S. И стоит попробовать получить результат запроса: Код:
SELECT SUM([Количество]), SUM([Сумма]) FROM [Таблица 2] WHERE [Идентификатор]=:Id Последний раз редактировалось 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; |
|
#12
|
||||
|
||||
|
Код:
.Params.ParamByName('').AsStringКод:
DataType := ftString; Self.Value := Value; |
|
#13
|
||||
|
||||
|
Цитата:
Что имелось в виду? |
|
#14
|
||||
|
||||
|
Может, проблема на сервере, в компоненте DataSetProvider или ADODataSet?
Есть у этих компонентов опции, которые могут нарушить процесс выполнения запроса с параметром? |
|
#15
|
||||
|
||||
|
А проблема-то действительно на сервере!
Я на серваке в компоненте ADODataSet создал параметр, идентичный тому, что в клиентском запросе, так он теперь сразу при подключении эту ошибку выдаёт! Хотя при подключении используется запрос без параметров. По ходу, его смущает само наличие параметра. |