执行多个查询时的最佳做法

时间:2017-09-26 12:29:15

标签: sql .net sql-server vb.net oracle

执行多个查询时,使用CommandsDataReaders时的最佳做法是什么?是否最好只创建一个并在再次使用之前处理/关闭它或每次创建一个新的并处置/关闭那个?例如......

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 CommandDataReader或每次创建新的更好?

3 个答案:

答案 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;在完成工作之前,请不要关闭连接。