说明:由于目前只能在本版每贴100分,如果问题解决,主要解决问题的朋友另开贴子给分,本贴顶者有份!!!
问题描述:
1、采用C#编写,SqlCommand+SqlDataReader查询和绑定。在本地运行浏览时没有错误。
2、在网站初期没有问题,但是过一会就会出现问题,再过一会又好了,如些反复.
3、出错问题提示如下:
读取列表时发生错误:Invalid attempt to FieldCount when reader is closed.看了所有的代码,没有发现哪个页面上有在关闭了SqlDataReader以后还尝试读取数据的。以下是所以页面的源代码,请大家帮我看看到底是哪里出错了,万分感谢!!!!

解决方案 »

  1.   

    clsPublic.cs文件
    -====================using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing;/// <summary>
    /// clsPublic 的摘要说明
    /// </summary>
    public class clsPublic
    {
        public long lngRsCount = 0, lngPgCount = 0, lngPage = 1;
        public string strPageList = "";
        public clsPublic()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        public string ReplaceColor(string strColor, string strStr1, string strK)
        {
            return strStr1.Replace(strK, "<font color=\"" + strColor + "\">" + strK + "</font>");
        }
        public bool IsLogin()
        {
            if (HttpContext.Current.Session["LYUserInfo"] != null)
            {
                return true;
            }
            else
            {
                if (CheckCookies())
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }    public bool IsAdminLogin()
        {
            if (HttpContext.Current.Session["PICAdmin"] != null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }    //验证cookies
        public bool CheckCookies()
        {
            bool isChecked = false;
            if (HttpContext.Current.Request.Browser.Cookies == true)
            {
                if (HttpContext.Current.Request.Cookies["CN5566_Com_UserInfo"] != null)
                {
                    string strUser = System.Web.HttpUtility.UrlDecode(HttpContext.Current.Request.Cookies["CN5566_Com_UserInfo"]["UserName"]);
                    string strPass = HttpContext.Current.Request.Cookies["CN5566_Com_UserInfo"]["UserPass"];
                    //返回用户信息,1用户名,2金钱,3经验,4等级,5信用
                    string strUserInfo = CheckUserInfo(strUser, strPass);
                    if (strUserInfo != "")
                    {
                        HttpContext.Current.Session["LYUserInfo"] = strUserInfo;
                        isChecked = true;
                    }
                }
            }
            return isChecked;
        }    //截取字符
        public string CheckLength(string s, int l)
        {
            if (s != null)
            {
                if (s.Length > l)
                {
                    s = s.Substring(0, l - 2) + "..";
                }
            }
            else
            {
                s = "";
            }
            return s;
        }    public string EnCode(string str)
        {
            if (str.Length > 0)
            {
                str = str.Replace("<", "&lt;");
                str = str.Replace(">", "&gt;");
                str = str.Replace("'", "‘");
                str = str.Replace("\"", "“");
                str = str.Replace(" ", "&nbsp;");
                //str = str.Replace("\n\r", "<br>");
                str = str.Replace("--", "--");
                str = str.Replace("&lt;%", "&lt;%");
                str = str.Replace("%&gt;", "%&gt;");
                str = str.Replace("<?", "&lt;?");
                str = str.Replace("<!", "&lt;!");
            }
            return str;
        }    public string DeCode(string str)
        {
            string newstr = str;
            if (newstr != "")
            {
                newstr = newstr.Replace("‘", "'");
                newstr = newstr.Replace("“", "\"");
                newstr = newstr.Replace("&lt;br&gt;", "<br>");
                newstr = newstr.Replace("--", "--");
                newstr = newstr.Replace("&nbsp;", " ");
                newstr = newstr.Replace("&lt;", "<");
                newstr = newstr.Replace("&gt;", ">");
            }
            return newstr;
        }
      

  2.   

    //判断是否为数字
        public long GetNum(string s, long lngSmall)
        {
            string pattern = @"^\d+$";
            if (Regex.IsMatch(s, pattern))
            {
                return Convert.ToInt64(s);
            }
            else
            {
                return lngSmall;
            }
        }    private long GetPageCount(long lngC, int intSZ)
        {
            if ((lngC % intSZ) > 0)
            {
                return lngC / intSZ + 1;
            }
            else
            {
                return lngC / intSZ;
            }
        }    //获取贴子列表:lngP1,当前页,lngPg总页数,intPL显示多少条链接页
        public string GetPageList(long lngP1, long lngPg, int intPL, string strPage)
        {
            string strFirst;
            string strEnd;
            string strPreList;
            string strNextList;
            string strPageList = "";
            string strPrePage;
            string strNextPage;
            long lngStartPage;
            long lngEndPage;
            long i;
            string strPage1;
            if (lngP1 > 1)
            {
                strFirst = "<a href=\"?Page=1" + strPage + "\" title=\"首页\">首页</a> ";
                strPrePage = "<a href=\"?Page=" + (lngP1 - 1).ToString() + strPage + "\" title=\"上一页\">上一页</a> ";
            }
            else
            {
                strFirst = "&nbsp; ";
                strPrePage = "&nbsp; ";
            }
            if (lngP1 < lngPg)
            {
                strEnd = "<a href=\"?Page=" + lngPg.ToString() + strPage + "\" title=\"尾页\">尾页 ";
                strNextPage = "<a href=\"?Page=" + (lngP1 + 1).ToString() + strPage + "\" title=\"下一页\">下一页</a> ";
            }
            else
            {
                strEnd = "&nbsp;</td>";
                strNextPage = "&nbsp; ";
            }
            if (lngP1 > intPL)
            {
                lngStartPage = lngP1 - intPL;
            }
            else
            {
                lngStartPage = 1;
            }
            if (lngPg - lngP1 > intPL)
            {
                lngEndPage = lngP1 + intPL + 1;
            }
            else
            {
                lngEndPage = lngPg + 1;
            }
            for (i = lngStartPage; i < lngP1; i++)
            {
                strPage1 = i.ToString();
                strPageList += "<a href=\"?Page=" + strPage1 + strPage + "\" title=\"第" + strPage1 + "页\">" + strPage1 + "</a> ";
            }
            strPageList += "<strong><font color=\"red\">" + lngP1.ToString() + "</font></strong> ";
            for (i = lngP1 + 1; i < lngEndPage; i++)
            {
                strPage1 = i.ToString();
                strPageList += "<a href=\"?Page=" + strPage1 + strPage + "\" title=\"第" + strPage1 + "页\">" + strPage1 + "</a> ";
            }
            return strFirst + strPrePage + strPageList + strNextPage + strEnd;
        }    //验证用户信息
        public string CheckUserInfo(string strN, string strP)
        {
            if (strN == "" || strP == "")
            {
                return "";
            }
            else
            {
                string strReturn = "";
                SqlDataReader dr = null;
                SqlCommand cmd = new SqlCommand();
                string strSQL = "Select Top 1 UserID,UserName From Dv_User Where UserName='" + strN + "' And UserPassword='" + strP + "'";
                try
                {
                    cmd.CommandText = strSQL;
                    cmd.Connection = clsDatabase.getUserConn();
                    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    using (dr)
                    {
                        if (dr.Read())
                        {
                            strReturn = dr.GetInt32(0).ToString() + "|" + dr.GetString(1).ToString();// +"====================" + dr.GetInt32(1).ToString() + "====================" + dr.GetInt32(2).ToString() + "====================" + dr.GetInt32(3).ToString() + "====================" + dr.GetInt32(4).ToString();
                        }
                    }
                }
                catch (Exception err)
                {
                    HttpContext.Current.Response.Write("验证用户信息时发生错误:" + err.Message);
                    AddErrorMessage(err.Message, err.Source, err.TargetSite.Name.ToString());
                }
                finally
                {
                    if (dr != null)
                    {
                        dr.Close();
                        dr.Dispose();
                    }
                    clsDatabase.CloseDB();
                }
                return strReturn;
            }
        }    //获取用户信息
        public string GetUserInfo(int s)
        {
            string strUID = "", strUName = "";
            if (IsLogin())
            {
                string[] arrInfo = HttpContext.Current.Session["LYUserInfo"].ToString().Split('|');
                strUID = arrInfo[0].ToString();
                strUName = arrInfo[1].ToString();
            }
            if (s == 0)
            {
                return strUID;
            }
            else
            {
                return strUName;
            }
        }    //获取图片列表
        public void GetClassPhotoList(int intClassID, Repeater rpt, int intListNum, int intTop)
        {
            SqlCommand cmd = new SqlCommand();
            if (HttpContext.Current.Request.QueryString["Page"] != null)
            {
                lngPage = GetNum(HttpContext.Current.Request.QueryString["Page"].ToString(), 1);
            }
            else
            {
                lngPage = 1;
            }
            //计算总记录数
            try
            {
                cmd.CommandText = "Select Count(fdPID) as CID From tb_ClassPicINfo Where fdClass=" + intClassID;
                cmd.Connection = clsDatabase.getConn();
                if (cmd.ExecuteScalar() != null)
                {
                    lngRsCount = Convert.ToInt64(cmd.ExecuteScalar());
                    lngPgCount = GetPageCount(lngRsCount, intTop);
                    if (lngPage > lngPgCount) lngPage = lngPgCount;
                    strPageList = this.GetPageList(lngPage, lngPgCount, 5, "");
                }
                else
                {
                    lngRsCount = 0;
                }
            }
            catch (Exception err1)
            {
                HttpContext.Current.Response.Write("计算记录条数时发生错误:" + err1.Message);
                AddErrorMessage(err1.Message, err1.Source, err1.TargetSite.Name.ToString());
            }
            finally
            {
                cmd.Dispose();
                clsDatabase.CloseDB();
            }
            //获取列表记录
            if (lngRsCount > 0)
            {
                int intTmp = 30;
                if (lngPage == lngPgCount)
                {
                    int intTmp1 = Convert.ToInt32(lngRsCount) % intTop;
                    if (intTmp1 > 0)
                    {
                        intTmp = intTmp1;
                    }
                }            SqlCommand cmd1 = new SqlCommand();
                SqlDataReader dr = null;
                try
                {
                    cmd1.Connection = clsDatabase.getConn();
                    cmd1.CommandText = "Select Top " + intTmp + " fdPID,fdTitle,fdAlt,fdPicUrl,fdClass From tb_ClassPicInfo WHERE fdPID NOT IN(Select TOP " + intTmp * (lngPage - 1) + " fdPID From tb_ClassPicInfo Where fdClass=" + intClassID + " Order By fdPID DESC) And fdClass=" + intClassID + " Order By fdPID DESC";
                    dr = cmd1.ExecuteReader();
                    rpt.DataSource = dr;
                    rpt.DataBind();
                }
                catch (Exception err2)
                {
                    HttpContext.Current.Response.Write("读取列表时发生错误:" + err2.Message);
                    AddErrorMessage(err2.Message, err2.Source, err2.TargetSite.Name.ToString());
                }
                finally
                {
                    cmd1.Dispose();
                    if (dr != null)
                    {
                        dr.Close();
                        dr.Dispose();
                    }
                    clsDatabase.CloseDB();
                    rpt.Dispose();
                }
            }
        }
      

  3.   

    //首页栏目最新列表
        public void GetIndexPhotoList(int intClassID1, Repeater rpt1, int intTop1)
        {
            SqlCommand cmd = new SqlCommand();
            SqlDataReader dr = null;
            try
            {
                cmd.Connection = clsDatabase.getConn();
                cmd.CommandText = "Select TOP " + intTop1 + " fdPID,fdPicUrl,fdTitle,fdClass,fdAlt From tb_ClassPicInfo Where fdClass=" + intClassID1 + " Order By fdPID Desc";
                dr = cmd.ExecuteReader();
                rpt1.DataSource = dr;
                rpt1.DataBind();
            }
            catch (Exception err1)
            {
                HttpContext.Current.Response.Write("读取列表时发生错误:" + err1.Message);
                AddErrorMessage(err1.Message, err1.Source, err1.TargetSite.Name.ToString());
            }
            finally
            {
                cmd.Dispose();
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                clsDatabase.CloseDB();
                rpt1.Dispose();
            }
        }    //栏目热点
        public void GetHotsPhotoList(int intClassID2, Repeater rpt2, int intTop2)
        {
            SqlCommand cmd = new SqlCommand();
            SqlDataReader dr = null;
            try
            {
                cmd.Connection = clsDatabase.getConn();
                if (intClassID2 > -1)
                {
                    cmd.CommandText = "Select TOP " + intTop2 + " fdPID,fdPicUrl,fdTitle,fdClass,fdAlt From tb_ClassPicInfo Where fdClass=" + intClassID2 + " Order By fdClick Desc,fdPID Desc";
                }
                else
                {
                    cmd.CommandText = "Select TOP " + intTop2 + " fdPID,fdPicUrl,fdTitle,fdClass,fdAlt From tb_ClassPicInfo Order By fdClick Desc,fdPID Desc";
                }
                dr = cmd.ExecuteReader();
                rpt2.DataSource = dr;
                rpt2.DataBind();
            }
            catch (Exception err1)
            {
                HttpContext.Current.Response.Write("读取列表时发生错误:" + err1.Message);
                AddErrorMessage(err1.Message, err1.Source, err1.TargetSite.Name.ToString());
            }
            finally
            {
                cmd.Dispose();
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                clsDatabase.CloseDB();
                rpt2.Dispose();
            }
        }    //获取首页推荐图片
        public void GetIndexRecommendList(Repeater rpt3, int intTop3)
        {
            SqlCommand cmd = new SqlCommand();
            SqlDataReader dr = null;
            try
            {
                cmd.Connection = clsDatabase.getConn();
                cmd.CommandText = "Select TOP " + intTop3 + " fdPID,fdPicUrl,fdTitle,fdClass,fdAlt From tb_ClassPicInfo Order By NewID()";
                dr = cmd.ExecuteReader();
                rpt3.DataSource = dr;
                rpt3.DataBind();
            }
            catch (Exception err1)
            {
                HttpContext.Current.Response.Write("读取列表时发生错误:" + err1.Message);
                AddErrorMessage(err1.Message, err1.Source, err1.TargetSite.Name.ToString());
            }
            finally
            {
                cmd.Dispose();
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                clsDatabase.CloseDB();
                rpt3.Dispose();
            }
        }    //获取搜索列表
        public void GetSearchList(Repeater rpt4, int intListNum4, int intTop4, string strK)
        {
            string strSQL1 = "Select Count(fdPID) as CID from tb_ClassPicInfo Where fdAlt like '%" + strK + "%'";
            SqlCommand cmd = new SqlCommand();
            if (HttpContext.Current.Request.QueryString["Page"] != null)
            {
                lngPage = GetNum(HttpContext.Current.Request.QueryString["Page"].ToString(), 1);
            }
            else
            {
                lngPage = 1;
            }
            //计算总记录数
            try
            {
                cmd.CommandText = strSQL1;
                cmd.Connection = clsDatabase.getConn();
                if (cmd.ExecuteScalar() != null)
                {
                    lngRsCount = Convert.ToInt64(cmd.ExecuteScalar());
                    lngPgCount = GetPageCount(lngRsCount, intTop4);
                    if (lngPage > lngPgCount) lngPage = lngPgCount;
                    strPageList = this.GetPageList(lngPage, lngPgCount, 5, "&key="+strK);
                }
                else
                {
                    lngRsCount = 0;
                }
            }
            catch (Exception err1)
            {
                HttpContext.Current.Response.Write("计算记录条数时发生错误:" + err1.Message);
                AddErrorMessage(err1.Message, err1.Source, err1.TargetSite.Name.ToString());
            }
            finally
            {
                cmd.Dispose();
                clsDatabase.CloseDB();
            }
            //获取列表记录
            if (lngRsCount > 0)
            {
                int intTmp = 30;
                if (lngPage == lngPgCount)
                {
                    int intTmp1 = Convert.ToInt32(lngRsCount) % intTop4;
                    if (intTmp1 > 0)
                    {
                        intTmp = intTmp1;
                    }
                }
                string strSQL = "Select Top " + intTmp + " fdPID,fdTitle,fdAlt,fdPicUrl,fdClass From tb_ClassPicInfo WHERE fdPID NOT IN(Select TOP " + intTmp * (lngPage - 1) + " fdPID From tb_ClassPicInfo Where fdAlt like '%" + strK + "%' order by fdPID Desc) And fdAlt like '%" + strK + "%' Order By fdPID DESC";            SqlCommand cmd1 = new SqlCommand();
                SqlDataReader dr = null;            try
                {
                    cmd1.Connection = clsDatabase.getConn();
                    cmd1.CommandText = strSQL;
                    dr = cmd1.ExecuteReader();
                    rpt4.DataSource = dr;
                    rpt4.DataBind();
                }
                catch (Exception err2)
                {
                    HttpContext.Current.Response.Write("读取列表时发生错误:" + err2.Message);
                    AddErrorMessage(err2.Message, err2.Source, err2.TargetSite.Name.ToString());
                }
                finally
                {
                    cmd1.Dispose();
                    if (dr != null)
                    {
                        dr.Close();
                        dr.Dispose();
                    }
                    clsDatabase.CloseDB();
                    rpt4.Dispose();
                }
            }
        }
      

  4.   

    //获取底部随机列表
        public void GetRandomList(int intTop5, Repeater rpt5)
        {
            SqlCommand cmd = new SqlCommand();
            SqlDataReader dr = null;
            try
            {
                cmd.Connection = clsDatabase.getConn();
                cmd.CommandText = "Select TOP " + intTop5 + " fdPID,fdPicUrl,fdTitle,fdClass,fdAlt From tb_ClassPicInfo Order By NewID()";
                dr = cmd.ExecuteReader();
                rpt5.DataSource = dr;
                rpt5.DataBind();
            }
            catch (Exception err1)
            {
                HttpContext.Current.Response.Write("读取随机推出列表时发生错误:" + err1.Message);
                AddErrorMessage(err1.Message, err1.Source, err1.TargetSite.Name.ToString());
            }
            finally
            {
                cmd.Dispose();
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                clsDatabase.CloseDB();
                rpt5.Dispose();
            }
        }
        //获取分类名称
        public string GetClassName(int intC)
        {
            switch (intC)
            {
                case 0:
                    return "网友自拍";
                case 1:
                    return "性感美美";
                case 2:
                    return "人体艺术";
                case 3:
                    return "偷拍走光";
                case 4:
                    return "精美手办";
                case 5:
                    return "COSPLAY";
                case 6:
                    return "动漫壁纸";
                case 7:
                    return "军事历史";
                case 8:
                    return "时事新闻";
                case 9:
                    return "日本女优";
                case 10:
                    return "韩国女星";
                case 11:
                    return "港台女星";
                case 12:
                    return "欧美女星";
                case 13:
                    return "内地女星";
                case 14:
                    return "热辣组合";
                case 15:
                    return "日韩男星";
                case 16:
                    return "欧美男星";
                case 17:
                    return "中国男星";
                case 18:
                    return "八卦贴图";
                case 19:
                    return "明星壁纸";
                case 20:
                    return "广告壁纸";
                case 21:
                    return "影视壁纸";
                case 22:
                    return "风景壁纸";
                case 23:
                    return "五花八门";
                case 24:
                    return "动物壁纸";
                case 25:
                    return "花卉壁纸";
                case 26:
                    return "游戏壁纸";
                case 27:
                    return "QQ表情";
                case 28:
                    return "回帖专用";
                default:
                    return "";
            }
        }    public string GetUserIP()
        {
            string strUIP = "";
            if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
            {
                strUIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
            }
            else
            {
                strUIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
            }
            return strUIP;
        }    public string GetSavePath(string strFolder)
        {
            string strPath = HttpContext.Current.Server.MapPath("/");
            if(strPath.Substring(strPath.Length-1,1)!="\\") strPath+="\\";
            return strPath + strFolder;
        }
        public string GetTodayFolder(string strPath)
        {
            string strFolder = System.DateTime.Now.ToString("yyyyMMdd");
            if (!System.IO.Directory.Exists(strPath + "\\"+strFolder))
            {
                System.IO.Directory.CreateDirectory(strPath + "\\"+strFolder);
            }
            return strFolder;
        }    public string GetNewFileName()
        {
            Random rnd = new Random();
            string strTmp = rnd.Next().ToString();
            return System.DateTime.Now.Year.ToString()+System.DateTime.Now.Month.ToString()+System.DateTime.Now.Day.ToString()+strTmp;
        }    public void AddErrorMessage(string strMessage,string strSource,string strTargetSiteName)
        {    }
    }
    ==============================
    clsPublic.cs结束
      

  5.   

    也曾出现过类似问题,是在三层结构中出现的,在数据访问层中返回数据如果是SqlDataReader,直接用就会出现这样的问题,例如:数据访问层中获取数据的方法是GetDataReader(),直接用DAL.GetDataReader()["字段名"]就会出现这样的问题,而用System.Data.SqlDataReader dr = DAL.GetDataReader(),然后用dr["字段名"]就不会出现问题。
      

  6.   

    Default.aspx
    ==================================using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class images_Default : System.Web.UI.Page
    {
        public int intLoop = 0,intLoop1=0;
        public clsPublic Public = new clsPublic();
        protected void Page_Load(object sender, EventArgs e)
        {
            Public.GetIndexRecommendList(rptRecommend, 10);
            Public.GetHotsPhotoList(-1, rptHot, 11);
            Public.GetIndexPhotoList(0, rptZP, 13);
            Public.GetIndexPhotoList(1, rptMM, 13);
            Public.GetIndexPhotoList(2, rptRT, 13);
            Public.GetIndexPhotoList(3, rptTP, 13);
            Public.GetIndexPhotoList(9, rptRB, 13);
            Public.GetIndexPhotoList(8, rptSS, 13);
            Public.GetIndexPhotoList(18, rptBG, 13);
            Public.GetIndexPhotoList(14, rptRL, 13);
        }
    }
    ===============================\
    default.aspx结束楼主啊,你贴出是哪句出错啊。
    =================>>>>>
    我也不知道是哪句出错啊,我用了try catch,看不出来是哪句出错,而且有时候是正常的,有时候就不行了。
      

  7.   

    也曾出现过类似问题,是在三层结构中出现的,在数据访问层中返回数据如果是SqlDataReader,直接用就会出现这样的问题,例如:数据访问层中获取数据的方法是GetDataReader(),直接用DAL.GetDataReader()["字段名"]就会出现这样的问题,而用System.Data.SqlDataReader dr = DAL.GetDataReader(),然后用dr["字段名"]就不会出现问题。=================================>>>>>>>>>>>>
      

  8.   

    也曾出现过类似问题,是在三层结构中出现的,在数据访问层中返回数据如果是SqlDataReader,直接用就会出现这样的问题,例如:数据访问层中获取数据的方法是GetDataReader(),直接用DAL.GetDataReader()["字段名"]就会出现这样的问题,而用System.Data.SqlDataReader dr = DAL.GetDataReader(),然后用dr["字段名"]就不会出现问题。
    ==========================》》》》》》我都是把Repeater做为参数传递给clsPublic中的方法来实现数据绑定的,并没有直接返回SqlDataReader
      

  9.   

    我的妈啊,好长的代码.你用Reader要随时记得关闭,只有关闭了才能再打开!估计可能是你占用数据库连接没有关闭造成的!
    cmd.ExecuteReader(CommandBehavior.CloseConnection);//这样应该就对了
      

  10.   

    List.aspx
    ================================using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class List : System.Web.UI.Page
    {
        public string strClassName = "",strPageList="";
        public clsPublic Public = new clsPublic();
        public int intLoop = 0;
        public long lngPgCount = 0, lngPage = 0, lngRsCount=0;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int intClassID = 0;
                if (Request.QueryString["B"] != null)
                {
                    intClassID = Convert.ToInt32(Public.GetNum(Request.QueryString["B"].ToString(), 0));
                }
                strClassName = Public.GetClassName(intClassID);
                Public.GetClassPhotoList(intClassID, rptList, 6, 30);
                Public.GetHotsPhotoList(intClassID, rptHot, 20);
                lngPage = Public.lngPage;
                lngPgCount = Public.lngPgCount;
                lngRsCount = Public.lngRsCount;
                strPageList = Public.strPageList;
            }
        }
    }
      

  11.   

    Info.aspx
    ==================================using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class Info : System.Web.UI.Page
    {
        public string strPicTitle = "",strContent="",strPageList="",strUBB="",strClassLink="",strNextLink="",strThisUrl="";
        public long lngPgCount = 0, lngPage = 1,lngCount=0;
        public int intID = 0,intClassID=0,intRecommendLoop=0;
        public clsPublic Public = new clsPublic();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //判断参数
                try
                {
                    intID = Convert.ToInt32(Request.QueryString["ID"]);
                    intClassID = Convert.ToInt32(Request.QueryString["B"]);
                }
                catch (Exception err)
                {
                    Response.Write("参数错误"+err.Message);
                    Response.End();
                }
                string strClassName = Public.GetClassName(intClassID);
                strThisUrl = clsSettings.strWebUrl + "/" + intClassID + "/" + intID + "/Info.aspx";
                strClassLink = "<a href=\"/" + intClassID + "/List.aspx\" title=\"" + strClassName + "\">" + strClassName + "</a>";
                if (Request.QueryString["Page"] != null)
                {
                    lngPage = Public.GetNum(Request.QueryString["Page"].ToString(), 1);
                }
                else
                {
                    lngPage = 1;
                }
                //更新点击
                SqlCommand cmdUpdate = new SqlCommand();
                try
                {
                    cmdUpdate.Connection = clsDatabase.getConn();
                    cmdUpdate.CommandText = "Update tb_ClassPicInfo Set fdClick=fdClick+1 where fdPID=" + intID;
                    cmdUpdate.ExecuteNonQuery();
                }
                catch(Exception err1){
                    Response.Write("更新统计时发生错误:"+err1.Message);
                }
                finally
                {
                    cmdUpdate.Dispose();
                    clsDatabase.CloseDB();
                }
                //下一条主题记录
                SqlCommand cmd = new SqlCommand();
                SqlDataReader dr = null;
                string strNNLink="";
                try{
                    cmd.CommandText="Select Top 1 fdAlt,fdPID From tb_ClassPicInfo Where fdPID<" + intID + " And fdClass=" + intClassID + " order by fdPID Desc";
                    cmd.Connection=clsDatabase.getConn();
                    dr=cmd.ExecuteReader();
                    if(dr.Read()){
                        string strNextTitle = dr.GetString(0).ToString();
                        int intNextID = dr.GetInt32(1);
                        strNextLink = "<a href=\"/" + intClassID + "/" + intNextID + "/Info.aspx\" title=\"" + strNextTitle + "\"><span style=\"color:red;\">下一篇同样精彩:" + strNextTitle + "</span></a>";
                        strNNLink="<a href=\"/" + intClassID + "/" + intNextID + "/Info.aspx\" title=\"" + strNextTitle + "\">{$Next$}</a>";
                    }
                    else
                    {
                        strNextLink = "<span style=\"color:red;\">没有下一篇了</span>";
                        strNNLink="";
                    }
                }
                catch (Exception err2)
                {
                    Response.Write("读取下一条主题记录时发生错误:" + err2.Message);
                }
                finally
                {
                    cmd.Dispose();
                    if (dr != null)
                    {
                        dr.Close();
                        dr.Dispose();
                    }
                    clsDatabase.CloseDB();
                }
      

  12.   

    //评论
                SqlCommand cmd1 = new SqlCommand();
                SqlDataReader dr1 = null;
                try
                {
                    cmd1.CommandText = "Select fdPostUser,fdPostTime,fdContent From tb_Review Where fdPID=" + intID;
                    cmd1.Connection = clsDatabase.getConn();
                    dr = cmd1.ExecuteReader();
                    rptComment.DataSource = dr;
                    rptComment.DataBind();
                }
                catch (Exception err3)
                {
                    Response.Write("读取评论时发生错误:" + err3.Message);
                }
                finally
                {
                    cmd1.Dispose();
                    if (dr1 != null)
                    {
                        dr1.Close();
                        dr1.Dispose();
                    }
                    clsDatabase.CloseDB();
                }
                //统计主题中共有多少张图片
                SqlCommand cmd2 = new SqlCommand();
                try
                {
                    cmd2.CommandText = "Select Count(fdID) as cid from tb_List Where fdParentID=" + intID;
                    cmd2.Connection = clsDatabase.getConn();
                    if (cmd2.ExecuteScalar() != null)
                    {
                        lngCount = Convert.ToInt64(cmd2.ExecuteScalar());
                    }
                    else
                    {
                        lngCount = 0;
                    }
                }
                catch(Exception err4){
                    Response.Write("统计主题记录时发生错误:"+err4.Message);
                }
                finally{
                    cmd2.Dispose();
                    clsDatabase.CloseDB();
                    strPageList = "第 ";
                    for (long i = 1; i < lngCount + 1; i++)
                    {
                        if (i == lngPage)
                        {
                            strPageList += "<font color=\"red\">" + i.ToString() + "</font> ";
                        }
                        else
                        {
                            strPageList += "<a href=\"/" + intClassID + "/" + intID + "/Info_" + i.ToString() + ".aspx\" title=\"第" + i.ToString() + "页\">" + i.ToString() + "</a> ";
                        }
                    }
                    strPageList += "页";
                    if (lngPage < 1) lngPage = 1;
                    if (lngPage > lngCount) lngPage = lngCount;
                }
                //显示图片
                SqlCommand cmd3=new SqlCommand();
                SqlDataReader dr3=null;
                string[] strTitle=new string[lngCount];
                string[] strContent1=new string[lngCount];
                string[] strPhotoUrl=new string[lngCount];
                int intLoop=0;
                try{
                    cmd3.Connection=clsDatabase.getConn();
                    cmd3.CommandText = "Select fdTitle,fdPhotoUrl,fdContent From tb_List Where fdParentID=" + intID + " Order BY fdID ASC";
                    dr3 = cmd3.ExecuteReader();
                    if (dr3.Read())
                    {
                        do
                        {
                            strTitle[intLoop] = dr3.GetString(0);
                            strPhotoUrl[intLoop] = dr3.GetString(1);
                            strContent1[intLoop] = Public.DeCode(dr3.GetString(2));
                            if (strUBB == "")
                            {
                                strUBB = "[IMG]http://pic.cn5566.com/Photo/" + strPhotoUrl[intLoop] + "[/IMG]";
                            }
                            else
                            {
                                strUBB+= "\n\r[IMG]http://pic.cn5566.com/Photo/" + strPhotoUrl[intLoop] + "[/IMG]";
                            }
                            intLoop++;
                        } while (dr3.Read());
                        strUBB += "\n\r" + strThisUrl + "";
                    }
                }
                catch (Exception err5)
                {
                    Response.Write("读取信息时发生错误:" + err5.Message);
                }
                finally
                {
                    cmd3.Dispose();
                    if (dr3 != null)
                    {
                        dr3.Close();
                        dr3.Dispose();
                    }
                    clsDatabase.CloseDB();
                    if (lngCount > 0)
                    {
                        if (lngPage < lngCount)
                        {
                            strContent = "<a href=\"Info_" + (lngPage + 1).ToString() + ".aspx\"><img src=\"/Photo/" + strPhotoUrl[lngPage - 1] + "\" border=\"0\" alt=\"" + strTitle[lngPage - 1] + "\"></a>";
                        }
                        else
                        {
                            strContent = strNNLink.Replace("{$Next$}", "<img src=\"/Photo/" + strPhotoUrl[lngPage - 1] + "\" border=\"0\" alt=\"" + strTitle[lngPage - 1] + "\">");
                        }
                        strContent += "<br><br>" + strContent1[lngPage - 1];
                        strPicTitle = strTitle[lngPage - 1];
                    }
                    else
                    {
                        string strErrSQL = "Select Count(fdPID) as cc From tb_NoPicList where fdPID=" + intID;
                        SqlCommand cmdErr = new SqlCommand();
                        try
                        {
                            cmdErr.Connection = clsDatabase.getConn();
                            cmdErr.CommandText = strErrSQL;
                            if (cmdErr.ExecuteScalar() != null)
                            {
                                int intErrCount = Convert.ToInt32(cmdErr.ExecuteScalar());
                                if (intErrCount == 0)
                                {
                                    strErrSQL = "insert into tb_NoPicList(fdPID,fdUrl) values ('" + intID + "','" + strThisUrl + "')";
                                    cmdErr.CommandText = strErrSQL;
                                    cmdErr.ExecuteNonQuery();
                                }
                            }
                        }
                        finally
                        {
                            cmdErr.Dispose();
                            clsDatabase.CloseDB();
                        }
                    }
                }
                //显示随机推荐
                Public.GetRandomList(12, rptRecommend);
            }
        }
    }=========================
    Info.aspx结束
      

  13.   

    贴这么多代码没有用的,通过你的抱错提示可以知道应该是你数据库访问出的问题!
    :Invalid attempt to FieldCount when reader is closed!
    你应该把你所有的用到使用datareader数量的代码检查下!关闭是否在finally里面实现的!另外还有关闭的顺序是否合理!
      

  14.   

    Search.aspx
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class Search : System.Web.UI.Page
    {
        public int intListLoop = 0;
        public long lngSearchCount=0,lngPage=0,lngPgCount=0;
        public string strPageList = "",strKey="";
        public clsPublic Public = new clsPublic();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["Page"] != null)
            {
                lngPage = Public.GetNum(Request.QueryString["Page"].ToString(), 1);
            }
            else
            {
                lngPage = 1;
            }
            if(Request.QueryString["key"]!=null){
                strKey = Public.EnCode(Request.QueryString["key"]);
                Public.GetSearchList(rptSearch,6,30,strKey);
                lngPage = Public.lngPage;
                lngPgCount = Public.lngPgCount;
                lngSearchCount = Public.lngRsCount;
                strPageList = Public.strPageList;
            }
        }
    }
      

  15.   

    clsDatabase.getConn();
    这里是怎么实现的?
    如果代码里没有在reader关闭之前关闭connection的话,可能是多处引用了同一个connection实例,导致connection在其他地方被关闭了却正在读取reader的内容.clsDatabase.getConn();
    得到的connection最好是新实例的.
      

  16.   

    贴这么多代码没有用的,通过你的抱错提示可以知道应该是你数据库访问出的问题!
    :Invalid attempt to FieldCount when reader is closed!
    你应该把你所有的用到使用datareader数量的代码检查下!关闭是否在finally里面实现的!另外还有关闭的顺序是否合理!
    =================================使用到DataReader的地方,我都在finally中加上了以下代码:        finally
            {
                cmd.Dispose();
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                clsDatabase.CloseDB();
                rpt5.Dispose();
            }
      

  17.   

    SqlCommand cmd1 = new SqlCommand();
                SqlDataReader dr1 = null;
                try
                {
                    cmd1.CommandText = "Select fdPostUser,fdPostTime,fdContent From tb_Review Where fdPID=" + intID;
                    cmd1.Connection = clsDatabase.getConn();
                    dr = cmd1.ExecuteReader();
                    rptComment.DataSource = dr;
                    rptComment.DataBind();
                }
                catch (Exception err3)
                {
                    Response.Write("读取评论时发生错误:" + err3.Message);
                }
                finally
                {
                    cmd1.Dispose();
                    if (dr1 != null)
                    {
                        dr1.Close();
                        dr1.Dispose();
                    }
                    clsDatabase.CloseDB();
                }
     你上面用的是dr = cmd1.ExecuteReader();
      关闭的却是dr1
      

  18.   

    clsDatabase.cs==============================
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;/// <summary>
    /// clsDatabase 的摘要说明
    /// </summary>
    public class clsDatabase
    {
        private static string strConn = "DATA SOURCE=(local);UID=用户名;PWD=密码;DATABASE=数据库";
        private static SqlConnection objConn = new SqlConnection();
        private static string strUserConn = "DATA SOURCE=用户名;UID=fucky;PWD=密码;DATABASE=数据库";
        private static SqlConnection UserConn = new SqlConnection();
        public clsDatabase()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
            //objConn=new SqlConnection(strConn);
        }
        //打开数据库
        public static void ConnectionDB()
        {
            if (objConn.State == 0)
            {
                try
                {
                    objConn.ConnectionString = strConn;
                    objConn.Open();
                }
                catch (Exception err)
                {
                    HttpContext.Current.Response.Write(err.Message);
                }
            }
        }
        //关闭数据库
        public static void CloseDB()
        {
            try
            {
                if (objConn.State > 0)
                {
                    objConn.Close();
                }
                objConn.Dispose();
                if (UserConn.State > 0)
                {
                    UserConn.Close();
                }
                UserConn.Dispose();
            }
            catch (Exception err)
            {
                HttpContext.Current.Response.Write(err.Message);
            }
        }
        //数据库对像Conn
        public static SqlConnection getConn()
        {
            if (objConn.State == 0)
            {
                ConnectionDB();
            }
            return objConn;
        }    public static void ConnectionUserDB()
        {        if (UserConn.State == 0)
            {
                UserConn.ConnectionString = strUserConn;
                UserConn.Open();
            }
        }    public static SqlConnection getUserConn()
        {
            if (UserConn.State == 0)
            {
                ConnectionUserDB();
            }
            return UserConn;
        }}
      

  19.   

    这种问题确实很头疼,建议你还是用dataset吧,不会比datareader多费多少资源的
      

  20.   

    clsDatabase.getConn();
    这里是怎么实现的?
    如果代码里没有在reader关闭之前关闭connection的话,可能是多处引用了同一个connection实例,导致connection在其他地方被关闭了却正在读取reader的内容.clsDatabase.getConn();
    得到的connection最好是新实例的.==================
    clsDatabase.cs文件我贴出来了,烦请帮我看一下,谢谢
      

  21.   

    这种问题确实很头疼,建议你还是用dataset吧,不会比datareader多费多少资源的===================我改过一遍dataset了,还是出错....只好又改回来了
      

  22.   

    如果你的connection会在多个页面,可能同时被使用到,就不要用static的connection.
    这样可能导致你在一个页面上把他关闭了,而这个页面正在读数据.
      

  23.   

    不要用静态的connection============================那应该怎么样呢?每次连接的时候,重新初始化一个clsDatabase吗?这样对服务器的负担重不重?自己写的class,用完以后,如何释放掉?
      

  24.   

    建议修改Try结构,对DataReader的操作,在何处Read,就在何处Close如:
      try
                {
                    cmd.CommandText = strSQL;
                    cmd.Connection = clsDatabase.getUserConn();
                    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    using (dr)
                    {
                        if (dr.Read())
                        {
                            strReturn = dr.GetInt32(0).ToString() + "|" + dr.GetString(1).ToString();// +"====================" + dr.GetInt32(1).ToString() + "====================" + dr.GetInt32(2).ToString() + "====================" + dr.GetInt32(3).ToString() + "====================" + dr.GetInt32(4).ToString();
                        //*******如此处关闭
                        dr.Close()
                        }
                    }
                }
                catch (Exception err)
                {
                    HttpContext.Current.Response.Write("验证用户信息时发生错误:" + err.Message);
                    AddErrorMessage(err.Message, err.Source, err.TargetSite.Name.ToString());
                }
                finally
                {
                    clsDatabase.CloseDB();
                    //Database可以在此关闭
                }
    这样基本能解决问题,楼主可以单步调测,就可以发现在何处出现错误
      

  25.   

    SqlCommand cmd1 = new SqlCommand();
                SqlDataReader dr1 = null;
                try
                {
                    cmd1.CommandText = "Select fdPostUser,fdPostTime,fdContent From tb_Review Where fdPID=" + intID;
                    cmd1.Connection = clsDatabase.getConn();
                    dr = cmd1.ExecuteReader();
                    rptComment.DataSource = dr;
                    rptComment.DataBind();
                }
                catch (Exception err3)
                {
                    Response.Write("读取评论时发生错误:" + err3.Message);
                }
                finally
                {
                    cmd1.Dispose();
                    if (dr1 != null)
                    {
                        dr1.Close();
                        dr1.Dispose();
                    }
                    clsDatabase.CloseDB();
                }
     你上面用的是dr = cmd1.ExecuteReader();
      关闭的却是dr1 这不就是问题所在嘛
      

  26.   

    你要保证你当前正在使用的实例不会在别的地方被同时使用到.
    所以,每次实例还是很有必要的.
    你也可以每次只实例connection,reader等类.
      

  27.   

    建议修改Try结构,对DataReader的操作,在何处Read,就在何处Close如:
    =================================那么如果在绑定的时候出错的话,不是没有办法关闭SqlDataReader了吗?
    这样基本能解决问题,楼主可以单步调测,就可以发现在何处出现错误
    ===============================
    请问单步调测是怎么个调测法??谢谢 你上面用的是dr = cmd1.ExecuteReader();
      关闭的却是dr1 这不就是问题所在嘛
    ==============================
    已修改,正在测试看看还有没有错误.谢谢
      

  28.   

    你要保证你当前正在使用的实例不会在别的地方被同时使用到.
    所以,每次实例还是很有必要的.
    你也可以每次只实例connection,reader等类.================================
    是不是如果采用静态的连接方式,如果同一时间有两个人同时访问的话,就会出错?
    我在clsDatabase.cs中的Connection就是新的实例,但是采用了static方法
      

  29.   

    其实你也可以通过dataadapter读取数据库的这样还不用考虑连接的关闭与否。
      

  30.   

    出现这样错误的原因肯定是您的代码有误,电脑是不会乱报错的。
    像您这这么多代码,还有个调试的方法,您先把所有代码拷到记事本上,然后在.Net里只留1、2个类调试,通过后再加1、2 个类调试,直到全部通过
      

  31.   

    private static SqlConnection objConn = new SqlConnection();
    =====================>
     public static SqlConnection getConn()
        {
         return new SqlConnection(strUserConn);
        }
    只是你要在每次执行完sql之后调用connection的close或者dispose
      

  32.   

    不管是公有还是私有的static字段都会被保存,不管你是否实例化了包含这个字段的类.
      

  33.   

    其实你也可以通过dataadapter读取数据库的这样还不用考虑连接的关闭与否。
    =====================
    DataAdapter怎么样自动关闭链接?是在绑定发和以后吗出现这样错误的原因肯定是您的代码有误,电脑是不会乱报错的。
    像您这这么多代码,还有个调试的方法,您先把所有代码拷到记事本上,然后在.Net里只留1、2个类调试,通过后再加1、2 个类调试,直到全部通过
    ==================
    在本地测试的时候正常,而且也可以生成网站
      

  34.   

    建议你学习一下分层。。把数据访问层封装起来代码重复的太多了头痛啊
    =======================
    你是指把数据库操作这一块单独写在一个cs文件中吗?然后返回DataReader?
      

  35.   

    不需要贴这么多代码吧,也没多少人真正的去看这么多代码首先要抓住出现问题的源头,是某一个页面出现这种情况还是大多数页面这样
    再定义断点跟踪一下要注意的地方是 SqlConnection 和 SqlDataReader 在不用时及时关闭
      

  36.   

    clsDatabase.cs
    给你打包票,问题肯定是在这个类里.
    网页程序用静态的connection肯定会有问题.
      

  37.   

    你是指把数据库操作这一块单独写在一个cs文件中吗?然后返回DataReader?
    不是举个列子 比如你的下面这段代码
     //更新点击
                SqlCommand cmdUpdate = new SqlCommand();
                try
                {
                    cmdUpdate.Connection = clsDatabase.getConn();
                    cmdUpdate.CommandText = "Update tb_ClassPicInfo Set fdClick=fdClick+1 where fdPID=" + intID;
                    cmdUpdate.ExecuteNonQuery();
                }
                catch(Exception err1){
                    Response.Write("更新统计时发生错误:"+err1.Message);
                }
                finally
                {
                    cmdUpdate.Dispose();
                    clsDatabase.CloseDB();
                }
    可以最简单的封装成 UpdateSql(string sql)
    {
    SqlCommand cmdUpdate = new SqlCommand();
                try
                {
                    cmdUpdate.Connection = clsDatabase.getConn();
                    cmdUpdate.CommandText = sql;
                    cmdUpdate.ExecuteNonQuery();
                }
                catch(Exception err1){
                    Response.Write("更新统计时发生错误:"+err1.Message);
                }
                finally
                {
                    cmdUpdate.Dispose();
                    clsDatabase.CloseDB();
                }
    }
    以后你任何执行sql语句的地方只要一句就够了
      

  38.   

    建议你学习一下分层。。把数据访问层封装起来代码重复的太多了头痛啊
    =======================
    你是指把数据库操作这一块单独写在一个cs文件中吗?然后返回DataReader?
      

  39.   

    你是指把数据库操作这一块单独写在一个cs文件中吗?然后返回DataReader?
    这个也是可以的
    #region 获取自定义sql语句的DataReader
    /// <summary>
    /// 获取DataReader
    /// </summary>
    /// <returns>DataReader</returns>
    public DataReader GetDataReaderBySql(string sql)
    {
     SqlCommand cmd = new SqlCommand();
                SqlDataReader dr = null;
                string strNNLink="";
                try{
                    cmd.CommandText=sql;
                    cmd.Connection=clsDatabase.getConn();
                    dr=cmd.ExecuteReader(); return dr;
    }
    #endregion
      

  40.   

    clsDatabase.getUserConn();楼主这种静态保存的做法不行,静态方法那是全局的,楼主又没有使用同步算法,造成不可预见的问题是正常的,对于像数据库连接这样宝贵的资源,这种方法绝对不可行,最好用连接池技术楼主必须将这种做法去除,否则问题将依旧
      

  41.   

    插播一条广告,小店新开张,优惠出售各种手工艺品,欢迎大家选购,是各位帅哥送女朋友、老婆、情人(OR各位美女送男朋友、老公、情人)的不二选择
    http://shop33881320.taobao.com/