说明:由于目前只能在本版每贴100分,如果问题解决,主要解决问题的朋友另开贴子给分,本贴顶者有份!!!
问题描述:
1、采用C#编写,SqlCommand+SqlDataReader查询和绑定。在本地运行浏览时没有错误。
2、在网站初期没有问题,但是过一会就会出现问题,再过一会又好了,如些反复.
3、出错问题提示如下:
读取列表时发生错误:Invalid attempt to FieldCount when reader is closed.看了所有的代码,没有发现哪个页面上有在关闭了SqlDataReader以后还尝试读取数据的。以下是所以页面的源代码,请大家帮我看看到底是哪里出错了,万分感谢!!!!
问题描述:
1、采用C#编写,SqlCommand+SqlDataReader查询和绑定。在本地运行浏览时没有错误。
2、在网站初期没有问题,但是过一会就会出现问题,再过一会又好了,如些反复.
3、出错问题提示如下:
读取列表时发生错误:Invalid attempt to FieldCount when reader is closed.看了所有的代码,没有发现哪个页面上有在关闭了SqlDataReader以后还尝试读取数据的。以下是所以页面的源代码,请大家帮我看看到底是哪里出错了,万分感谢!!!!
-====================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("<", "<");
str = str.Replace(">", ">");
str = str.Replace("'", "‘");
str = str.Replace("\"", "“");
str = str.Replace(" ", " ");
//str = str.Replace("\n\r", "<br>");
str = str.Replace("--", "--");
str = str.Replace("<%", "<%");
str = str.Replace("%>", "%>");
str = str.Replace("<?", "<?");
str = str.Replace("<!", "<!");
}
return str;
} public string DeCode(string str)
{
string newstr = str;
if (newstr != "")
{
newstr = newstr.Replace("‘", "'");
newstr = newstr.Replace("“", "\"");
newstr = newstr.Replace("<br>", "<br>");
newstr = newstr.Replace("--", "--");
newstr = newstr.Replace(" ", " ");
newstr = newstr.Replace("<", "<");
newstr = newstr.Replace(">", ">");
}
return newstr;
}
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 = " ";
strPrePage = " ";
}
if (lngP1 < lngPg)
{
strEnd = "<a href=\"?Page=" + lngPg.ToString() + strPage + "\" title=\"尾页\">尾页 ";
strNextPage = "<a href=\"?Page=" + (lngP1 + 1).ToString() + strPage + "\" title=\"下一页\">下一页</a> ";
}
else
{
strEnd = " </td>";
strNextPage = " ";
}
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();
}
}
}
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();
}
}
}
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结束
==================================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,看不出来是哪句出错,而且有时候是正常的,有时候就不行了。
==========================》》》》》》我都是把Repeater做为参数传递给clsPublic中的方法来实现数据绑定的,并没有直接返回SqlDataReader
cmd.ExecuteReader(CommandBehavior.CloseConnection);//这样应该就对了
================================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;
}
}
}
==================================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();
}
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结束
:Invalid attempt to FieldCount when reader is closed!
你应该把你所有的用到使用datareader数量的代码检查下!关闭是否在finally里面实现的!另外还有关闭的顺序是否合理!
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;
}
}
}
这里是怎么实现的?
如果代码里没有在reader关闭之前关闭connection的话,可能是多处引用了同一个connection实例,导致connection在其他地方被关闭了却正在读取reader的内容.clsDatabase.getConn();
得到的connection最好是新实例的.
: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();
}
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
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;
}}
这里是怎么实现的?
如果代码里没有在reader关闭之前关闭connection的话,可能是多处引用了同一个connection实例,导致connection在其他地方被关闭了却正在读取reader的内容.clsDatabase.getConn();
得到的connection最好是新实例的.==================
clsDatabase.cs文件我贴出来了,烦请帮我看一下,谢谢
这样可能导致你在一个页面上把他关闭了,而这个页面正在读数据.
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可以在此关闭
}
这样基本能解决问题,楼主可以单步调测,就可以发现在何处出现错误
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 这不就是问题所在嘛
所以,每次实例还是很有必要的.
你也可以每次只实例connection,reader等类.
=================================那么如果在绑定的时候出错的话,不是没有办法关闭SqlDataReader了吗?
这样基本能解决问题,楼主可以单步调测,就可以发现在何处出现错误
===============================
请问单步调测是怎么个调测法??谢谢 你上面用的是dr = cmd1.ExecuteReader();
关闭的却是dr1 这不就是问题所在嘛
==============================
已修改,正在测试看看还有没有错误.谢谢
所以,每次实例还是很有必要的.
你也可以每次只实例connection,reader等类.================================
是不是如果采用静态的连接方式,如果同一时间有两个人同时访问的话,就会出错?
我在clsDatabase.cs中的Connection就是新的实例,但是采用了static方法
像您这这么多代码,还有个调试的方法,您先把所有代码拷到记事本上,然后在.Net里只留1、2个类调试,通过后再加1、2 个类调试,直到全部通过
=====================>
public static SqlConnection getConn()
{
return new SqlConnection(strUserConn);
}
只是你要在每次执行完sql之后调用connection的close或者dispose
=====================
DataAdapter怎么样自动关闭链接?是在绑定发和以后吗出现这样错误的原因肯定是您的代码有误,电脑是不会乱报错的。
像您这这么多代码,还有个调试的方法,您先把所有代码拷到记事本上,然后在.Net里只留1、2个类调试,通过后再加1、2 个类调试,直到全部通过
==================
在本地测试的时候正常,而且也可以生成网站
=======================
你是指把数据库操作这一块单独写在一个cs文件中吗?然后返回DataReader?
再定义断点跟踪一下要注意的地方是 SqlConnection 和 SqlDataReader 在不用时及时关闭
给你打包票,问题肯定是在这个类里.
网页程序用静态的connection肯定会有问题.
不是举个列子 比如你的下面这段代码
//更新点击
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语句的地方只要一句就够了
=======================
你是指把数据库操作这一块单独写在一个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
http://shop33881320.taobao.com/