|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
ClientDataSet и 'Key violation'
Ситуация:
Я выбираю данные из таблицы, с двумя полями ID (ключевое Integer) и Name (Char(15)), используя компонент TClientDataSet. Код:
cdsSelect: TClientDataSet; ... with cdsSelect do begin if Active then cdsSelect.Close; CommandText := 'Select ID, Name from TestTable'; Open; end; Данные помещаю в локальный набор данных на форме: Код:
cdsLocal.Data := cdsSelect.Data; В определенный момент я вставляю новую запись: Код:
with cdsLocal do begin Insert; FieldByName('ID').AsInteger := 1; Post; end; На Post возникает ошибка EDBClient 'Key violation'. Хочу обратить внимание, что я работаю именно с локальным набором, не имеющим связи с БД (портфель). Я пытался менять совойства: Код:
FieldDefs[0].Attributes := []; FieldDefs[0].Required; Fields[0].Required := False; Fields[0].ProviderFlags := []; Кто знает, в чем может быть проблема? |
#2
|
||||
|
||||
Цитата:
--------------------------------------------- Программирование - не профессия, а стиль жизни |
#3
|
|||
|
|||
Конечно есть. Собственно из-за этого он и ругается.
Но у меня задача клонировать в наборе запись вместе с ее ключом. Сохранять в базу я это дело не буду. "Быстрым" решением стало, заменить присвоение Data := Date на тупую пробежку по всему набору источнику и вставку записей в приемник Insert, Post. Структура приемника идентична, но формируется ручками: Код:
for i := 0 to Source.FieldDefs.Count - 1 do Dest.FieldDefs.Add(Source.FieldDefs[i].Name, Source.FieldDefs[i].DataType, Source.FieldDefs[i].Size); Dest.CreateDataSet; with Source do begin Source.First; while not Eof do begin Dest.Insert; for i := 0 to Fields.Count - 1 do Dest.Fields[i].Value := Fields[i].Value; Dest.Post; Source.Next; end; end; Работает это процентов на 80 медленнее, а быстрым называется только потому, что воткнуто быстро. =) Как красиво выйти из сложившейся ситуации, я и ломаю голову. Хочется быстро поместить данные в локальный набор и иметь возможность организовать контроль вводимой пользователем информации, когда с сервера, когда на клиенте. Короче самому рулить набором как вздумается. Есть мнения? |
#4
|
||||
|
||||
Цитата:
--------------------------------------------- Программирование - не профессия, а стиль жизни |
#5
|
|||
|
|||
Решил проблему следующим образом:
Создал локальный набор данных с заранее определенными полями. Настроил как мне надо. Данные присваиваю так: Код:
if cdsDest.Active then cdsDest.EmptyDataSet; cdsDest.Open; cdsDest.AppendData(cdsSource.Data, True); Копируются только данные, а свойства полей остаются нетронутыми. |
#6
|
||||
|
||||
Цитата:
--------------------------------------------- Программирование - не профессия, а стиль жизни |