非高手莫入!三层系统数据更新问题,在线答复(200分)

  • 主题发起人 主题发起人 chp5231
  • 开始时间 开始时间
C

chp5231

Unregistered / Unconfirmed
GUEST, unregistred user!
我采用的三层结构,由于联网条件有限,所以我在客户端也建立了一个本地数据库,我先登录本地数据库,录好本地数据库后,用DBGRID显示结果,然后进行过滤,最后将过滤结果值付给一个Clientdataset,由它来负责INSERT到远程数据库,但提示找不到DATA PROVIDER OR DATA PACKET
代码如下:
CDataSend.
Close;
CDataSend.
Open;
CDataSend.
Insert;
CDataSend.
Data := CDLLForm.dsJbzl.Data;
CDataSend.
Post;
if CDataSend.
ApplyUpdates(0) > 0 then
showmessage('failed');
请问各位大侠在设计到在本地也建一个数据库的时候,有什么更好的方式来提交到远程数据库吗,难道写SQL语句是唯一的方式?还有如果我是Ii插入多条记录的话,写SQL语句的话,是用参数方式还是直接INs插入整个数据到远程服务器?
 
指定远程的ProviderName了吗?
 
指定了!
try
SOCKCONN.Address := Trim(MEdtIPAddress.Text);
SOCKCONN.Port := StrToInt( Trim(MEdtPort.Text) );
SOCKCONN.Open;
MLogin := SOCKCONN.AppServer.RLogin( Trim(edtUserName.Text),Trim(edtPassword.Text) );
if MLogin = 1 then
Application.MessageBox( '用户名或者密码错误', '登陆失败', MB_OK+MB_ICONERROR )
else
Result := True;
CDataSend.
RemoteServer := SOCKCONN;
except
On E:Exceptiondo
begin
Application.MessageBox(
PChar( '服务器连接错误,请检查是否设置错误' + #13 +
'错误如下:' + #13 + E.Message
),
'连接错误', Mb_OK+MB_ICONERROR
);
end;
end;
 
请问LeeChange
像我这种情况,采用那种方式来INSERT远程数据比较好,我嫌写SQL麻烦呀
 
高手们怎么都惜字如金,帮小弟多出出主意吧!
 
怎么只看见指定RemoteServer,没看见指定ProviderName呀?
 
我在属性里设定好了
 
在提交前看看CDataSend.
changecount等于多少
 
就是我在本地和远程都有数据库,我想通过clientdataset将本地数据导入到远程数据库中去,用什么法子好?
 
你的办法本来就挺好的,传递MIDAS数据封包,只要数据量不是太大应该都没问题吧
只是你的实现方法有点问题
 
to:siyan
你好,请问你是如何来实现的?
我的思路是这样的,我用一个clientdataset1链接本地数据库,然后用Dbgrid显示,然后用filter来过滤clientdataset1的数据,接着把clientdataset1.data付给一个跟远程数据库链接的clientdataset2.delta,通过cientdataset2来更新数据,我想通过封包来直接插入远程数据库中,如果无法这样实现,用SQL语句的话,我只有将dbgrid中的数据倒成SQL语句,然后用SQL来更新远程服务器,这样的方法好吗,如果我的记录字段比较多的话,用参数是没法实现insert的吧?
 
问题就在于你无法直接将clientdataset1.data付给一个跟远程数据库链接的clientdataset2.delta,所以我让你查看clientdataset2.changecount
你可以试以下直接调用AppServer.AS_ApplyUpdates方法
把Data当作Delta传递到服务器试一下
 
这种问题,也要高手才能解决呀
我是低手一个,
倒知道点点
建议还是去买本分布式的书看看吧,
 
to:siyan
CDataSend.
Close;
CDataSend.
Data := CDLLForm.dsJbzl.Data;
就出错,所以我无法查看changecount
 
这个问题不用讨论的这么麻烦吧!楼主的设计本身就有问题。
先看楼顶的贴子,CDataSend.
ApplyUpdates(0)是提交ClientDataSet.delta里面的数据,你现在只是CDataSend.
Data := dsJbzl.Data,有什么用?delta里面根本没数据,怎么可能实现你的目的??!!你可看看在你CDataSend.
ApplyUpdates(0)前CDataSend.
changecount是不是和你要更新的数据纪录条数一致
再看1928479贴:clientdataset1.data付给一个跟远程数据库链接的clientdataset2.delta
这就更不现实了,delta是只读属性,你怎么可能直接把一个data数据写入delat中呢??
如果你真的要实现利用clientdataset传递数据封包这样一个过程,可能在客户端要放2个clientdataset,一个获得需要的数据后,再一条条的insert入另一个clientdataset2,再将这个clientdataset2.delta传递出去,这样才可能成功.
补充一点:
CDataSend.
Insert;
CDataSend.
Data := CDLLForm.dsJbzl.Data;
Insert后把Data传进去,也当然会报错了,因为insert后是插入了一条记录,你传了整个data进去clientdataset自然搞不懂到底要怎么办拉:0
 
照xiaasp说的话,就是用SQL将DBGRID中的数据导入临时Clientdataset,再由clientdataset来负责将数据上传至远程服务器,说到底还是用了SQL语句
 
用代碼將datasetprovider指明即可...[:D]
 
你要用封装数据的办法,这个是最直观可行的,而且也不是一定要用SQL倒
例如
........
ClientDataSet1.First;
for i=1 to ClientDataSet1.RecordCountdo
begin
ClientDataSet2.insert;
ClientDataSet2.FieldByName('field1').asstring:=ClientDataSet1.FieldByName('field1').asstring;
............
.............
ClientDataSet2.post;
ClientDataSet1.next;
end;
然后直传ClientDataSet2.delta到中间层就行了
这儿就没有用SQL,而且这个for循环是在客户端的,所以只要把他放在线程中执行,用户一般感觉不到速度问题。
至于你以前Data传递到delta的想法,是好地!可惜delta的数据格式并没有公开,而且他又是只读的,所以只能这样做了.
 
TO:xiaasp
感谢xiaasp给了我最好的例子!我想这个方法的确是个不错的办法!呵呵,好了,这个问题就到此为止吧,希望能给那些刚学三层的朋友一下思路!
 
后退
顶部