执行多个查询时,使用Commands
和DataReaders
时的最佳做法是什么?是否最好只创建一个并在再次使用之前处理/关闭它或每次创建一个新的并处置/关闭那个?例如......
Dim sqlcmd as SqlCommand
Dim sqldr as SqlDatareader
sqlcmd = new SqlCommand(Query here, connection)
sqldr = sqlcmd.ExecuteReader
'Do stuff
sqlcmd.Dispose()
sqldr.Close()
sqlcmd = new SqlCommand(Different Query here, connection)
sqlcmd.ExecuteNonQuery
'Do stuff
sqlcmd.Dispose()
'And so on
或者
Dim sqlcmd as SqlCommand = new SqlCommand(Query here, connection)
Dim sqldr as SqlDataReader = sqlcmd.ExecuteReader
'Do stuff
sqlcmd.Dispose()
sqldr.Close()
Dim anothersqlcmd as SqlCommand = new SqlCommand(Different Query here, connection)
anothersqlcmd.ExecuteNonQuery
'Do stuff
anothersqlcmd.Dispose()
'And so on
对于这个例子很抱歉,我知道using
语句,但我的例子是一样的。是否只使用1 Command
和DataReader
或每次创建新的更好?
答案 0 :(得分:0)
我认为无论分配是否存在,为了便于阅读,我将使用选项2来确定何时我有一个具有不同参数的新命令
答案 1 :(得分:0)
在你的例子中,没关系。它们都是一样的。但是在您的示例2中,您通过调用sqlcmd.ExecuteNonQuery来获取错误。
我个人会将它们放在两个单独的方法中,而是调用该方法。只需确保连接对象仅在需要时打开,并在不需要时立即关闭。
答案 2 :(得分:0)
这正是我所做的,不一定是最佳实践,但我非常谨慎地关闭我的关系并处理我的对象。
cn.Open()
If Mode = "Add" Then
cmd.CommandText = "InsertVendor"
RetVal = cmd.ExecuteNonQuery
Else 'Update
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = itgID
cmd.CommandText = "UpdateVendors"
RetVal = cmd.ExecuteNonQuery
End If
cn.Close()
cmd.Dispose()
在这里,我使用了一个命令对象,但为2种不同的操作量身定制了它。为了清理所有东西,我使用Try..Catch..Finally
Finally
If Not IsNothing(cmd) Then
cmd.Dispose()
End If
If cn.State = ConnectionState.Open Then
cn.Close()
End If
End Try
然后检查那里的物体状态。在Finally块中永远不应该有异常。我在整个DataAccess类中使用相同的连接对象。小心DataReader;在完成工作之前,请不要关闭连接。