导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/8/13 16:49:25
标题:
求指点,DATASNAP客户端上传的STREAM,数据库没有保存
浏览:1951
加入我的收藏
楼主:
function TServerMethods1.PostStreamData(const AStream: TStream;const sTableName:string ): boolean; var LMemStream: TMemoryStream; tempFDQuery: TFDQuery; FDSchemaAdapter: TFDSchemaAdapter; begin result := false; try LMemStream := CopyStream(Astream); //CopyStream是DELPHI XE 10自带的例程函数 LMemStream.Position := 0; FDSchemaAdapter := TFDSchemaAdapter.Create(nil); tempFDQuery := TFDQUERY.Create(nil); tempFDQuery.SchemaAdapter := FDSchemaAdapter; tempFDQuery.Connection := FDConSQL; tempFDQuery.Close; tempFDQuery.SQL.Text := 'select * from ' + stableName + ' where 1=2'; tempFDQuery.Open; tempFDQuery.CachedUpdates := true; FDSchemaAdapter.UpdateOptions.AutoCommitUpdates := true; //LMemStream.SaveToFile('d:\temp\tmp.bin'),tmp.bin可以被FDMEMTABLE读 //取数据并显示。说明,客户端传过来的stream是正确的。 FDSchemaAdapter.LoadFromStream(LMemStream,TFDStorageFormat.sfBinary); if FDSchemaAdapter.ApplyUpdates = 0 then Result := true; //客户端执行后返回为True,表示成功,但数据库没有更新。 //百思不得其解,很困惑,希望有人传道授业解惑 //觉得应该是FDSchemaAdapter.ApplyUpdates没有真正执行 finally LMemStream.Free; FDSchemaAdapter.Free;//释不释放都不影响结果 tempFDQuery.Free;//释不释放都不影响结果 end; end; 在网上找了好久的资料,还是没解决,求指点。 另外:已经放置 FDStanStorageBinLink,FDStanStorageXMLLink,FDStanStorageJSONLink
----------------------------------------------
资质差,努力学
作者:
2019/8/13 17:21:11
1楼:
你先试试在 load 之前,把你的 stream 当前位置归零。 LMemStream.Position := 0;
----------------------------------------------
-
作者:
2019/8/13 17:29:03
2楼:
刚试了,还是不行。 其实 LMemStream := CopyStream(Astream); LMemStream.Position := 0; 已经归零了。谢谢,请再次指点
----------------------------------------------
资质差,努力学
作者:
2019/8/13 17:45:56
3楼:
期望盒子里的朋友,帮指点一下,卡在这里,搞不定了!
----------------------------------------------
资质差,努力学
作者:
2019/8/13 17:49:25
4楼:
没用过DataSnap, 试一下 Astream.Postion := 0;
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2019/8/13 17:56:38
5楼:
Astream.Postion := 0; 在CopyStream时,已经将TStream转成TMemoryStream且已经归零。 看了咏南的关于这方面的博客文章,觉得代码没有什么问题,可就是数据不能保存。不知道问题出在哪里,请大神们指点。 盒子也算是国内DELPHI水平比较高的论坛了,不会解决不了这个问题吧,我们盒子里 这么多大神呀
----------------------------------------------
资质差,努力学
作者:
2019/8/13 18:01:39
6楼:
没办法,把贴子顶一下,不能沉,期望高手们登录论坛的时候能看到这个贴子。并指教。
----------------------------------------------
资质差,努力学
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2019/8/13 20:45:30
7楼:
我的没这情况,数据库更新了
----------------------------------------------
-
作者:
2019/8/13 21:15:36
8楼:
能否提供服务器端代码?
----------------------------------------------
资质差,努力学
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2019/8/13 22:13:13
9楼:
就是delphi自带的DEMO,数据库用的是sqlite
----------------------------------------------
-
作者:
2019/8/13 22:14:09
9楼:
泱泱盒子,Delphi高手云集之地,无人知晓?
----------------------------------------------
资质差,努力学
作者:
2019/8/13 22:26:40
10楼:
看例子里还有一个设置,你试试看: FDSchemaAdapter.UpdateOptions.AssignedValues := [uvAutoCommitUpdates];
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2019/8/13 22:36:30
11楼:
拖放控件的时候这个参数设置过,也不行!不知道与客户端的设置或提交代码有没有关系!数据库是mssql 2008r2
----------------------------------------------
资质差,努力学
作者:
2019/8/13 22:52:26
12楼:
表里有没有设置主键字段?
----------------------------------------------
-把学习当信仰
作者:
2019/8/13 22:57:13
13楼:
设置了,用TFDJSONDataSets方式,可以正常更新。楼上的之前你的帖子问过这个问题,你说已经解决了。你提到要用好TFDSchemaAdapter。是怎么做到的?
----------------------------------------------
资质差,努力学
作者:
2019/8/13 23:02:32
14楼:
感谢各位的热心帮助,可是问题还是没有解决,始终不明白问题出在哪里?很郁闷!期待高人指点。
----------------------------------------------
资质差,努力学
作者:
2019/8/14 0:04:17
15楼:
你应该把客户端数据集(TFDmemtable或TFDQuery)的cacheupdate属性设为true,应该就可以了
----------------------------------------------
-把学习当信仰
作者:
2019/8/14 0:26:55
16楼:
客户端FDMemTable 的cacheupdate设为true了,否则用TFDJSONDataSets方式更新数据就不会成功,头疼呀!网上关于firedac的资料好少,百度下来有用的资料少的可怜!
----------------------------------------------
资质差,努力学
作者:
2019/8/14 0:41:03
17楼:
可以加Q讨论,虽然我也搞了蛮久,但是就这几步
----------------------------------------------
-把学习当信仰
作者:
2019/8/14 7:34:58
18楼:
你的qq号方便告之吗?
----------------------------------------------
资质差,努力学
作者:
2019/8/14 10:20:01
19楼:
1601423263
----------------------------------------------
-把学习当信仰
作者:
2019/8/14 12:24:58
20楼:
特别鸣谢akai1203,花了二个小时的时间,帮远程调试,并解决问题,这种人人为我,我为人人的思想,才是我们DELPHI人的精神,也才能让盒子长远发展。在此特别感谢akai1203无偿的帮助。相当感谢!
----------------------------------------------
资质差,努力学
作者:
2019/8/14 12:54:21
21楼:
秉着“人人为我,我为人人”的思想,具体原因,保密。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/8/14 13:10:15
22楼:
datasnap的流操作有些问题,建议用datasnap rest则好。 本人一直用datasnap rest进行上传下载,很好。
----------------------------------------------
-
作者:
2019/8/14 14:57:23
23楼:
楼主,解决了,分享一下,那里出问题
----------------------------------------------
-相互学习,共同进步! 努力每一天,不能望山跑死马 发上等愿,结中等缘,享下等福;择高处立,寻平处住,向宽处行
作者:
2019/8/14 15:13:35
24楼:
我也想知道哪里的问题!
----------------------------------------------
Everyone will to do best!
作者:
2019/8/14 15:48:54
25楼:
这个问题的原因我已经知道了! TFDTableAdapter (+ 同一 TFDSchemaAdapter,设置 DatSTableName 为服务端 的 TFDQuery 名 ) 就是客户端放置的TFDTableAdapter控件的DatSTableName属性要制定服务器端的对应的TFDQuery名,而不是表名!
----------------------------------------------
Everyone will to do best!
作者:
2019/8/16 8:12:06
26楼:
事实上,根本不需要劳什子TFDSchemaAdapter来保存提交的流。官方的一些SAMPLE,无非是误人子弟。 直接TFDQUERY一个控件搞定 FDQuery1.Close; FDQuery1.sql.Clear; FDQuery1.CachedUpdates := True; FDQuery1.sql.Text := 'select * from ' + ATableName + ' where 1=2'; FDQuery1.LoadFromStream(ms, FFormat); if FDQuery1.ApplyUpdates = 0 then 另外,DATASNAP传输流是没有问题的,不要误导群众。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
2019/8/16 23:44:38
27楼:
TFDSchemaAdapte没有存在的必要
----------------------------------------------
-
作者:
2019/8/17 11:32:57
28楼:
@zjjtour (zjjtour)楼主,本着“人人为我,我为人人”的思想,可以告诉下是怎么解决的吗?
----------------------------------------------
-
作者:
2019/8/20 22:50:37
29楼:
26楼, 楼主的意思是可以上传多个Stream,你给的例子只能传1个Stream,如果两个Stream,又要手工再多设置一个TStream参数,这样不方便!
----------------------------------------------
Everyone will to do best!