Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

вопрос о ClientDataSet и добавлении записи   Найти похожие ветки 

 
d00x ©   (2004-10-15 12:00) [0]

Здравствуйте!
У меня на клиентском приложении ClientDataSet подключается к серверу (через DCOMConnection). На сервере ADOConnection , база Access 2000.
На клиенте установлен DBGrid и поля ClientDataSet отображены в нем. в базе ключевое поле Id (автоинкремент).

есть такая процедура:
procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
begin
ClientDataSet1.ApplyUpdates(0);
end;

но при добавлении записи поле id не содержит значения (хотя оно должно автоматически увеличиваться)!!
больше в коде ничего нет.
в базе кроме поля id есть только текстовые поля.
первичный индекс - Id.
не понятно, почему поле не содержит значения??
а когда добавляешь вторую запись - пишет ошибка Key Violation
(т.е. одинаковый индекс)
в чем дело, и как обновить информацию на сервере?
кстати, при если выполнить следующее:
ClientDataSet1.Active:=false;
ClientDataSet1.Active:=true;

(например, при выходе из программы и повторном запуске)
вроде все нормально.
Но меня не устраивает закрывать и открывать базу.
Есть ли иной путь?


 
Nikolay M. ©   (2004-10-15 12:10) [1]


> в базе ключевое поле Id (автоинкремент).

В базе нет полей, в том числе и ключевых.


> при добавлении записи поле id не содержит значения

Рекомендую подумать над тем, откуда бы ему там взяться


> (хотя оно должно автоматически увеличиваться)

и заглянуть в таблицу и посмотреть на только что добавленную запись.


 
d00x ©   (2004-10-15 12:14) [2]


> и заглянуть в таблицу и посмотреть на только что добавленную
> запись


да.. простите я имел ввиду таблицу базы данных.


> Рекомендую подумать над тем, откуда бы ему там взяться


за это видимо отвечает драйвер базы данных.

Правда вот только почему оно там не появляется?? :(


 
Nikolay M. ©   (2004-10-15 12:17) [3]


> > Рекомендую подумать над тем, откуда бы ему там взяться
> за это видимо отвечает драйвер базы данных.

RTFM, однако.


 
d00x ©   (2004-10-15 12:18) [4]


> и заглянуть в таблицу и посмотреть на только что добавленную
> запись.

в таблице на сервере оно появляется... на клиенте тоже, но поле id все равно пустое...


 
Polevi ©   (2004-10-15 12:18) [5]

BeforeUpdateRecord обрабатывать у провайдера


 
sniknik ©   (2004-10-15 12:18) [6]

попробуй поиграть свойством AutoGenerateValue автоинкриментного поля,  в частности arAutoInc поставить (хотя нет, там вроде поле само получает тип TAutoIncField) неважно, попробуй.
чтото там было такое, не помню но не сложное иначе бы запомнил, параметр по которому автоинкремент перезапрашивается с сервера по добавлении записи.

и уверен что в AfterPost обновление делать правильно?
если так
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(-1);
вместо твоего, что нибудь меняется?


 
d00x ©   (2004-10-15 12:20) [7]


> sniknik ©   (15.10.04 12:18) [6]


да. именно так я все и делал. насчет AutoInc - попробовал в первую очередь.
не работает..


 
d00x ©   (2004-10-15 12:28) [8]


> Polevi ©   (15.10.04 12:18) [5]
> BeforeUpdateRecord обрабатывать у провайдера


procedure TWPAdbServer.MyProviderBeforeUpdateRecord(Sender: TObject;
 SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
 UpdateKind: TUpdateKind; var Applied: Boolean);
begin
 ShowMessage(SourceDS.FieldByName("id").AsString);
end;


на клиенте при добавлении первой записи выдает 0
при добавлении второй записи выдает Key Violation.
Что то не понятно...


 
d00x ©   (2004-10-15 12:31) [9]


> sniknik ©   (15.10.04 12:18) [6]
> попробуй поиграть свойством AutoGenerateValue автоинкриментного
> поля,  в частности arAutoInc поставить (хотя нет, там вроде
> поле само получает тип TAutoIncField) неважно, попробуй.
>
> чтото там было такое, не помню но не сложное иначе бы запомнил,
> параметр по которому автоинкремент перезапрашивается с сервера
> по добавлении записи.


ProviderFlags:=[pfInUpdate,pfInWhere,pfInKey]

это?


 
Polevi ©   (2004-10-15 12:42) [10]

poPropogateChanges у провайдера
pfInwhere, pfInKey у Id поля

BeforeUpdateRecord(..)
 if UpdateKind=ukInsert then
 begin
анализируем дельту, формируем insert запрос для полей имеющих значения
   qry:=TADOQuery.Create(nil);
   qry.Connection:=DB;
   qry.SQL.Add(InsertQry);
   qry.SQL.Add("SELECT @@IDENTITY")
   qry.Open;
   DeltaDS.FieldByName("ID").ReadOnly:=false;
   DeltaDS.FieldByName("ID").NewValue:=qry.Fields[0].Value;
   Applied:=true;
 end


 
d00x ©   (2004-10-15 13:05) [11]

спасибо!!
получилось интересно =)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.048 c
1-1098961192
SNV-Soft
2004-10-28 14:59
2004.11.14
Размытые края TLabel при печати формы...


3-1097347134
kirilllius
2004-10-09 22:38
2004.11.14
SQL и Requery


8-1086176663
Petrush
2004-06-02 15:44
2004.11.14
Непростой плеер для винды.


1-1098885298
Melamed
2004-10-27 17:54
2004.11.14
Длина исполняемого файла в различных ОС разная


6-1094455430
ancara
2004-09-06 11:23
2004.11.14
API Доступ к расшаренным ресурсам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский