【问题标题】:Best practice when executing multiple queries执行多个查询时的最佳实践
【发布时间】:2017-09-26 12:29:15
【问题描述】:

当执行多个查询时,使用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 还是每次都创建一个新的更好?

【问题讨论】:

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


    【解决方案1】:

    我认为无论分配是否存在,为了便于阅读,我都会使用选项二来确定何时我有一个具有不同参数的新命令

    【讨论】:

      【解决方案2】:

      在您的示例中,这并不重要。他们都是一样的。但是在您的示例 2 中,您通过调用 sqlcmd.ExecuteNonQuery 有一个错误。

      我个人会将它们放在两个单独的方法中,然后调用该方法。只需确保连接对象仅在需要时打开,在不需要时立即关闭。

      【讨论】:

      • 是的,抱歉,我只是复制粘贴并编辑了我输入的第一个。
      • 说到连接,如果我为尝试执行的每个命令打开和关闭连接,我会遇到什么问题。
      • @crimson589 如果您只是复制/粘贴,那么您可能会在代码中执行相同的操作并遇到一些问题。无,仅在需要时打开和关闭是首选方式。
      • 所以如果我有多个查询,如我的示例中,我只需要在开始时打开并在最后一个查询时关闭?
      【解决方案3】:

      这正是我所做的,不一定是最佳实践,但我非常小心地关闭我的连接并处理我的对象。

      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;在它完成工作之前不要关闭你的连接。

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        • 2014-10-31
        • 2013-10-02
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多