首页 新闻 搜索 专区 学院

winform和页面调用同一个Webservice出现不同的结果。

0
悬赏园豆:5 [已解决问题] 解决于 2012-11-19 16:14

前段时间在做项目的时候遇到一个很奇怪的问题。

我用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
xiao99的主页 xiao99 | 初学一级 | 园豆:188
提问于:2012-07-02 16:41
< >
分享
最佳答案
0

1、

如果这个代码在WINFORM中是4条数据,那么在移动应用中也应该是四条数据,你的代码没有问题。

 

2、

不过,如果用到移动应用中,ANKOR的的建议要考虑下,可以节省大量的带宽资源。

 

3、

程序员马龙的建议也很好,SQL里增加与用户表的正交,这样,可以少执行一次SQL,CS代码也简单也很多。

收获园豆:5
无之无 | 大侠五级 |园豆:5085 | 2012-07-02 17:51
其他回答(3)
0

在这个地方用“DataSet” 不妥吧!!DataSet 是个很大的容器,在你这个工程中,需要序列化和反序列化,

而事实,你用到的“DataSet”提供的功能是很少的,建议换别的吧!!接着返回你想要的东西(List or 对象数组)

Angkor--:-- | 园豆:1086 (小虾三级) | 2012-07-02 16:51
0

教你个最简单的办法,把 ReceiveUserName 字段加到你的 Sql 语句中,这样,就不用代码  new DataColumn 了,你只需要填数就行。

Launcher | 园豆:45045 (高人七级) | 2012-07-02 16:52

你说的我明白,写SQL语句,存储过程就要操作一些。我主要是知道产生这个问题是原因是什么,我最后的解决方案是返回XML了。

支持(0) 反对(0) xiao99 | 园豆:188 (初学一级) | 2012-07-02 18:04

@xiao99: 单从你放出的这段代码来看,没什么问题。你得把完整的代码贴出来。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2012-07-03 09:27
0

我的建议是 拼接后的数据暂不要放到原Dt中 把拼接后的数据单独存在一个DataTable

我是小坏 | 园豆:207 (菜鸟二级) | 2012-07-02 18:11

试了,结果是一样的。

支持(0) 反对(0) xiao99 | 园豆:188 (初学一级) | 2012-07-04 11:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册