表结构如下
create table DocType   
(
  DocT_ID          INT  Not null identity(10001,1) primary key,
  DocT_Pro Nchar(12)  Not null
)
使用DBedit 承接DocT_Pro,
按键BT1代码:
procedure Tdocinfform.BitBtn1Click(Sender: TObject);
begin
cdm.CDataM.docinfDataSet.FieldByName('DocT_ID').Required:=FALSE;
cdm.CDataM.docinfDataSet.Insert;
cdm.CDataM.docinfDataSet.Post;
end;提示错误:key violation如何解决?我是使用三层结构,clientdataset连接应用服务器

解决方案 »

  1.   

    1:在中间层将创建永久性字段,然后在永久性字段列表中将DocT_ID设为Key及不更新 即可
      

  2.   

    1:如果你的中间层中使用ADOQuery获取数数(只要是TDataSet都一样) 双击TAdoQuery --> 右键 --> Add All Fields --> 选取"DocT_ID" 将其属性中的ProviderFlags中的pfInUpdate设为False,ReadOnly设为True  其它的字段将pfInWhere置为False
    2:将指向TAdoQuery的TDataSetProvider控件中的BeforeUpdateRecord事件中写入代码:
     if updatekind=ukinsert then
        DeltaDS.FieldByName('DocT_ID').ProviderFlags:=DeltaDS.FieldByName('Add_ID').ProviderFlags-[pfinkey]
     else
       DeltaDS.FieldByName('DocT_ID').ProviderFlags:=DeltaDS.FieldByName('Add_ID').ProviderFlags+[pfinkey]
    3:在客户端不要对DocT_ID作任何赋值或修改类的操作procedure Tdocinfform.BitBtn1Click(Sender: TObject);
    begin
      cdm.CDataM.docinfDataSet.Insert;
      cdm.CDataM.docinfDataSet.FieldByName('DocT_ProN').AsString := "Value";
      cdm.CDataM.docinfDataSet.Post;   //另外也不是用Post提交,一般用ApplyUpdate提交
    end;