none
为什么ASP.NET应用程序运行的时候偶尔会显示部署时候的内容呢? RRS feed

  • 问题

  • 这个个问题其实前面问过,但是还是没有找到解决方案,所以继续提问。
    现象是这样的:
    系统部署完成之后运行一切都很正常,但是运行一段时间之后,添加数据成功之后(后台可以看到更新之后的数据),前台页面偶尔会显示部署时候添加的内容。如果部署的时候有些栏目没有内容,这个时候也没有内容,而且通常发生在晚上11点半左右,而且过了大约半小时到一小时自己又恢复正常,真的不知道是什么原因。
    我现在把我的获取新闻的列表的代码发布出来,希望大家帮我看看。
    /// <summary>
            /// 通过分类获取新闻列表,包括所有的子类的新闻列表
            /// 如果指定分类下有子类在前台不显示,则不显示该分类的新闻列表
            /// </summary>
            /// <param name="table"></param>
            /// <param name="page"></param>
            /// <param name="orders">排序条件集合</param>
            /// <param name="viewFlag">
            /// 是否指定显示分类,可以为“Y"/"N"/null
            /// 如果为Y:则表示只显示前台可以显示的分类下的新闻列表
            /// 如果为N:则表示只显示前台不可以显示的分类下的新闻列表
            /// 如果为NULL:则表示获取该分类下的所有的新闻列表
            /// </param>
            /// <param name="account"></param>
            /// <returns></returns>
            public NewsList GetNewsListForNormalUser(Hashtable table, Query query, ViewFlag viewFlag, PubAccount account,bool isSearch)
            {
                SQLDALNewsClass newsClassDal = new SQLDALNewsClass();
    
                 query.PageInfo.RecordCount = this.GetNewsListCountForNormalUser(table, viewFlag, account,isSearch);
    
                StringBuilder sb = new StringBuilder();
    
                sb.Append(this.GetNormalQueryString(table, viewFlag, account, query,isSearch));
                string sql = sb.ToString();
                SqlDataReader reader = null;
                NewsList list = new NewsList();
                News news = null;
                try
                {
                    reader = DBHelper.ExecuteReader(sql);
                    while (reader.Read())
                    {
                        news = new News(reader);
                        list.Add(news);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (reader != null && !reader.IsClosed) reader.Close();
                }
    
                return list;
            }
    private string GetNormalQueryString(Hashtable table,ViewFlag viewFlag, PubAccount account,Query query,bool isSearch)
            {
                string where = this.GetNormalQueryWhereString(table, viewFlag, account, isSearch);
                StringBuilder sql = new StringBuilder();
                sql.AppendFormat("SELECT TOP {0} * FROM ",query.PageInfo.PageSize);
                if (account == null)
                {
                    sql.AppendFormat("{0} WHERE {1} AND {2} NOT IN (SELECT TOP {3} {2} FROM {0} WHERE {1} {4}) {4}", News.TABLENAME, where, News.ID, (query.PageInfo.CurrentPage - 1) * query.PageInfo.PageSize, query.GetOrderString());
                }
                else
                {
                    sql.AppendFormat("( {0} ) DERIVEDTBL WHERE {1} NOT IN (SELECT TOP {2} {1} FROM ( {0} ) DERIVEDTBL {3}) {3}", where, News.ID, (query.PageInfo.CurrentPage - 1) * query.PageInfo.PageSize, query.GetOrderString());
                }
                return sql.ToString();
            }
    private string GetNormalQueryWhereString(Hashtable table, ViewFlag viewType, PubAccount account,bool isSearch)
            {
                StringBuilder where = new StringBuilder();
                //时间限制语句
                string timeLimit = string.Format(" AND ((DATEPART(hour, GETDATE()) >= DATEPART(hour, {0}) AND  DATEPART(hour, GETDATE()) < DATEPART(hour, {1}))  OR {0} IS NULL ) ",News.STARTTIME,News.ENDTIME);
    
              
                where.Append(GetQueryWhereString(table, viewType,isSearch));
                //限制只获取审核过的新闻
                if (string.IsNullOrEmpty(where.ToString().Trim()))
                {
                    where.Append(News.AUDITSTATUS + " = 'Y' ");
                }
                else
                {
                    where.Append(" and " + News.AUDITSTATUS + " = 'Y' ");
                }
    
                if (account == null)
                {
                    if (string.IsNullOrEmpty(where.ToString().Trim()))
                    {
                        where.Append(News.PRIVILEGELEVEL + " = 0 ");
                    }
                    else
                    {
                        where.Append(" and " + News.PRIVILEGELEVEL + " = 0 ");
                    }
                    where.Append(timeLimit);
                    //sql =
                    return where.ToString();
                }
                else
                {
    
                    StringBuilder newWhere = new StringBuilder();
                    newWhere.AppendFormat("SELECT vod_news.* FROM vod_news WHERE ({0}<= {1}) ",News.PRIVILEGELEVEL,account.ac_privilegeLevel);
                    if (string.IsNullOrEmpty(where.ToString().Trim()))
                        newWhere.Append(timeLimit);//加上时间限制;
                    else
                        newWhere.Append(" and ").Append(where).Append(timeLimit);//加上时间限制;
                    //newWhere.Append(" union ");
                    //newWhere.Append(" SELECT vod_news.* FROM vod_news, vod_newsAccount WHERE ");
                    //newWhere.AppendFormat("({0} = 'Y' and ",News.INCLUDEFLAG);
                    //newWhere.AppendFormat(" {0}= {1} AND {2}='{3}'" ,News.ID,NewsAccount.NEWS,NewsAccount.ACCOUNT,account.ac_logid);
                    newWhere.Append(")");
                    if (string.IsNullOrEmpty(where.ToString().Trim()))
                        newWhere.Append(timeLimit);//加上时间限制;
                    else
                        newWhere.Append(" and ").Append(where).Append(timeLimit);//加上时间限制;
                    return newWhere.ToString();
                }
            }
    /// <summary>
            /// 获取查询语句
            /// </summary>
            /// <param name="table">保存查询的键值对</param>
            /// <param name="viewFlag">新闻分类的显示标志,即如果显示标志为Y,表示只能查询只能在前台显示的分类下的新闻</param>
            /// <param name="isSearch">是否是搜索查询</param>
            /// <returns></returns>
            private string GetQueryWhereString(Hashtable table, ViewFlag viewFlag,bool isSearch)
            {
                //SQLDALNewsClass newsClassDal = new SQLDALNewsClass();
                StringBuilder where = new StringBuilder();
                string sql = string.Empty;
                if (table == null || table.Count <= 0)
                    return "";
                IDictionaryEnumerator it = table.GetEnumerator();
                StringBuilder sb = new StringBuilder();
                switch (viewFlag)
                {
                    case ViewFlag.Y:
                        sb.AppendFormat(" {0}='{1}'", NewsClass.VIEWFLAG, "Y");
                        break;
                    case ViewFlag.N:
                        sb.AppendFormat(" {0}='{1}'", NewsClass.VIEWFLAG, "N");
                        break;
                    case ViewFlag.A:
                        sb.AppendFormat(" 1=1");
                        break;
                }
                bool isIncludeNewsClass = false;
                while (it.MoveNext())
                {
                    string obj = it.Key as string;
                    object key = it.Value;
                    if (!string.IsNullOrEmpty(obj))
                    {
                        switch (obj)
                        {
                            case News.NEWSCLASS:
                                if(isSearch)
                                    //where.AppendFormat(" AND {0} IN ( SELECT {1} FROM {2} WHERE {3} LIKE '%,{4},%' AND {5} AND {6}='Y' )", News.NEWSCLASS, NewsClass.ID, NewsClass.TABLENAME, NewsClass.NEWSCLASSFULLPATH, key, sb,NewsClass.ISCANBESEARCHED);
                                    where.AppendFormat(" AND {0} IN ( {1} )", News.NEWSCLASS, GetCanSearchNewsClassString(key.ToString()));
                                else
                                    //where.AppendFormat(" AND {0} IN ( SELECT {1} FROM {2} WHERE {3} LIKE '%,{4},%' AND {5} )",News.NEWSCLASS,NewsClass.ID,NewsClass.TABLENAME,NewsClass.NEWSCLASSFULLPATH,key,sb);
                                    where.AppendFormat(" AND {0} IN ( {1} )", News.NEWSCLASS, GetViewNewsClassString(key.ToString()));
                                isIncludeNewsClass = true;
                                break;
                            case News.SUBMITTIME:
                                where.AppendFormat(" AND convert(varchar(100),{0},120) like '%{1}%'", News.SUBMITTIME, key);
                                break;
                            case News.NEWSNO:
                                where.AppendFormat(" AND {0} = {1} ", News.NEWSNO, key);
                                break;
                            case News.SUBMITCOMPANY:
                                where.AppendFormat(" AND {0} = '{1}'", News.SUBMITCOMPANY, key);
                                break;
                            case News.PICTUREFILENAME:
                                if (key == null)
                                {
                                    where.AppendFormat(" AND (({0} IS NULL) OR ({0}='')) ", News.PICTUREFILENAME);
                                }
                                else
                                {
                                    where.AppendFormat(" AND (({0} IS NOT NULL) AND ({0}<>'')) ", News.PICTUREFILENAME);
                                }
                                break;
                            case NewsClass.INDEXNEWSDELAYDAYS:
                                int days = Convert.ToInt32(key);
                                if (days > -1)
                                {
                                    where.AppendFormat(" AND DATEDIFF(day,nws_submitTime,getdate())<={0}",days);
                                }
                                break;
                            case News.AUDITSTATUS:
                                where.AppendFormat(" AND {0}='{1}' ", News.AUDITSTATUS, key);
                                break;
                            default:
                                if (string.IsNullOrEmpty(key.ToString()))
                                    where.AppendFormat(" AND {0} is NULL", obj);
                                else
                                    where.AppendFormat(" AND {0} like '%{1}%'", obj, key);
                                break;
                        }
                    }
                }
                //如果是搜索所有的分类或者是查看所有的分类下的视频列表.
                if (isSearch)
                    where.AppendFormat(" AND {0} IN ( SELECT {1} FROM {2} WHERE {3}='Y' )", News.NEWSCLASS, NewsClass.ID, NewsClass.TABLENAME, NewsClass.ISCANBESEARCHED);
                else if(!isIncludeNewsClass)
                    where.AppendFormat(" AND {0} IN ( SELECT {1} FROM {2} WHERE {3})", News.NEWSCLASS, NewsClass.ID, NewsClass.TABLENAME, sb);
                string newWhere = where.ToString();
                if (!string.IsNullOrEmpty(newWhere) && newWhere.ToUpper().Trim().Substring(0, 3).Equals("AND"))
                { // 去掉最左边的and
                    newWhere = newWhere.Trim().Substring(3);
                }
                return newWhere;
            }
    




    主要的代码就是这些,是不是这个生成的SQL太复杂了导致出现这个。
    • 已编辑 maclessmjb 2009年4月17日 1:55 代码修改
    2009年4月17日 1:51

答案

全部回复

  • “通常发生在晚上11点半左右,而且过了大约半小时到一小时自己又恢复正常”,请检查数据库是不是运行计划任务。
    jon.valett@gmail.com
    2009年4月17日 1:53
    版主
  • “通常发生在晚上11点半左右,而且过了大约半小时到一小时自己又恢复正常”,请检查数据库是不是运行计划任务。
    jon.valett@gmail.com

    谢谢。但是没有设置任何计划任务啊。
    2009年4月17日 1:59
  • 换个机器来做数据库服务器测试看看,很多问题都是产生在没有问题的情况!建议楼主,先集中精力判断是不是数据库造成的,然后在考虑代码的问题。
    jon.valett@gmail.com
    2009年4月17日 2:02
    版主
  • 请确定一下"部署时候的内容"在数据库中有没有

    知识改变命运,奋斗成就人生!
    2009年4月17日 6:37
    版主
  • 是部署时候添加的内容。
    2009年4月17日 7:03
  • 如果数据库目前还有那部门异常的内容,则可能是SQL拼接部分有问题, 比如 NOT IN (...如果这里没有记录或记录少) 那异常数据就可有可能显示出来
    知识改变命运,奋斗成就人生!
    2009年4月17日 7:13
    版主
  • 你可以在你查询的条件上强制加上去除异常数据的条件试试看还会不会产生问题,如果不会那我的想法就通过了
    知识改变命运,奋斗成就人生!
    2009年4月17日 7:15
    版主
  • 如果数据库目前还有那部门异常的内容,则可能是SQL拼接部分有问题, 比如 NOT IN (...如果这里没有记录或记录少) 那异常数据就可有可能显示出来
    知识改变命运,奋斗成就人生!

    这个有道理。不过需要调试。我的分页代码里一般使用NOT IN,那有没有更好的方法呢?
    2009年4月17日 12:33
  • 暂时还没想到有,主要是这类问题不容易找到,还是用老办法慢慢排除
    知识改变命运,奋斗成就人生!
    2009年4月17日 12:35
    版主
  • 是我的SQL语句有点问题,临界点没有考虑到,所以就出现这个问题,谢谢大家的帮助
    • 已标记为答案 maclessmjb 2009年4月17日 17:22
    2009年4月17日 17:21