2014-10-08 39 views
0

我创建了一个小班的辅助方法,针对数据库的工作。我想了解一下这种方法:是否确定处置命令对象之后,再使用DataReader?

Shared Function GetReader(sql As String, con As OleDbConnection) As OleDbDataReader 

    Dim cmd As New OleDbCommand(sql, con) 
    Dim reader As OleDbDataReader = cmd.ExecuteReader 
    cmd.Dispose() 
    Return reader 

End Function 

我要去碰到某些问题处置首Command对象,然后使用DataReader?

我宁愿随时通过不创建/处理Command对象来调用代码整洁(在上面的帮助器方法中可能会包含这些对象似乎是多余的)。

+0

顺便说一句,从设计的角度来看,我并不过于担心一个DataReader返回到调用代码。辅助方法不会在低级数据库代码之外使用。即数据访问层将不会看到它们。 – misha256 2014-10-08 02:47:31

回答

2

我会遇到某种麻烦,首先处理命令​​ 对象,然后使用DataReader?

没有

但是,这是一个更干净的代码:

Shared Function GetReader(sql As String, con As OleDbConnection) As OleDbDataReader 

    Using cmd As New OleDbCommand(sql, con) 
     Dim reader As OleDbDataReader = cmd.ExecuteReader 
     'cmd.Dispose() 'Not needed here, will be invoked automatically 
     Return reader 
    End Using 

End Function 

旁注:

  • 考虑使用Using Statements始终确保所有资源都被释放

  • 考虑一旦不再需要连接和阅读器,就要处理连接和阅读器。不要害怕关闭然后重新打开再次因为连接是保存在默认情况下,连接池的,你应该尽快关闭它们 - 特别是如果你的应用是在某种形式的负荷 -

+0

+1,关于使用'使用'的注意事项。 – 2014-10-09 01:44:31

0

这段代码没什么不对,在执行cmd.Dispose()之前,您将查询结果分配给阅读器即Dim reader As OleDbDataReader = cmd.ExecuteReader,所以读者在处理完cmd之后仍然有结果。它会保持可贵的连接得到closed否则reader .Dispose() occures。

相关问题