-1

我有以下功能,问题是因为我使用 ExecuteScalar,再次使用任何其他功能时连接永远不会关闭......

Public Function Valor(tabla As String, campos As String, condicion As String)
        cn.Open()
        Dim sql As String = "SELECT " & campos & " FROM " & tabla & " WHERE " & condicion
        comando = New SqlCommand(sql, cn)
        Return comando.ExecuteScalar
     If cn.State = ConnectionState.Open Then
            cn.Close()
        End If

    End Function

此函数返回我从 SQL 时间(7)到应用程序上的 TIMESPAN 的时间值,我能够获取该值,但由于返回跳过它之后的任何内容,连接没有关闭。知道如何关闭连接吗?或者还有另一种方法可以让我获得查询的值。提前致谢

4

2 回答 2

4

首先,当您为每个查询创建一个全新的对象时,.Net 中的连接效果最好。不要试图一直重复使用相同的连接。

其次,即使您在返回之前关闭了连接,该代码仍然可能泄漏连接,因为.Close()如果抛出异常,它永远不会到达函数调用。

最后,该代码极易受到 sql 注入的攻击。它实际上是在乞求被黑客入侵。

这是解决所有三个问题的代码:

Public Function Valor(ByVal sql As String, ByVal ParamArray condicion() As SqlParameter)
    'cnString is a made-up string variable for the connection string that you will create in the same place (and instead of) that you currently have cn
    Using cn As New SqlConnection(cnString), _ 
          cmd As New SqlCommand(sql, cn)

        If condicion IsNot Nothing Then cmd.Parameters.AddRange(condicion)
        cn.Open()

        Return cmd.ExecuteScalar()
    End Using
End Function
于 2015-01-23T23:44:51.020 回答
1

不是立即返回,而是将结果存储在一个变量中,清理所有内容,然后返回缓存的变量:

Public Function Valor(tabla As String, campos As String, condicion As String)
    cn.Open()
    Dim sql As String = "SELECT " & campos & " FROM " & tabla & " WHERE " & condicion
    comando = New SqlCommand(sql, cn)
    Dim retorno As Object = comando.ExecuteScalar()
    If cn.State = ConnectionState.Open Then
        cn.Close()
    End If
    Return retorno
End Function
于 2015-01-23T23:37:25.630 回答