一个三层数据库开的数据提交问题?(100分)

  • 主题发起人 主题发起人 wx_168
  • 开始时间 开始时间
W

wx_168

Unregistered / Unconfirmed
GUEST, unregistred user!
  我现在在做一个层的数据库管理软件,我用的是TClientDataSet控件做为客户端的数据操作。
  可是现在我发现了一个奇怪的问题:
  ClientDataSet.Edit;时数据提交不到数据库中,(只在当前显示已经改过了,而数据库中的数据还是不变)。可是ClientDataSet.append的时候就可以把数据提交到数据库中,不知道是何原因???
程序的代码如下:
if not pubCommand.IsEmpty then
begin
pubCommand.First ; sGGZD.First;
while not sGGZD.Eof do
begin
{pubCommand.Edit; //} pubCommand.Append;
pubCommand.FieldByName('BM').Value := sGGZD.FieldByName('BM').Value;
pubCommand.FieldByName('NF').Value := sGGZD.FieldByName('NF').Value;
pubCommand.FieldByName('XGCS').Value := sGGZD.FieldByName('XGCS').Value;
pubCommand.Post;
pubCommand.Next; sGGZD.Next;
end;
PubCommand.ApplyUpdates(0);

还请各位富翁顶力相助,不知道是哪个地方没有搞对。。。
为什么当添加的时候就可以保存到数据库中,而修改的时候为何不能保存到数据库中呢??
 
怎么没有人回复呀、???
 
最好显式开启事务,然后显式提交,应该就不会有问题了。
 
Johnny_du:
还请说的更详细一些。。。多谢了。。。!!!

用Edit时,保存数据后,用Refresh就会出现如下错误信息:
---------------------------
Debugger Exception Notification
---------------------------
Project IAMUC.exe raised exception class EDatabaseError with message 'sGGZD: Must apply updates before refreshing data'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
这是什么意思???。。。请会的帮忙。。。。。
 
怎么还没有人回答问题呀。。。???还是分给的不够,分数还可以加的。
请大伙帮忙呀。。。。。急。。。。!!!
 
是否可以这样
建一个 DataModule 窗体 里面放如下控件
AdoConnection1 用于连接数据库 设置 AdoConnection.ConnectionString
ADOQuery1 ADOQuery1.Connection:=Adoconnection1
DataSetProvider1 DataSetProvider1.dataSet:=Adoquery1

具体的数据操作窗体上使用如下控件:
直接操作 MataModule 中的Adoquery1 结果通过 ClientdataSet1得到
 
用 pubCommand.Edit 时需搭配 pubCommand.Next,用 pubCommand.Append 则不需要。
从你的代码看,应该都能够提交到数据库,只是用 Edit 时没有添加新数据,而是修改原来数据库中的原有数据,如果原来数据库中没有数据或数据少于你要加入的数据,则用 Edit 就有问题了。
不知你的意图是添加数据还是更改数据?
 
if PubCommand.ApplyUpdates(0)<>0 then
begin
showmessage('提交数据不成功');
end;
你把提交的地方这样改一下,如果你用的是SQL SERVER,就可以用事件探测器跟踪一下产生的SQL语句就可以发现是什么问题了,有可能是由于日期型字段的原因
 
同意楼上的,先有条件语句测试一下,如果提交失败也有可能是你中间层的问题,最后再跟踪一下SQL语句,是否执行,看是否是数据库方面的问题。
还有,以后最好提交都用这种条件语句,既方便了你编译时提出错误,也在以后的运行期也给提交给用户。
 
后退
顶部