关于Socketconnection怎么使用事务的问题

虚月 2012-02-29 11:26:23
我接手了个别人的程序,是三层结构。客户端是Clientdateset + Socketconnection。
我想问下有没有办法像AdoConnection那样,用数据源创建个事务,接着执行所要的数据命令,再提交事务,或是回滚。
因为我在一个事件里除了ClientDataSet.ApplyUpdates(0) 外还会多加好几个命令式的增删改。
如果是都在一起的话可以直接把所有的命令都整在一起,用begin end 。但最惨的就是在这增删改中间会多出条ClientDataSet.ApplyUpdates(0);而且有的还需要上一步的新增命令执行完,然后取值在下一步进行修改。
所以想问下有没有办法实现类似
try
adoconnection1.BeginTrans;
...//执行命令
ADOConnection1.CommitTrans
except
ADOConnection1.RollbackTrans;
end;
...全文
178 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
虚月 2012-03-06
  • 打赏
  • 举报
回复
客户端主要是用TClientdateset+TSocketConnection
服务器是用TADOConnection+TADOQuery,再用一个Tbc_server的窗体(以.tlb结尾)写函数。
中间是用borland socket server设置端口。
客户端在执行SQL语句时是用TClientdateset调用服务器上自己写函数,把SQL命令以字符的形式传过去,而服务器就把传过来的字符串用TADOQuery执行。若有返回数据集就用Variant的形式返回客户端。
Clientdateset.data := Clientdateset.RemoteServer.AppServer.fun_getdatasql('SQL语句')最后一个是服务器上的函数名。
但也可以用Clientdateset.CommandText;Clientdateset.open;
山东蓝鸟贵薪 2012-03-05
  • 打赏
  • 举报
回复
最好是能看懂别人的三层,
才能再次“针对性”的修改呀
虚月 2012-03-05
  • 打赏
  • 举报
回复
在服务器端上做事务,在这个事务期间如果同时还有一台以上的客户端也做事务,会有影响吗?如果出错了回滚了,那其他事务会怎么样?
虚月 2012-02-29
  • 打赏
  • 举报
回复
我服务器是ADO,但我这是多客户端,如果直接从服务器做事务可能会影响到别的客户端
用存储过程有办法处理dbgrid上的更新吗?
lzg827 2012-02-29
  • 打赏
  • 举报
回复
还是在存储过程中处理吧。
如果是Ado,就直接支持事务了。
我看见佛 2012-02-29
  • 打赏
  • 举报
回复
你的服务器不是用ADO组件做的么?

我的服务器是ADO组件做更新可以进行事物操作
虚月 2012-02-29
  • 打赏
  • 举报
回复
有些是可以写存储过程,不过不些操作比较多需要用ClientDataSet.ApplyUpdates(0)来完成。所以才麻烦点。而且程序是有关数据库的,这种操作很多,总不好一新建个窗体就去那个存储过程吧!
还有什么其他办法吗?还是说多加个什么控件?
我网上看到有人提到TAdoConnection或TDataBase控件 但具体怎么关连怎么操作不清楚
mhhaifeng 2012-02-29
  • 打赏
  • 举报
回复
如果操作多 数据关系紧 用存储过程?
lyhoo163 2012-02-29
  • 打赏
  • 举报
回复
在服务器端,做事务程序。客户端上传SQL命令,执行事务。
虚月 2012-02-29
  • 打赏
  • 举报
回复
我也知道,以前我弄两层的时候也是,不过那是不同的程序,事务就不一样了。现在是服务器只有一个。
我现在是多个ClientDataSet同时处理,ClientDataSet.ApplyUpdates(0)和 ClientDataSet.Execute交叉使用。
比如:
..
ClientDataSet.Execute;
..
ClientDataSet.ApplyUpdates(0);
..
ClientDataSet..Execute;
这些是要在同一个事件里完成。那要是最后一个出错,不都完了!!
所以想做弄个事务,保险点!
你说‘操作几笔资料后就自动更新到服务器’这要怎么做啊?
我看见佛 2012-02-29
  • 打赏
  • 举报
回复
那你可以以设置成,自动更新,比如操作几比笔资料后就自动更新到服务器。减少大量数据在一时刻更新的可能
我看见佛 2012-02-29
  • 打赏
  • 举报
回复
我们这边是服务器上进行处理,操作的是ORACLE数据库,几百人同时使用没有问题。客户端处理个人认为不太靠谱。不过我们这边是多服务器。
虚月 2012-02-29
  • 打赏
  • 举报
回复
我想要的是在客户端进行事务处理。
楼上你那种是在服务器上的数据源进行事务。
但如果多个客户端同时使用时就会有问题了,要么出错,要么要等别人处理完了才能!
因为我这边做的客户端是不少,有的操作时间可能会长一点。所以不能一有人处理别人就在等。总不能一个客户端就在服务器上配一个ADOCOnnection去连接吧。
我想要的就是最好能在客户端上把事务处理好,然后直接发给服务器。可能有点麻烦吧!
我看见佛 2012-02-29
  • 打赏
  • 举报
回复
  if not Conn.InTransaction then
Conn.BeginTrans;
try
{更新资料的代码}

if Conn.InTransaction then
Conn.CommitTrans ;
except
on E:Exception do
begin
if Conn.InTransaction then
Conn.RollbackTrans ;
raise Exception.Create(E.Message);
end ;
end ;
虚月 2012-02-29
  • 打赏
  • 举报
回复
那用ADO的要怎么做啊?
我看见佛 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 a6652162 的回复:]
我服务器是ADO,但我这是多客户端,如果直接从服务器做事务可能会影响到别的客户端
用存储过程有办法处理dbgrid上的更新吗?
[/Quote]存储过程中做和ADO中做其实也差不多的哦,

至于更新三层中,一般是先POST到要本,然后再提交到服务器端,和DBGRID上的数据更新是无关的,因为最先更新的就是DBGRID

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