2012-03-17 34 views
2

问题从认证考试:我需要确保应用程序使用的连接的最小数量的数据库

您使用Microsoft Visual Studio 2010和Microsoft .NET Framework 4创建应用程序。 该应用程序包含以下代码段。 (只包括为参考线号。)

01 class DataAccessLayer 
02 { 
03 private static string connString; 
04 
05 ... 
06 public static DataTable GetDataTable(string command){ 
07 
08  ... 
09 } 
10 } 

您需要定义DataAccessLayer类的连接生命周期。您还需要确保应用程序使用数据库的最少连接数。 你应该怎么做?

[A]在线路将下面的代码段04.

private static SqlConnection conn = new SqlConnection(connString); 
public static void Open(){ 
    conn.Open(); 
} 
public static void Close(){ 
    conn.Close(); 
} 

[B]在插入线04

private SqlConnection conn = new SqlConnection(connString); 
public void Open(){ 
    conn.Open(); 
} 
public void Close(){ 
    conn.Close(); 
}  

[C]下面的代码段与更换线01以下代码段。

class DataAccessLayer : IDisposable 

将下面的代码段排队04.

private SqlConnection conn = new SqlConnection(connString); 
public void Open(){ 
    conn.Open(); 
} 
public void Dispose(){ 
    conn.Close(); 
} 

[d]在行将下面的代码段07.

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

有些人争辩说,正确的答案是[D],但从我的角度来看,这是没有意义的,因为在“使用”块之后连接正在打开并立即关闭。

有人能指出正确答案并解释原因吗?

谢谢!

+0

你说得对,D会调用((IDisposable)conn).Dispose()一旦use块退出。 – 2012-03-17 00:52:33

+0

那么原始代码示例不完整,答案也是如此。这个想法是,您将using语句插入到GetDataTable方法中,然后在该using语句中调用必要的db命令并返回数据表。你认为没有意义的论点是无效的,因为假定数据访问代码会出现在using语句的大括号之前。 – Chris 2012-03-17 00:54:45

回答

1

没有一个是正确的答案。

  • A-C是错误的,因为它们不处理异常。
  • C也是错误的,因为你想从返回数据集的方法中封装数据访问。数据集被断开连接,并且没有迹象表明你是任何需要类在方法调用之间保持开放连接的东西,所以没有理由让整个类保持连接。只需在每个调用数据库的方法中执行此操作即可。
  • D很接近,但错了。要修复它,请在using(){...}块内添加conn.Open()调用后的数据访问代码。

注意:我不确定是否在D中的.Open()调用之后没有放置数据访问代码。如果您认为要被理解,那么D实际上是正确的答案。当连接被处置时,它被释放回连接池。连接池将帮助您最小化打开的连接数量。如果您需要直接关闭连接,即使它们处于非活动状态,您也需要开始考虑配置使用Connection Pooling。

+0

好的。这个问题必须有一个正确的选择。所以我会假设在问题中有一个'typo',并且在conn.Open()之后有数据访问代码。 – outlookrperson 2012-03-18 23:08:42

0

D实现using关键字哪个范围代码段将被隐含地配置。

A,B,C仍处于类/程序级别的生命周期中,因此每个实例将跨越另一个连接。

0

D是正确的。你只会使用一个连接。至少,你希望这样。 ADO.NET具有连接池功能,除非您使用解决方案A(一个静态分配的连接),否则无法确定发生了什么。

既然你应该尽可能地使用连接池,d仍是正确的。

相关问题