ClientDataSet的ApplyUpdate问题,头都大了,谁能帮帮我?(300分)

  • 主题发起人 主题发起人 徐凤华
  • 开始时间 开始时间

徐凤华

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Delphi6下写了如下程序,数据库使用Oracle8i,但在执行时却提示:
ORA-00001:违反唯一约束条件。程序如下:
ClientDataSet1.CommandText := 'Select * From Client';
ClientDataSet1.Open;
for Index := 1 to 50do
begin
ClientDataSet1.Append;
ClientDataSet1['ID'] := Index;
ClientDataSet1['CName'] := 'CName' + IntToStr(Index);
ClientDataSet1.Post;
if Index mod 10 = 0 then
ClientDataSet1.ApplyUpdates(0);
end;
end;
我到数据库中看了一下,Client表为空,所有不存在唯一值约束的问题,如
果将以上语句改为'Insert Into Client Values (1, 'CName');然后执行
ClientDataSet.Execute;则可以正常提交,真是令人痛苦?还请高手予以解答。
 
建议,把算法改成Insert into,按你的说法就能解决问题了。
 

ClientDataSet1.CommandText := 'Select * From Client';
ClientDataSet1.Open;
for Index := 1 to 50do
begin
ClientDataSet1.Append;
ClientDataSet1['ID'] := Index;
ClientDataSet1['CName'] := 'CName' + IntToStr(Index);

end;
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
 
看程序是没有问题的。看来是ADO与ORA联接不稳定的原因。
 
for Index := 1 to 50do
begin
ClientDataSet1.Append;
ClientDataSet1['ID'] := Index;
ClientDataSet1['CName'] := 'CName' + IntToStr(Index);
if Index mod 10 = 0 then
begin
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
end;
end;
 
多谢楼上大侠关注,但我尝试了yanghai0437和winbell的方法,程序仍然有同样的提示。
真不知道该如何解决?
 
你问的问题有几个地方需要确认:
1:Provider.ResolveToDataSet的值是什么?
2:你使用ADO还是BDE来连接数据库?
3:你的表是否就是ID和CName这两个字段?那一个是唯一的?
 
你对有默认值的字段付值了吧
 
To blue_morning:如果使用ADO连接Oracle,应用服务器为进程内组件(DLL)形态时,如果
把组件的事务类型设为“需要事务”,连接数据库会失败,产生“连接到事务或没有事务”
(在使用MS Provider的情况下)或者“新事务不能登记到指定的事务处理器中”(在使用
Oracle Provider的情况睛)。你是否遇到这样的情况,如何处理?
 
to blue_morning:
TDataSetProvider.ResolveToDataSet为True
使用ADO联接数据库,表中只有ID和CNAME两个字段,其中ID字段为PRIMARY KEY。
请大侠们指教。
 
Sachow: 我没有写过或遇到过你的情况。sorry。这个问题你去找找pipi的贴子他可能知道。
徐凤华:试试下面的方法:
1、在窗口在再放一个ClientDataset,DataSource, DBGrid把它们连起来,在
ClientDataSet1.ApplyUpdates(0);前写:ClientDataset.Data := Clientdataset1.Delta;
先从DBGrid确认delta中没有重复的数据。
2、将你的SQL语句放到中间层的Query上,删除 ClientDataSet1.CommandText := 'Select * From Client';
3、把ADO改为BDE的连接。如果没有问题就是ADO的原因了。
 
你在客户端做这些事,我都不想纠正你了,你这样做和C/S有什么驱别
当你 ClientDataSet1.ApplyUpdates(0);
在循环时是否会出错?
 
改为:ClientDataSet1.ApplyUpdates(-1);
试一下
 
很有可能是循环时出错。
不要把ClientDataSet1.ApplyUpdates(0);写在循环里,一个循环<=几毫秒,网落吃不消。
 
再次感谢大家,我自己又尝试了N次,这和循环没有任何关系。现将程序改为如下:
ClientDataSet1.CommandText := 'Select * From Client';
ClientDataSet1.Open;
ClientDataSet1.Append;
ClientDataSet1['ID'] := 1;
ClientDataSet1['CName'] := 'CName';
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
令人奇怪的是,程序没有报错,从数据库中看到Append成功,但是在SQL Explorer中
使用Select * From Client;从数据库中查询刚刚Append的记录,发现记录的
ID字段值为0!!!!!!!!!!!可我在程序中明明指定ID为1????????
重新执行以上语句,程序又出现同样的提示“ORA-00001:违反唯一约束条件。”
看来原因在于,我指定ID字段值没有任何效果???但怎样才能解决这个问题,还请
大家予以指教。多谢!
 
我想是不是数据表为空,连数据结构都没反回,(3层有可能)所以//
//我指定ID字段值没有任何效果???
先在数据表手动添2笔,再说!
 
我来拿分。
有二个事件:一个录入:
ClientDataSet1.open;
ClientDataSet1.STATE IN [DSINSERT,DSEDIT] then
ClientDataSet1.Post;
ClientDataSet1.State IN [DSINSERT,DSEDIT]) then
ClientDataSet1.Append;
ClientDataSet1.State IN [DSINSERT,DSEDIT]) then
ClientDataSet1.Edit;
一个保存:
try
ClientDataSet1.State IN [DSINSERT,DSEDIT]) then
ClientDataSet1.Edit;
ClientDataSet1.ApplyUpdates(-1);
Application.MessageBox('数据已保存!','xx厂',MB_OK+MB_ICONINFORMATION);
ClientDataSet1.EmptyDataSet;
except
Application.MessageBox('保存出错!','xx厂',MB_OK+MB_ICONERROR);
Abort;
end;
搞定。老兄,不要用COMMANDTEXT。是一个非常非常不好的东东。
 
我也遇到此過此問題,ClientDataSet用過locate之後就ApplyUpdates就不行.
後發現是我關鍵字的問題.
 
BillRobin大哥,你所说的两个事件该放在什么地方呢?请解说详细一些好吗?谢谢!
 
ApplyUpdates方法需要有主键,
 
后退
顶部