2015-01-23 3 views
-1

я следующая функция, задача, так как им с помощью ExecuteScalar, соединение никогда не закрывается при использовании любой другой функции снова ...Закрыть соединение после вызова ExcuteScalar

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 time (7) в TIMESPAN в приложении, я могу получить значение, но так как Return пропускает что-либо после него, соединение не закрывается. ЛЮБАЯ идея, как закрыть это соединение? или есть другой способ, как я могу получить значение моего запроса. Заранее спасибо

ответ

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 
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