什么是在C#中打开/关闭SqlConnection的最佳方法

我想知道用Sql Server 2008R2 Express Edition数据库打开SqlConnection最佳方法是什么。 此版本的Sql具有RAM使用率和CPU使用率的限制,因此我们必须采用最佳方法来打开SqlConnection

现在我正在检查每个方法的开始和结束时的连接。 这是一个例子。

  private void CheckValidId(string Id) { CheckConnectionStatus(); try { sqlConnection.Open(); sqlCommand = new SqlCommand("select * from ValidId where id=@id", sqlConnection); sqlCommand.Parameters.AddWithValue("@id", Id); sqlDataReader = sqlCommand.ExecuteReader(); While (sqlDataReader.Read()) { string Test = sqlDataReader["Id"].toString(); MessageBox.Show("Value of Id : " , Test); } } catch (Exception exp) { MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId"); } finally { CheckConnectionStatus(); } } 

这是CheckConnectionStatus方法

  private void CheckConnectionStatus() { if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); } } 

什么是执行此操作的最佳方法。

谢谢

您的打开和关闭模式是正确的。 但是,您必须注意,这不会打开和关闭与SQL Server的连接,因此无法真正解决您对内存使用和CPU的担忧 – 事实上它不会有任何区别。

Open和Close的作用是租用并返回到客户端PC上的ADO连接池的连接。 这意味着无法保证关闭ADO连接(并且在大多数情况下不会)关闭并释放与SQL Server的连接。 这是因为建立和validation连接相对昂贵且速度慢,因此ADO连接池会将您的连接保持在池中,仍然打开,以防您想要重新建立连接。

SQL Server的不同之处在于它需要执行的并发查询数量 – 以及查询的数据集大小以及数据库中数据的总大小。

并发查询会挤压CPU,并且返回的数据集会挤压可用的RAM。 显然,数据库越大,缓存在RAM中的可能性越小,因此查询时获取缓存的可能性就越小。

在实践中,我对SQL Express版本的体验是,除非你正在做一些非常具体的事情,否则你不会注意到它与SQL Server完整版之间的任何区别;

1)编写BI样式工具,允许用户构造用户定义或用户范围的查询。 2)编写可怕的SQL – “大SQL”可能会掩盖您的错误查询语法,但Express无法实现,因为它可用的RAM较少。

如果你编写有效的约束SQL,你可能根本不会遇到任何SQL Express的限制。

只需使用using因为它在完成后处理连接。

  using(SqlConnection conn = new SqlConnection("Connection string")){ //do sql stuff conn.Open(); //etc etc conn.Close(); } 

您需要使用一次性图案以确保一切都关闭并妥善处理:

 var query = "select * from ValidId where id=@id"; using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString)) using (var command = new System.Data.SqlClient.SqlCommand(query, conn)) { command.Parameters.Add("@id", SqlDbType.Int).Value = Id; conn.Open; using (var reader = command.ExecuteReader()) { while (reader.Read()) { string Test = reader["Id"].ToString(); } } command.Parameters.Clear(); } 

您无需检查连接状态; 处理时它会关闭。

有一点需要注意:最佳做法是明确指定参数数据类型。 我假设您的情况下是SqlDbType.Int ,但您可以将其更改为实际情况。

另外需要注意的一点是:你不想在循环时在阅读器内部做太多。 你想要建立你的collections或其他什么,并离开那里。 连接打开越短越好。 这是因为您可能会对数据库中某些可能影响其他用户及其应用程序的行持有读锁定。