读书人

急晕了的有关问题:asp在访问数据库时出

发布时间: 2011-12-29 22:09:38 作者: rapoo

急晕了的问题:::asp在访问数据库时出现连接超时错误,提示可能达到数据库连接的最大数
因为,页面上数据较多,全部提交保存的时候,对每一条数据都有个去数据库CHECK的步骤,就会出现如下错误:
タイムアウトにしました。プルから接を取得する前にタイムアウト期がぎました。プルされた接がすべて使用中で、プル サイズの制限にした可能性があります。
明 : 在の Web 要求を行中に、ハンドルされていない例外が生しました。エラにするおよび例外の生所については、スタック トレスを参照してください。

例外の: System.InvalidOperationException: タイムアウトにしました。プルから接を取得する前にタイムアウト期がぎました。プルされた接がすべて使用中で、プル サイズの制限にした可能性があります。

ソス エラ:


行 1649:if(conn != null && conn.State.Equals(ConnectionState.Closed))
行 1650:{
行 1651:conn.Open();
行 1652:}
行 1653:



以下是我写的程序
public int getDateDiff(DateTime startDate,DateTime endDate)
{

SqlDataReader reader = null;
int DiffMonth = 0;
try
{
string sql = "select datediff(month,@startDate,@endDate) from sysusers ";
SqlCommand sqlcmd = new SqlCommand(sql,conn);
sqlcmd.Parameters.Add( "@startDate ", SqlDbType.VarChar).Value = startDate;
sqlcmd.Parameters.Add( "@endDate ", SqlDbType.VarChar).Value = endDate;
if(conn != null && conn.State.Equals(ConnectionState.Closed))
{
conn.Open();
}

reader = sqlcmd.ExecuteReader();
if(reader.Read())
{
DiffMonth = reader.GetInt32(0);
}
return DiffMonth;

}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
return 0;
}
finally
{
if(reader!= null && !reader.IsClosed )
{
reader.Close();
}
conn.Close();
}
}

[解决办法]
肯定是之前的连接没有关闭
[解决办法]
把return 0去掉.
[解决办法]
同意楼上的,去掉return 0,因为这个return了,导致下面的代码无法执行,导致前面运行的conn都没有关闭掉

去掉return 0,重新启动系统再看看。
[解决办法]
return 都返回了,不会执行后面,con没有关闭
[解决办法]
return 不影响finally 吧
_____________________________
刚才没看到try里面有个return,应该是问题的所在了;

RETURN

Exits unconditionally from a query or procedure.
RETURN is immediate and complete and can be used at any point to exit from a procedure, batch, or statement block. Statements following RETURN are not executed.

[解决办法]
你没有贴出你创建数据库连接的代码。假设它定义为:

private SqlConnection 根据数据库链接字符串创建新的连接());

不考虑业务逻辑问题,那么你的程序应该写为:

public int getDateDiff(DateTime startDate,DateTime endDate)
{
try
{
using(SqlConnection conn=根据数据库链接字符串创建新的连接())
{
conn.Open();
int DiffMonth = 0;
string sql = "select datediff(month,@startDate,@endDate) from sysusers ";
SqlCommand sqlcmd = new SqlCommand(sql,conn);
sqlcmd.Parameters.Add( "@startDate ", SqlDbType.VarChar).Value = startDate;
sqlcmd.Parameters.Add( "@endDate ", SqlDbType.VarChar).Value = endDate;


using(SqlDataReader reader = sqlcmd.ExecuteReader())
{
if(reader.Read())
return reader.GetInt32(0);
else
return 0;
}
}
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}

“根据数据库链接字符串创建新的连接”会很慢么?这是不知道SQL Server引擎有连接池的。只要数据库连接串的值不改变,连接对象就可以准确和可靠地复用。你因为不知道怎样设计共享连接,所以才出错的。我们看到很多人说共享连接效率如何如何,可是sql server引擎已经具有连接池功能了他不知道,反而去自己胡写一个conn共享,这是多余的。
[解决办法]
从逻辑上,计算两个时间的差距要调用数据库去计算,你实在是太奢侈了。不过我这里不过多评论你这种过家家编程的习惯。

我要说明的是,你对conn的设计是过于聪明,结果制造了烦恼的。sql server的连接对象具有连接池功能,所以你应该在每一个线程内操作数据时都创建一个新的连接对象,并且不需要时尽早关闭。
[解决办法]
另外,使用using{}语法结构来处理数据库连接和DBDataReader,程序员不用去纠缠于哪一个代码是否关闭了它们的问题,程序员没有必要写conn.close或者reader.close代码,因此不需要承担更大责任。应该推荐或者强制使用这种语法结构去写代码。
[解决办法]
sp1234(嘿嘿) ( ) 信誉:98 Blog 加为好友 2007-4-28 13:17:08 得分: 0



另外,使用using{}语法结构来处理数据库连接和DBDataReader,程序员不用去纠缠于哪一个代码是否关闭了它们的问题,程序员没有必要写conn.close或者reader.close代码,因此不需要承担更大责任。应该推荐或者强制使用这种语法结构去写代码。



这个举双手赞成!
[解决办法]
另外,使用using{}语法结构来处理数据库连接和DBDataReader,程序员不用去纠缠于哪一个代码是否关闭了它们的问题,程序员没有必要写conn.close或者reader.close代码,因此不需要承担更大责任。应该推荐或者强制使用这种语法结构去写代码。
==========================================================================

同意

读书人网 >asp.net

热点推荐