Да , пул соединений действительно быстрее. Они избавляют вас от необходимости постоянно пересматривать информацию о входе в систему и протоколе. Более того, это уже встроено в тип SqlConnection
и сделано достаточно поточно-ориентированным способом (где существующий код не ).
Короткая версия: вы действительно хотите создать новый объект подключения для большинства запросов, и вы не хотите попытаться использовать одну и ту же переменную подключения в приложении или сеансе.
Учитывая это, я вижу несколько больших проблем в этом коде:
- Обработка переменной
_conn
уровня класса как локальной, что делает невозможным безопасное совместное использование экземпляров этого класса между потоками.
- Нет механизма для очистки соединения, если выброшено исключение (нужен блок
Finally
или Using
. Просто закрытие после Catch
недостаточно хорошо.
- Нет способа передать отдельные параметры запроса в сигнатуру функции. Это заставит вас писать ужасно небезопасный код в другом месте, которое безумно уязвимо для атак инъекций SQL. Это одна из тех вещей, когда вы просыпаетесь однажды утром, чтобы узнать, что вас взломали более года назад, а ИМО граничит с профессиональной халатностью.
- Смешивание кода пользовательского интерфейса с кодом утилиты.
Вы хотите что-то похожее на это:
Private cnString As String = "my string of conection... with database. not put on this example"
Public Sub Include(pSql As String, parameters() As SqlParamter, Optional timeout As Integer = 120)
Using conn As New SqlConnectioN(cnString), _
cmd As New SqlCommand(pSql, conn)
If parameters IsNot Nothing AndAlso parameters.Length > 0 Then
cmd.Parameters.AddRange(parameters)
End If
conn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub
И вы могли бы назвать это так (при условии, что тип или имя экземпляра DB
):
Dim pSql As String = "INSERT INTO [ExampleTable] (FirstName, LastName, CreationDate) VALUES (@FirstName, @LastName, @CreationDate)"
Dim parameters = {
New SqlParameter("@FirstName", SqlDbType.NVarChar, 20),
New SqlParameter("@LastName", SqlDbType.NVarChar, 20),
New SqlParameter("@CreationDate", SqlDbType.DateTime)
}
parameters(0).Value = "John"
parameters(1).Value = "Smith"
parameters(2).Value = DateTime.Now
Try
DB.Include(pSql, parameters)
Catch ex As Exception
MessageBox.Show(String.Format("New Error on Sql cmd:{0}{1}{0}{0}Message:{2}",vbCrLf, pSql, ex.Message)
End Try