日期:2014-05-19  浏览次数:20392 次

急晕了的问题:::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;