Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO - редактируемый recordset + сортировка / 10 сообщений из 10, страница 1 из 1
01.10.2003, 10:06
    #32280260
LVU
LVU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
Пытаюсь перевести свой проект с БД под MSSQL с ZeosLib на ADO (достали ограничения DB LIb'а). Есть TADOQuery, в котором делается SELECT с объединениями и ORDER BY. Хочется, чтобы, во-первых, recordset был редактируемым, и, во-вторых, при вставке новая запись оказывалась не в конце, а там, где она должна быть в соответствии с ORDER BY.

Первое достигается прописыванием свойств Update Criteria, Update Resync и Unique Table. Для второго, судя по всему, надо прописывать Immobile Rows=false.

Проблема в том, что при использовании клиентского курсора попытка изменить Immobile Rows приводит к ошиьке типа "невозможно изменить read-only свойство". При серверном же курсоре у датасета в принципе отсутствуют свойства Update Criteria и т. д. Это, в принципе, логично, поскольку их использует, насколько я понял, Local Cursor Engine.

Но задачу-то решить хочется! Что делать?
...
Рейтинг: 0 / 0
01.10.2003, 11:11
    #32280377
harrytv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
Работаю с базой через sp.
Для редактироавния полученного ADODataSeta при его содании прописываю:

with ADODataSet do begin
Close;
Connection := MyBase.FADOConnection;
CommandType := cmdStoredProc;
LockType := ltBatchOptimistic;
Filtered := False;
Filter := '';
Parameters.Clear;
Prepared := False;
end;

В sp на сервере результат select'a перегоняю в tmp таблицу и ее уже выдаю клиенту. Update и Del - отдельные sp.
...
Рейтинг: 0 / 0
01.10.2003, 12:56
    #32280595
LVU
LVU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
Так неинтересно. Хочется ведь попользоваться плюшками от ADO - типа, например, того, что при изменении записи ее можно одну прорефрешить, а не выполнять целиком весь SELECT.
...
Рейтинг: 0 / 0
01.10.2003, 20:46
    #32281270
harrytv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
А рефрешить как раз и не надо.
Ты напрямую редактируешь DataSet на клиенте, после этого апдейтишь базу,
если что не так - откат.
...
Рейтинг: 0 / 0
01.10.2003, 20:54
    #32281274
harrytv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
Вроде этого:
with TADOCommand.Create(nil) do
try
Connection := MyBase.FADOConnection;
CommandType := cmdStoredProc;
CommandText := 'update_fuel';
if DataSet.State = dsInsert then DataSet.FieldByName('fuel_id').AsInteger := -1;
Parameters.CreateParameter('@result', ftInteger, pdReturnValue, 32, 0);
Parameters.CreateParameter('@id', ftInteger, pdInput, 32, DataSet.FieldByName('fuel_id').AsInteger);
Parameters.CreateParameter('@fuel_name', ftString, pdInput, 32, DataSet.FieldByName('fuel_name').AsString);
Parameters.CreateParameter('@benzine', ftBoolean, pdInput, 32, DataSet.FieldByName('benzine').AsBoolean);
Parameters.CreateParameter('@diesel', ftBoolean, pdInput, 32, DataSet.FieldByName('diesel').AsBoolean);
Parameters.CreateParameter('@gas', ftBoolean, pdInput, 1, DataSet.FieldByName('gas').AsBoolean);
Execute;
if Parameters.ParamByName('@result').Value < 0 then Abort;
DataSet.FieldByName('fuel_id').AsInteger:=Parameters.ParamByName('@result').Value;
Free;
except on e:Exception do begin
ShowErr(e.Message, CommandText);
Free;
Abort;
end;
...
Рейтинг: 0 / 0
06.10.2003, 17:58
    #32285511
LVU
LVU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
Да, подзадержался я...
2 harrytv:
Нет, это мне как раз не подходит. Дело в том, что значения некоторых полей в запросе определяются на сервере (это может быть результат работы триггера или просто что-то, подтягиваемое из справочника JOIN'ом). И дублировать все это дело на клиентской стороне абсолютно не хочется, а пользователю надо значения этих полей видеть.
...
Рейтинг: 0 / 0
06.10.2003, 18:40
    #32285548
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
harrytv писал:В sp на сервере результат select'a перегоняю в tmp таблицу и ее уже выдаю клиенту.

А это еще зачем? Без временных таблиц никак? :)
...
Рейтинг: 0 / 0
14.10.2003, 18:21
    #32293193
harrytv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
2tygra

Давненько я сюда не заглядывал ;-)
Однако, решение этой проблемы где-то год назад меня очень интересовало.Ничего лучше не придумал, вроде пока работает. Если есть другие идеи интересно узнать.
Дело в том,что если редактировать DataSet, поднятый select'om ,при изменении полей типа primary key и т.п. генерится exeption. А при чтении #table можно
писать в DataSet что угодно (в рамках разумного)
...
Рейтинг: 0 / 0
15.10.2003, 12:52
    #32293956
LVU
LVU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
А мне и не надо ключевые поля редактировать - на то они и ключевые. Они тама почти все identity/
...
Рейтинг: 0 / 0
15.10.2003, 15:39
    #32294277
harrytv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - редактируемый recordset + сортировка
Вот именно. Т.к. ты не делаешь рефреш, а САМ пишешь данные в DataSet, в том
числе и id (после успешного выполнения sp на сервере). База изменяется сохр. процедурой, возвращающей новый id. Подобным образом можно изменять и результат селекта на несколько таблиц.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO - редактируемый recordset + сортировка / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]