我有一个我支持的旧应用程序,我遇到了以下共享SQLConnection:
private static SqlConnection cnSQL = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString.ToString());
private static SqlCommand cmdSQL = new SqlCommand();
现在这个连接每次需要时都会打开和关闭,但它仍然会出现错误的错误,我相信这是因为它被用户共享(静态)。我的假设是否正确?我相信我最好在每个需要它的方法中创建一个新连接,而不是每个类都有一个。或者我可以只删除静态选项,并保持每页一个连接而不必担心交叉用户污染?
由于
答案 0 :(得分:3)
摆脱两者并宣布&在需要时定义它们。
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString.ToString()))
{
using (var cmd = conn.CreateCommand())
{ ... }
}
给this answer读一读。
答案 1 :(得分:1)
如果您尝试同时执行两个查询,static
肯定会发生错误。
在您使用它的每个方法中创建一个新连接,最后Dispose
将是我更喜欢的架构。我还会在工厂方法中封装SqlConnection
的创建。
答案 2 :(得分:1)
静态成员在应用程序的实际实例中的代码的所有对象和方法之间共享,但在不同用户之间无案例。
我会将连接字符串设为静态,而不是连接本身。如您所说,在每个方法中打开一个新连接。连接池将确保物理连接保持打开状态。
public static readonly string ConnectionString connString =
ConfigurationManager.ConnectionStrings["SQL"].ConnectionString.ToString();
...
private void SomeMethod()
{
using (var conn = new SqlConnection(connString)) {
string sql = "SELECT ...";
using (var cmd = new SqlCommand(sql, conn)) {
...
}
}
}
确保将代码嵌入using
- 语句中。这样,即使发生异常,资源也会被释放。
答案 3 :(得分:0)
先生,我担心必须在调用执行函数之前启动连接,并在执行后立即关闭,无论结果是否失败。如果您在合适的时间关闭并处理分配的资源,那么静态与否是没有区别的。启动连接的最佳模式是以下代码:
SqlCommand command = new SqlConnection("[The connection String goes here]").CreateCommand();
try
{
command.Parameters.Add(new SqlParameter() { ParameterName = "ParameterA", Direction = ParameterDirection.Input, Value = "Some value" });
command.Parameters.Add(new SqlParameter() { ParameterName = "ReturnValue", Direction = ParameterDirection.ReturnValue });
command.CommandText = "[YourSchema].[YourProcedureName]";
command.CommandType = CommandType.StoredProcedure;
command.Connection.Open();
command.ExecuteNonQuery();
}
catch (Exception ex)
{
//TODO: Log the exception and return the relevant result.
}
finally
{
if (command.Connection.State != ConnectionState.Closed)
command.Connection.Close();
SqlConnection.ClearPool(command.Connection);
command.Connection.Dispose();
command.Dispose();
}
希望它有所帮助。
干杯