前段时间在做项目的时候遇到一个很奇怪的问题。
我用Asp.net写了一个Webservice借口,方法返回的是DataSet类型的。项目是用手机客户端调用的。我自己用Winform测试调用的时候得到的结果是4条,但是在在用网页访问的时候就出现了8条数据。我调试了一下代码,返回的是4条数据。很奇怪,就是不知道哪里出了问题。代码都没有问题啊。仔细观察了一下两个结果的异同我发现了不知道是什么问题的问题。我的接口返回的DataSet时拼接的。因为查询的表之间是一对多的关系,所以在返回的时候DataTable是拼接的(加了一列),在用网页调用的时候,前四条数据是拼接后的数据,后四条是拼接前的数据。也就是说,每一条数据都有一条是重复的。规律找到了,但是却不知道怎么解决,试了很多种方案,只要是拼接的DataTable就会出现此问题。不知道是两者调用的什么原理造成这种问题的,望大侠指教。
拼接代码:
#region 查询要提交的日报 /// <summary> /// 查询要提交的日报 /// </summary> /// <param name="userCode">提交人</param> /// <returns>要提交的日报</returns> public DataSet GetUserSubmitReport(string userCode) { DataSet ds = new DataSet(); ///DataSet returnDS = new DataSet(); string sql = string.Format(@"SELECT DISTINCT a.ReporID,b.DefinedID,b.DefinedName,a.SubmitDeadlineLeft,a.SubmitDeadlineTime FROM YD_SX_EffectivenessRepor a INNER JOIN YD_SX_EffectivenessReportDefined b ON a.DefinedID =b.DefinedID WHERE a.DelFlag=0 AND b.DelFlag=0 AND SubmitUserCode='{0}' AND b.DefinedType=1", userCode); try { ds = dboperator.ExecSQLReDataSet(sql); if (dboperator.IsError) { string strErrMsg = dboperator.ErrorMessage; } else { if (null != ds) { DataTable dt = ds.Tables[0]; DataColumn dataColumn = new DataColumn("ReceiveUserName", typeof(System.String)); dt.Columns.Add(dataColumn); if (null != dt && dt.Rows.Count > 0) { string userName = string.Empty; int intReporID = 0; foreach (DataRow item in dt.Rows) { //实效报表设定主键ID int.TryParse(item["ReporID"].ToString(), out intReporID); item["ReceiveUserName"] = this.GetReportSignUserName(intReporID); } } } } } catch (Exception) { throw; } return ds; } #endregion
1、
如果这个代码在WINFORM中是4条数据,那么在移动应用中也应该是四条数据,你的代码没有问题。
2、
不过,如果用到移动应用中,ANKOR的的建议要考虑下,可以节省大量的带宽资源。
3、
程序员马龙的建议也很好,SQL里增加与用户表的正交,这样,可以少执行一次SQL,CS代码也简单也很多。
在这个地方用“DataSet” 不妥吧!!DataSet 是个很大的容器,在你这个工程中,需要序列化和反序列化,
而事实,你用到的“DataSet”提供的功能是很少的,建议换别的吧!!接着返回你想要的东西(List or 对象数组)
教你个最简单的办法,把 ReceiveUserName 字段加到你的 Sql 语句中,这样,就不用代码 new DataColumn 了,你只需要填数就行。
你说的我明白,写SQL语句,存储过程就要操作一些。我主要是知道产生这个问题是原因是什么,我最后的解决方案是返回XML了。
@xiao99: 单从你放出的这段代码来看,没什么问题。你得把完整的代码贴出来。
我的建议是 拼接后的数据暂不要放到原Dt中 把拼接后的数据单独存在一个DataTable
试了,结果是一样的。