C# 哪个模式更适合SqlConnection对象?

C# 哪个模式更适合SqlConnection对象?,c#,performance,sqlconnection,sqlcommand,C#,Performance,Sqlconnection,Sqlcommand,对于SqlConnection对象,哪种模式更好?哪个性能更好? 你们还有其他款式吗 class DataAccess1 : IDisposable { private SqlConnection connection; public DataAccess1(string connectionString) { connection = new SqlConnection(connectionString); } public void

对于
SqlConnection
对象,哪种模式更好?哪个性能更好? 你们还有其他款式吗

class DataAccess1 : IDisposable
{
    private SqlConnection connection;

    public DataAccess1(string connectionString)
    {
        connection = new SqlConnection(connectionString);
    }

    public void Execute(string query)
    {
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            // ...

            command.Connection.Open();
            command.ExecuteNonQuery();
            command.Connection.Close();
        }
    }

    public void Dispose()
    {
        connection.Dispose();
    }
}
VS


没有真正的方法来回答这个问题。简短而规范的答案是,在您的工作单元的生命周期中,连接应该保持活跃。因为我们无法知道如何使用
DataAccess
(它是否在应用程序的生命周期内存在,或者您是否在执行某项操作时实例化并处理它?),所以无法给出具体的答案


也就是说,我建议使用第一种模式,但根据需要实例化并处理
DataAccess
对象;不要将其保留得太久。

我认为这取决于您的DataAccess对象的使用方式,如果它是在“using”子句中使用的,则保证连接完成后会被处理掉

但一般来说,我更喜欢第二种模式,因为sql连接是在Execute方法中创建和处理的,所以当您忘记处理DataAccess对象时,它不太可能保持打开状态


考虑到sql连接可能是一种稀缺资源,我认为应该尽一切努力确保它们不会被浪费。

建议使用
DataAccess2
。不过这是个人喜好。有些人甚至建议您的类是静态的。很难说一个比另一个更有表现力。您正走在
IDisposable
的道路上,这很好

我很乐意阅读并维护您问题中的上述两种样式

考虑让DAL也能够从.config读取连接字符串,而不是只允许在构造函数中传递值

public DataAccess2(string connStr)
{
    this.connectionString = connStr;
}
public DataAccess2()
{
    this.connectionString = 
            ConfigurationManager.ConnectionStrings["foo"].ConnectionString;
}
还可以考虑使用将SqlCommand包装在

using (var conn = new SqlConnection(connectionString))
{
    using(var cmd = conn.CreateCommand())
    {

    }
}

如果同时进行调用,第一个将导致错误。 第二种方法将确保对每个命令使用干净的连接,从而产生更多的连接

我同意上面的说法,这取决于使用的场景,为了克服与第一个场景相关的问题,我有一个需要使用这种模式的包装器,因此我设置了一个布尔字段值,以显示一个命令已经在连接上执行,然后“排队”下一个命令执行


当然,在某些情况下,您可能更喜欢使用多个连接…

我建议不要让类读取连接字符串。让应用程序读取配置信息并将其传递给使用者;没有理由限制类的可移植性。@Adam:我同意你对可移植性的限制。我将修改以包含一个允许调用方提供值的ctor。
using (var conn = new SqlConnection(connectionString))
{
    using(var cmd = conn.CreateCommand())
    {

    }
}