【发布时间】:2020-02-25 08:43:22
【问题描述】:
这是一个简单的数据库。
CREATE TABLE A(FIELD1 INT PRIMARY KEY, FIELD2 VARCHAR(10));
INSERT INTO A (FIELD1, FIELD2) VALUES (1, 'A');
tbl1 已打开,它包含表 A 中的数据。我想插入空白数据,6 条带空白数据的记录,Tclientdataset 中的空数据用于制作标签。在此示例中,我收到“密钥违规”错误。
procedure TForm1.btn1Click(Sender: TObject);
var
i:Integer;
cdsEti:TClientDataSet;
dtstprvEti:TDataSetProvider;
iNroEspaciosBlanco: Integer;
begin
iNroEspaciosBlanco := 6;
dtstprvEti := TDataSetProvider.Create(nil);
cdsEti:= TClientDataSet.Create(nil);
dtstprvEti.DataSet := tbl1;
cdsEti.Data := dtstprvEti.Data;
dtstprvEti.Constraints := False;
cdsEti.ReadOnly := False;
for i := 0 to (cdsEti.Fieldcount-1) do
begin
cdsEti.fields[i].ReadOnly := false;
cdsEti.Fields[i].Required := false;
cdsEti.FieldDefs[i].Attributes := [];
end;
cdsEti.Active := True;
cdsEti.First;
for i := 1 to iNroEspaciosBlanco do
begin
cdsEti.Insert;
cdsEti.Post;
end;
FreeAndNil(cdsEti);
FreeAndNil(dtstprvEti);
end;
dfm 包含这个。只需一个按钮、一个连接和一个表格。
object Form1: TForm1
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object btn1: TButton
Caption = 'btn1'
TabOrder = 0
OnClick = btn1Click
end
object con1: TADOConnection
Connected = True
Provider = 'SQLOLEDB.1'
end
object tbl1: TADOTable
Connection = con1
TableName = 'A'
end
end
【问题讨论】:
-
cdsEtiquetas 上是否定义了任何索引,如果有,它们是什么? cdsEtiquet 是“独立”CDS 还是有任何连接,例如到 DataSetProvider 还是处于主从关系?
-
不,这个clientdataset的使用只针对这个porpouse。不是主细节或与任何表格的任何连接。我看过索引,有一个名为 DEFAULT_ORDER 的 CODIGO_ARTICULO 索引,它继承自数据集,但不是 ixprimary 或唯一的。在以前的测试中,我检查过使用这个 cdsEtiquetas.IndexDefs.Clear 但没有运行。
-
datasetprovider 中的约束设置为 false,
-
我认为你的主键不能为空。
-
你已经定义了一个主键,这意味着它不能为空。不需要为标签插入空白行。在您的演示文稿(用户界面或报告)中执行此操作,而不是在表格本身中。该表应仅包含符合其约束的实际数据。
标签: delphi tclientdataset