二开WebApi返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回空DataTable的json数据不一样。

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开WebApi返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回空DataTable的json数据不一样。

【问题描述】

    二开WebApi接口,并返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回的json数据不一样了。

    例如:select fname from t_xxx_table where fname='test' , 数据库中不存在test数据时返回一个包含空数据的DataTalbe的DataSet时。历史版本返回了:{"Table": [] },2023-11版本后返回了: {"Table":[{"fname":"","ColumnTypeFullName":"System.String","TableRowsIsEmpty":true}]},携带了结构和数据空标识。



【场景介绍】

  • 业务场景及原因分析:升级2023-11补丁版本后,增强了数据安全与准确性

  • 问题出现版本:PT-151005 [8.2.0.20231109] 发布时间:2023/11/9 构建号:8.2.775.7

  • 问题出现端:WebApi

  • 原因分析:

    • 当查询select fname from t_xxx_table where fname='test' 时。

    • 老版本直接返回空包{"Table":[]},把查询结构直接丢失了,显然是不正确的,导致整个查询结构丢失了。

    • 新版本修复了该问题,当查询的DataTable中数据为空时,标注该DataTable中的TableRowsIsEmpty数据为空,同时会返回查询的数据结构,并在每个字段后面紧跟ColumnTypeFullName属性描述前面的字段数据类型,用于JsonConver时准确恢复字段类型,确保接收端反序列化时与服务端DataTable的数据结构一致。

      • 当查询数据为空时:{"Table":[{"fname":"","ColumnTypeFullName":"System.String","TableRowsIsEmpty":true}]} 。

      • 当查询数据不为空时:{"Table":[{"fname":"demo","ColumnTypeFullName":"System.String"}]}。



【解决方案】

      出现这样的提示是由于在查询不到数据时返回的DataTable保持了查询结构,而不是完全的空对象,而二开代码判断空对象而不是数据导致,导致不能正确判断,请尝试下列操作来解决:

 方案一, 判断Json数据内容

    建议二开程序接受端改进下DataTable为空时的判断逻辑,可判断返回的Table对象中的属性 TableRowsIsEmpty = true。

 方案二, 返回数据反序列化为DataSet对象

    反序列化返回的json数据为DataSet对象,然后操作DataSet的Tables做判断即可。

var ser = new Kingdee.BOS.ServiceFacade.JsonSerializerProxy(Encoding.UTF8, false);
DataSet ds = (DataSet)ser.Deserialize(jsonstr, typeof(DataSet));

 方案三,建议构建二开实体类返回,不直接返回DataSet(推荐

     不建议直接返回DataSet或DataTable,建议二开构建实体类对象返回数据,这样可以确保数据简洁安全和一致性。同时在接收端的判断代码中获得更好的保护性。



【延伸阅读】

(此处书写相关知识,若无可直接删掉,若插入链接,请选择菜单栏的链接进行插入)


二开WebApi返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回空DataTable的json数据不一样。

【问题描述】 二开WebApi接口,并返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回的json数据不一样了。 例...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息