我们有一个助手类用于调用SQL Server上的存储过程。辅助功能如下所示:SQL连接问题
using (sqlCon = new SqlConnection(connectionString))
{
// Create database command object
sqlCmd = sqlCon.CreateCommand();
sqlCmd.CommandTimeout = commandTimeout;
// Set command text AND command type
sqlCmd.CommandText = procedureName;
sqlCmd.CommandType = CommandType.StoredProcedure;
// Set command parameters
if (paramCollection != null)
{
foreach (DatabaseParameter dbParam in paramCollection)
{
SqlParameter sqlParam = sqlCmd.Parameters.Add(dbParam.ParameterName, dbParam.ParameterType);
sqlParam.Direction = dbParam.ParameterDirection;
sqlParam.Value = dbParam.ParameterValue;
if (dbParam.ParameterSize != -1)
sqlParam.Size = dbParam.ParameterSize;
if (dbParam.ParamPrecision != -1)
sqlParam.Precision = (byte)dbParam.ParamPrecision;
if (dbParam.ParamScale != -1)
sqlParam.Scale = (byte)dbParam.ParamScale;
}
}
try
{
sqlCon.Open();
}
catch
{
SqlConnection.ClearAllPools();
sqlCon.Open();
}
// Prepare command
sqlCmd.Prepare();
// Execute the statement
sqlCmd.ExecuteNonQuery();
if (sqlCmd.Parameters.Contains("@Result"))
return sqlCmd.Parameters["@Result"].Value;
else
return "Completed";
}
所以我们确保连接正确关闭。 该应用程序是一个多线程服务,所有线程都经常调用此方法。我们在调用上述帮助器方法的代码周围锁定(thisobject){}部分,以防止线程窃取其他每个连接。
connection.Open在ClearAllpools的try catch中清除断开的连接。
但是,我们间歇地通过一天的随机间隔获取以下错误列表。
连接的当前状态正在连接。
或
连接的当前状态是打开的。
这些错误每千次调用一次就会发生一次,因此很难排除故障。有人看到任何类似的东西或想法可能是错的吗?
您的try-catch块看上去很腥 - 为什么要先清除连接池,然后*期望*连接现在能够打开? – BrokenGlass