C#sql为每个查询创建一个连接并打开和关闭

我最近inheritance了一个C#Web应用程序,为每个查询创建一个新连接,如下所示:

public class QueryForm { public bool getStudents() { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString); conn.Open(); //commands conn.Close(); } protected void getProfessors() { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString); conn.Open(); //Commands conn.Close(); } protected void getProfessors() { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString); conn.Open(); //Commands conn.Close(); } } 

我知道这通常是最好的方法,但是让构造函数创建连接对象是可接受的或“最佳实践”,然后打开每个方法/ Query然后关闭该连接:

 public class QueryForm { SqlConnection conn; public QueryForm() { conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString); } public bool getStudents() { conn.Open(); //commands conn.Close(); } protected void getProfessors() { conn.Open(); //Commands conn.Close(); } protected void getCourses() { conn.Open(); //Commands conn.Close(); } } 

我更喜欢第二种方式,因为它不会产生多个连接对象。 但是,如果我要使方法和类静态,第一种方式也会更好。

其中任何一个都是可以接受的。 SqlConnection使用连接池,因此它不应该影响性能。 拥有多个SqlConnection对象不会伤害任何东西。 这归结为偏好。

如果你在方法中保持连接,我建议将命令封装在using语句中,例如:

 using (SqlConnection conn = new SqlConnection(...)) { conn.Open(); //commands conn.Close(); } 

这确保了连接的正确处理。

务必在最短的时间内保持连接畅通。 SQL连接正在使用连接池,因此打开连接实际上会在后台重用连接。 如果您保持连接打开,则可能会遇到错误:如果您使用BeginTransaction方法,则不支持“并行事务”。

这是一个具有潜在大量连接的Web应用程序,使连接对象保持打开状态会使您面临耗尽连接池并获得:’从池中获取连接之前经过的超时时间’错误的风险。

此外,即使抛出exception,您也必须确保连接已关闭。

这应该使用如下的使用块来完成:

 using (SqlConnection conn = new SqlConnection(...)) { conn.Open(); //commands } 

因为退出’using’块会对使用过的对象调用.Dispose()。

或者使用try / catch / finally块,如:

 SqlConnection conn = null; try { conn = new SqlConnection(...); conn.Open(); //commands } catch(Exception ex) { ... } finally { if(conn != null) conn.Close(); }