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