如何在tclientdataset中插入空白数据


这是一个简单的数据库。
CREATE TABLE A(FIELD1 INT PRIMARY KEY, FIELD2 VARCHAR(10));  
INSERT INTO A (FIELD1, FIELD2) VALUES (1, 'A');

tbl1已打开,它包含表A中的数据。我想在Tclientdataset中插入空白数据、6条带空白数据的记录、空数据,以进行标记。在这个例子中,我得到了一个"密钥冲突"的错误。

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

我认为你的问题一定是由你的项目细节引起的,而你没有在你的q中提到,因为我无法在最小的测试项目中重现你的问题。

1我在MS Sql Server 2014上创建了一个测试表ClientCodes,其定义为

CREATE TABLE [dbo].[clientcodes](
[ClientCode] [int] NOT NULL,
[Name] [varchar](40) NULL,
PRIMARY KEY CLUSTERED
(
[ClientCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

然后我插入了3个测试行

1  One
2  Two
3  Three

2然后我创建了一个新的Delphi项目,包含一个到Sql Server的AdoConnection,一个执行"从ClientCodes中选择*"的AdoQuery,一个连接到AdoQuery的DataSetProvider和连接到它的unqryCliPrint CDS,以及第二个名为cdsAntiquetas的CDS。

注意:除了如上所述连接组件所需的那些。

项目中唯一的代码是:

procedure TForm1.Button1Click(Sender: TObject);
begin
unqryCliPrint.Open;
cdsEtiquetas.Data := unqryCliPrint.Data;
cdsEtiquetas.InsertRecord([0, 'zero']);
cdsEtiquetas.InsertRecord([0, 'zero']);
cdsEtiquetas.InsertRecord([0, 'zero']);
end;

如您所见,这将插入同一行的3个副本。代码执行正确,没有引发任何类型的异常或错误。

我建议您使用服务器创建一个类似的项目。如果你得到同样的结果,您需要尝试识别实际项目中导致错误的原因。

顺便说一句,你的代码中似乎有一个错误:

cdsEtiquetas.DisableControls;
cdsEtiquetas.DisableConstraints;

我看不出你在哪里撤消这些步骤。

更新从您添加的DFM中,我看到您的cdsEtiquetas与其他内容连接,即与dtstprvEtique塔斯连接,尽管您在评论中说过。这个DSP连接回unqryCliPrint!所以我想这就是你的错误的来源。如果cdsTiquetas不需要DSP,并且您还没有显示它需要DSP的任何原因,只需清除其ProviderName属性即可。

当我在Firebird中创建一个表时,我会自动为索引设置一个"not null"-这是该表的DDL:

CREATE TABLE A (
FIELD1  INTEGER NOT NULL,
FIELD2  VARCHAR(10)
);
ALTER TABLE A ADD PRIMARY KEY (FIELD1);

所以索引值不能为null,而且必须是UNIQUE!

有一个来自网络的信息:

"主键是表中唯一标识数据库表中的每一行/记录。主键必须包含唯一值。主键列不能有NULL值。一张桌子只能有一个主键,主键可以由单个或多个组成字段"。

最新更新