我在asp.net开发方面相当新,所以你可以说我开发了一个编码不好的应用程序,它给了我这个错误。
超时已过期。从池中获取连接之前已经过了超时时间。
我尝试在google上搜索并发现它是因为应用程序池中未关闭的连接而发生的,所以我仔细检查了我的应用程序并使用关键字插入所有Sqlconnections,但我仍然遇到此问题,这里是我的应用程序的一些示例代码。所有Sql连接都包含在这样的using语句中。
using (Connection = new SqlConnection(CIPConnection))
{
string ReturnValue = String.Empty;
try
{
SqlDataReader Reader;
Connection.Open();
string CommandText = "SELECT * FROM Users WHERE NAME = @NAME AND PASSWORD = @PASSWORD";
Command = new SqlCommand(CommandText, Connection);
Command.Parameters.AddWithValue("@NAME", UserName);
Command.Parameters.AddWithValue("@PASSWORD", Password);
Reader = Command.ExecuteReader();
Reader.Read();
if (Reader.HasRows)
{
Session["ID"] = Reader["ID"];
Session["NAME"] = Reader["NAME"];
Session["DEPARTMENT"] = Reader["DEPARTMENT"];
switch (Reader["DEPARTMENT"].ToString())
{
case "Admin":
ReturnValue = "Admin";
break;
case "Editing":
ReturnValue = "Editing";
break;
case "Sales and Support":
ReturnValue = "Sales and Support";
break;
case "Writing":
ReturnValue = "Writing";
break;
default:
ReturnValue = "Sorry";
break;
}
}
}
catch (Exception exp)
{
Response.Write(exp.Message.ToString());
}
return ReturnValue;
}
现在我的问题是我是否需要在使用语句块时关闭Connection?什么是关闭连接的最佳方式? (把它放在finally块中?每个try语句?)我是否也应该使用带有SqlReader和SqlCommand的using语句?请告诉我摆脱未使用的连接的最佳方法,以便我可以解决这个问题。
感谢。
答案 0 :(得分:2)
问题可能与SqlDataReader
对象无关,而该对象未关闭。尝试using
阻止:
using (var Reader = Command.ExecuteReader())
{
作为旁注,如果没有找到行,Read
函数将返回false。所以你可以缩短它:
Reader.Read();
if (Reader.HasRows)
{
为:
if (Reader.Read())
{
答案 1 :(得分:0)
不,当它存在使用块时,它将Dispose,它将关闭并将其返回到池中。问题出在其他地方,或者你错过了一个。