调用ExecuteScalar后关闭连接

时间:2015-01-23 23:31:45

标签: sql vb.net ado.net executescalar

我有以下功能,问题是因为即时通讯使用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的时间值,我能够获得值,但是由于Return返回后面的任何内容,连接没有关闭。 任何想法如何关闭这个连接? 或者还有另一种方法如何获得我的查询的价值。 提前致谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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