使用VS发布网站后遇到的Fill为Null的奇怪错误。

写了一个小小程序,用来上课,主要应用是学生可以看到老师发布的一些内容。

在使用了一个分页程序后(SQL的双TOP法),发现前台和后台的两个页(这两个页都是查询同一个视图,该视图里有两表)打开时经常会提示错误(错误信息和代码在下面),但刷新页面后,错误就消失,显示我想要的内容。在使用同样的分页程序(也就是下面的CreatePagingSql)在其他页(查询其他表或者视图)却从不会出现这样的错误。

编辑环境是:Win7 64位 双核。VS2010,Net FrameWork4。

服务器环境是:Win2003 32位 单核,Net FrameWork4。

我测试过,如果将该程序不经发布、编译,直接放源代码到服务器使用,程序是没有什么提示错误的;但如果发布了之后(从编辑环境发布到服务器),就经常会出现这样的错误。

我在想,会不会是我发布的环境跟服务器的环境差别太大,所以才会出现这样的错误呢?于是我在服务器上又安装了VS2010,但结果还是一样,发布了之后还是会提示错误。

发生的错误信息如上:

System.Exception: 数据查询失败!ExecuteTable查询语句为: SELECT TOP 20 * FROM (select * from [topicview] where t_id>0) AS T ORDER BY t_addtime desc |a=da|Open ---> System.NullReferenceException: Object reference not set to an instance of an object. at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i) at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout) at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values) at System.Data.ProviderBase.SchemaMapping.LoadDataRow() at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at OLC.DAL.Database.ExecuteTable(CommandType cmdType, String cmdText, SqlParameter[] commandParameters) --- End of inner exception stack trace --- at OLC.DAL.Database.ExecuteTable(CommandType cmdType, String cmdText, SqlParameter[] commandParameters) at OLC.BLL.topic.GetTopicList(String strWhere, String filedOrder, Int32 pageSize, Int32 pageIndex, Int32& totolCount) at admin_admin_art_list.BindRepeater(String _strWhere, String _strOrderBy) at admin_admin_art_list.Page_Load(Object sender, EventArgs e) at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)。

发生错误页的代码如下:

ExcuteTable

        /// <summary>
        /// 获得一个表名为result数据表
        /// </summary>
        /// <param name="cmdType">CommandType枚举</param>
        /// <param name="cmdText">命令字符串</param>
        /// <param name="commandParameters">命令参数</param>
        /// <returns>一个表名为Result的DataTable </returns>
        public DataTable ExecuteTable(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
        {
            string a = string.Empty;
            DataTable result = new DataTable();
            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandTimeout = 60;
                PrepareCommand(cmd,cmdType, cmdText, commandParameters);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                a = "da|"+cmd.Connection.State;
                da.Fill(result);
                a = "fill";
            }
            catch (Exception ex)
            {
                throw new Exception("数据查询失败!ExecuteTable查询语句为:" + cmdText+"|a="+a, ex);
            }
            return result;
        }
View Code
        /// <summary>
        /// 获得所有下载文件列表
        /// </summary>
        /// <returns>下载文件列表</returns>
        public DataTable GetTopicList(string strWhere, string filedOrder, int pageSize, int pageIndex, ref int totolCount)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("select * from " + topicview);
            if (strWhere.Trim() != "")
                sb.Append(" where " + strWhere);
            totolCount = Convert.ToInt32(db.ExecuteScalar(CommandType.Text, OLC.Common.PagingHelper.CreateCountingSql(sb.ToString()), null));
            return db.ExecuteTable(CommandType.Text, OLC.Common.PagingHelper.CreatePagingSql(totolCount, pageSize, pageIndex, sb.ToString(), filedOrder), null);
        }
View Code

