C# 超时已过期
我正在编写C#代码,并使用LINQ和一些存储过程,我在打开和关闭连接时非常小心,但我一直遇到这个错误C# 超时已过期,c#,linq,stored-procedures,timeoutexception,C#,Linq,Stored Procedures,Timeoutexception,我正在编写C#代码,并使用LINQ和一些存储过程,我在打开和关闭连接时非常小心,但我一直遇到这个错误 Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached. 我的代码运行
Timeout expired.
The timeout period elapsed prior to obtaining a connection from the pool.
This may have occurred because all pooled connections were in use and max pool size was reached.
我的代码运行良好,除了出现此错误,我能做些什么
谢谢你的建议
public static List<int> GetIslemIdleribySPbyCariId(int cariId)
{
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connString);
sqlConn.Open();
List<int> islemidleri = new List<int>();
islemidleri.Clear();
SqlCommand cmd;
cmd = new SqlCommand("GetIslemIdleri", sqlConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@CARIID", cariId));
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
islemidleri.Add(reader.GetInt32(0));
}
cmd.Parameters.Clear();
}
sqlConn.Close();
return islemidleri;
}
/// <summary>
/// SP kullanarak dovizturlerini döndürür
/// </summary>
/// <returns>string listesi döndürür için döviz türleri var TL, USD vs.</returns>
public static List<string> GetDovizTurleribySP()
{
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString;
SqlConnection sqlConn = new SqlConnection(connString);
sqlConn.Open();
List<string> dovizTanimlari = new List<string>();
string commandGetDovizTanimlari = "EXEC GetDovizTanimlari";
SqlCommand cmd;
cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
dovizTanimlari.Add(reader.GetString(0));
}
}
return dovizTanimlari;
}
公共静态列表getIsleMidlePropertySpByCariID(int-cariId)
{
string connString=System.Configuration.ConfigurationManager.ConnectionString[“LocalSqlServer1”].ConnectionString;
SqlConnection sqlConn=新的SqlConnection(connString);
sqlConn.Open();
List islemidleri=新列表();
islemidleri.Clear();
SqlCommand命令cmd;
cmd=新的SqlCommand(“GetIslemIdleri”,sqlConn);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(新的SqlParameter(“@carid”,carid));
使用(var reader=cmd.ExecuteReader())
{
while(reader.Read())
{
islemidleri.Add(reader.GetInt32(0));
}
cmd.Parameters.Clear();
}
sqlConn.Close();
返回islemidleri;
}
///
///SP kullanarak dovizturlerini döndürür
///
///在döviz türleri var TL中列出的字符串döndürürçiç,美元对美元。
公共静态列表GetDovizTurleribySP()
{
string connString=System.Configuration.ConfigurationManager.ConnectionString[“LocalSqlServer1”].ConnectionString;
SqlConnection sqlConn=新的SqlConnection(connString);
sqlConn.Open();
List dovizTanimlari=新列表();
字符串命令GetDovizTanimlari=“EXEC GetDovizTanimlari”;
SqlCommand命令cmd;
cmd=新的SqlCommand(commandGetDovizTanimlari,sqlConn);
使用(var reader=cmd.ExecuteReader())
{
while(reader.Read())
{
添加(reader.GetString(0));
}
}
返回dovizTanimlari;
}
在看到您的代码后,我想指出两件事,将您的SqlCommand、DataReader和sqlConnection包装在using语句中(是嵌套的using语句),并且当您创建List时,您不必事后调用clear(),因为List应该已经初始化为emtpy(至少我认为在c中是这样)。我建议您使用using
语句来确保即使发生异常,连接也会关闭
它可能看起来像这样
public static List<string> GetDovizTurleribySP()
{
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer1"].ConnectionString;
using (SqlConnection sqlConn = new SqlConnection(connString))
{
sqlConn.Open();
List<string> dovizTanimlari = new List<string>();
string commandGetDovizTanimlari = "EXEC GetDovizTanimlari";
SqlCommand cmd;
cmd = new SqlCommand(commandGetDovizTanimlari, sqlConn);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
dovizTanimlari.Add(reader.GetString(0));
}
}
return dovizTanimlari;
}
}
public静态列表GetDovizTurleribySP()
{
string connString=System.Configuration.ConfigurationManager.ConnectionString[“LocalSqlServer1”].ConnectionString;
使用(SqlConnection sqlConn=newsqlconnection(connString))
{
sqlConn.Open();
List dovizTanimlari=新列表();
字符串命令GetDovizTanimlari=“EXEC GetDovizTanimlari”;
SqlCommand命令cmd;
cmd=新的SqlCommand(commandGetDovizTanimlari,sqlConn);
使用(var reader=cmd.ExecuteReader())
{
while(reader.Read())
{
添加(reader.GetString(0));
}
}
返回dovizTanimlari;
}
}
测试和测试:
Close();
Dispose();
SqlConnection.ClearPool(connection);
SqlConnection.ClearAllPools();
使用expression等工具,我终于发现每个OpenConnection的“开放池”问题没有重用维护的“池”(等待命令),导致ASP.NET客户端应用程序饱和(唯一的方法是重新启动IIS以释放),我意识到这是对.config中连接字符串的调用:
*System.Configuration.ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString.;*
显然,他调用了外部程序集,导致连接字符串或散列中出现“差异”
解决方案:
我把集合加起来:
System.Configuration"** and replacement implicitly invoking: ConfigurationManager.ConnectionStrings ["ConnectionSQL"] ConnectionString;
这就解决了问题,每个“Open()”都不再执行“pool”(池)。你能展示一些代码来演示你是如何管理连接的吗?@Chris Taylor我刚刚添加了一些代码Taylor先生。我没有像这样使用它,但我现在会尝试,谢谢你的建议。谢谢,我将重新生成代码,我找到了错误的原因。返回dovizTanimlari;之前,它只是缺少一个sqlConn.Close()这就是使用语句很方便的地方,即使抛出异常,也会关闭并清除所有异常,这意味着您没有逻辑错误谢谢Taylor先生,我刚刚看到缺少的sqlConn.Close()。我从你的代码中了解到,如果我使用“using”,我就不必编写sqlConn.Close(),对吗?@emriviliyaz,对。using语句实际上将代码包装在try/finally中,并对using语句引用的对象调用Dispose方法。这将确保即使由于异常或提前返回等原因代码未到达函数末尾,连接也会关闭。对于DataReader,您使用了相同的概念,您可以确保一旦完成读卡器,读卡器就会关闭,这很好。