在.NET中正确使用SqlConnection

时间:2011-01-15 02:34:59

标签: c# sqlconnection

我只想就使用SqlConnection对象的正确用法或正确设计发表意见。以下2中哪一个是最佳用途:

一个数据提供程序类,其方法(每个方法)包含SqlConnection对象(并在完成时处理)。喜欢:

IList<Employee> GetAllEmployees() 
{ 
  using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
  // Code goes here... 
  } 
} 

Employee GetEmployee(int id) 
{ 
  using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
  // Code goes here... 
  } 
}   

SqlConnection connection; // initialized in constructor 
IList<Employee> GetAllEmployees() 
{ 
  this.TryOpenConnection(); // tries to open member SqlConnection instance 
  // Code goes here... 
  this.CloseConnection(); 
  // return 
} 

Employee GetEmployee(int id) 
{ 
  this.TryOpenConnection(); // tries to open member SqlConnection instance 
  // Code goes here... 
  this.CloseConnection(); 
  // return 
}

或者有更好的方法吗?我有一个专注的Web爬虫类型的应用程序,此应用程序将同时爬网50个或多个网站(多线程)与爬网程序对象中包含的每个网站,每个爬虫对象都有一个数据提供程序类的实例(上图)。

2 个答案:

答案 0 :(得分:5)

将合并实际的数据库连接。只要您的所有SqlConnection实例都使用相同的连接字符串,它们就会真正使用相同的连接。

我发现创建连接实例,使用它然后处理它(在using块中)更清晰。这样,如果代码需要更改为使用不同的连接字符串,使用事务或其他任何内容,那么您就可以在此处进行更改。

答案 1 :(得分:0)

也许没有真正相关,但是我唯一一次将任何连接对象分离到类实例级别的时候,我想要创建一个明确的分离关注每个方法正在做什么...也许它太长了,需要被重构成几个部分,每个部分都需要在交易的同一个连接上运行。

Create a connection
Start transaction
Call a subroutine to update an order header (passing along the connection or get it from the instance)
Call a subroutine to update all order details (passing along the conneciton or get it from the instance)
End transaction
Close connection

否则,我几乎坚持选项1. W /连接池它基本上不会花费你任何东西。