CreatePagingSql

        /// <summary>
        /// 获取分页SQL语句,排序字段需要构成唯一记录
        /// </summary>
        /// <param name="_recordCount">记录总数</param>
        /// <param name="_pageSize">每页记录数</param>
        /// <param name="_pageIndex">当前页数</param>
        /// <param name="_safeSql">SQL查询语句</param>
        /// <param name="_orderField">排序字段,多个则用“,”隔开</param>
        /// <returns>分页SQL语句</returns>
        public static string CreatePagingSql(int _recordCount, int _pageSize, int _pageIndex, string _safeSql, string _orderField)
        {
            //重新组合排序字段,防止有错误
            string[] arrStrOrders = _orderField.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            StringBuilder sbOriginalOrder = new StringBuilder(); //原排序字段
            StringBuilder sbReverseOrder = new StringBuilder(); //与原排序字段相反,用于分页
            for (int i = 0; i < arrStrOrders.Length; i++)
            {
                arrStrOrders[i] = arrStrOrders[i].Trim();  //去除前后空格
                if (i != 0)
                {
                    sbOriginalOrder.Append(", ");
                    sbReverseOrder.Append(", ");
                }
                sbOriginalOrder.Append(arrStrOrders[i]);

                int index = arrStrOrders[i].IndexOf(" "); //判断是否有升降标识
                if (index > 0)
                {
                    //替换升降标识,分页所需
                    bool flag = arrStrOrders[i].IndexOf(" DESC", StringComparison.OrdinalIgnoreCase) != -1;
                    sbReverseOrder.AppendFormat("{0} {1}", arrStrOrders[i].Remove(index), flag ? "ASC" : "DESC");
                }
                else
                {
                    sbReverseOrder.AppendFormat("{0} DESC", arrStrOrders[i]);
                }
            }

            //计算总页数
            _pageSize = _pageSize == 0 ? _recordCount : _pageSize;
            int pageCount = (_recordCount + _pageSize - 1) / _pageSize;

            //检查当前页数
            if (_pageIndex < 1)
            {
                _pageIndex = 1;
            }
            else if (_pageIndex > pageCount)
            {
                _pageIndex = pageCount;
            }

            StringBuilder sbSql = new StringBuilder();
            //第一页时,直接使用TOP n,而不进行分页查询
            if (_pageIndex == 1)
            {
                sbSql.AppendFormat(" SELECT TOP {0} * ", _pageSize);
                sbSql.AppendFormat(" FROM ({0}) AS T ", _safeSql);
                sbSql.AppendFormat(" ORDER BY {0} ", sbOriginalOrder.ToString());
            }
            //最后一页时,减少一个TOP
            else if (_pageIndex == pageCount)
            {
                sbSql.Append(" SELECT * FROM ");
                sbSql.Append(" ( ");
                sbSql.AppendFormat(" SELECT TOP {0} * ", _recordCount - _pageSize * (_pageIndex - 1));
                sbSql.AppendFormat(" FROM ({0}) AS T ", _safeSql);
                sbSql.AppendFormat(" ORDER BY {0} ", sbReverseOrder.ToString());
                sbSql.Append(" ) AS T ");
                sbSql.AppendFormat(" ORDER BY {0} ", sbOriginalOrder.ToString());
            }
            //前半页数时的分页
            else if (_pageIndex <= (pageCount / 2 + pageCount % 2) + 1)
            {
                sbSql.Append(" SELECT * FROM ");
                sbSql.Append(" ( ");
                sbSql.AppendFormat(" SELECT TOP {0} * FROM ", _pageSize);
                sbSql.Append(" ( ");
                sbSql.AppendFormat(" SELECT TOP {0} * ", _pageSize * _pageIndex);
                sbSql.AppendFormat(" FROM ({0}) AS T ", _safeSql);
                sbSql.AppendFormat(" ORDER BY {0} ", sbOriginalOrder.ToString());
                sbSql.Append(" ) AS T ");
                sbSql.AppendFormat(" ORDER BY {0} ", sbReverseOrder.ToString());
                sbSql.Append(" ) AS T ");
                sbSql.AppendFormat(" ORDER BY {0} ", sbOriginalOrder.ToString());
            }
            //后半页数时的分页
            else
            {
                sbSql.AppendFormat(" SELECT TOP {0} * FROM ", _pageSize);
                sbSql.Append(" ( ");
                sbSql.AppendFormat(" SELECT TOP {0} * ", ((_recordCount % _pageSize) + _pageSize * (pageCount - _pageIndex) + 1));
                sbSql.AppendFormat(" FROM ({0}) AS T ", _safeSql);
                sbSql.AppendFormat(" ORDER BY {0} ", sbReverseOrder.ToString());
                sbSql.Append(" ) AS T ");
                sbSql.AppendFormat(" ORDER BY {0} ", sbOriginalOrder.ToString());
            }
            return sbSql.ToString();
        }
View Code

CreateCountingSql

        /// <summary>
        /// 获取记录总数SQL语句
        /// </summary>
        /// <param name="_safeSql">SQL查询语句</param>
        /// <returns>记录总数SQL语句</returns>
        public static string CreateCountingSql(string _safeSql)
        {
            return string.Format(" SELECT COUNT(1) AS RecordCount FROM ({0}) AS T ", _safeSql);
        }
View Code

页面中使用的代码

    private void BindRepeater(string _strWhere, string _strOrderBy)
    {
        this.pageindex = GetRequest.GetQueryInt("page", 1);
        this.rptList.DataSource = new OLC.BLL.topic().GetTopicList(_strWhere, _strOrderBy, this.pageSize, this.pageindex, ref totalCount);
        this.rptList.DataBind();
        string pageUrl = Utils.CombUrlTxt(originalPageURL, "c_id={0}&keywords={1}&state={2}&page={3}",
                this.c_id.ToString(),  this.keywords, this.state.ToString(), "__id__");
        PageContent.InnerHtml = Utils.OutPageList(this.pageSize, this.pageindex, this.totalCount, pageUrl, 8);
    }
View Code

该页面所涉及的代码全在这里了。各位大虾们可否帮助一下小弟呢?

想放在首页的目的是想让大家帮帮忙。如有不快,可以拍砖。

转载于:https://www.cnblogs.com/leotan/archive/2013/05/30/3108296.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值