哪种模式更适合SqlConnection对象?

哪种模式更适合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

 class DataAccess2 : IDisposable { private string connectionString; public DataAccess2(string connectionString) { this.connectionString = connectionString; } public void Execute(string query) { using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = connection.CreateCommand(); command.CommandText = query; command.CommandType = CommandType.Text; // ... command.Connection.Open(); command.ExecuteNonQuery(); command.Connection.Close(); } } public void Dispose() { } } 

建议使用DataAccess2 。 但这是个人偏好。 有些人甚至可能会建议你的class级是static 很难说一个人比另一个人更有表现力。 你正走在IDisposable的道路上,这很棒。

我很乐意在您的问题中阅读和维护上面显示的两种风格。

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

 public DataAccess2(string connStr) { this.connectionString = connStr; } public DataAccess2() { this.connectionString = ConfigurationManager.ConnectionStrings["foo"].ConnectionString; } 

考虑将SqlCommand包装在一个using中。

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

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

话虽这么说,我会推荐第一个模式,但是根据需要实例化和处理你的DataAccess对象; 不要让它长时间不必要。

我认为这取决于你的DataAccess对象的使用方式,如果它在’using’子句中使用,那么保证连接在完成之后被处理掉。

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

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

如果进行并发调用,第一个将导致错误。 第二个将确保您为每个命令使用干净连接,从而产生更多连接。

我同意上面的陈述,它取决于使用的场景,克服与第一个相关的问题我有一个需要使用这种模式的包装器,所以我设置一个字段值boolean来表明正在执行一个命令在连接上已经“排队”下一个执行命令。

当然会出现您可能更喜欢使用多个连接的情况……