#vb.net
Вопрос:
Я использую класс-оболочку для доступа к данным sql server в vb.net по этой ссылке ADO.NET Компонент доступа к данным для SQL Server на C# и VB.NET
Теперь по этой ссылке, если мы увидим vb.net переменная второго класса(SqlComm и SqlDA ) объявляется как
Public Class VBDataAccess(Of TConnection As IConnection)
Shared SqlComm As SqlCommand = Nothing
Shared SqlDA As SqlDataAdapter = Nothing
и они используются в общем методе класса следующим образом
Public Shared Function NonQuery(ByVal CommandText As String, _
ByVal ParameterValues As List(Of SqlParameter), _
ByVal CommandType As CommandType) As Integer
Dim res As Integer = 0
Dim SqlConn As SqlConnection = Connection
SqlConn.Open()
Try
SqlComm = New SqlCommand(CommandText, SqlConn)
SqlComm.CommandTimeout = 600
SqlComm.CommandType = CommandType
If (ParameterValues IsNot Nothing) Then
For Each Parameter In ParameterValues
SqlComm.Parameters.Add(Parameter)
Next
End If
res = SqlComm.ExecuteNonQuery()
Catch ex As Exception
Throw ex
End Try
Return res
End Function
Как этот SqlComm будет вести себя в случае одновременного доступа нескольких пользователей к функции. Создаст ли это какие-либо проблемы ?
Комментарии:
1. Я бы не стал использовать этот код. Объект SqlCommand реализует IDisposable, и он не удаляется, будучи статическим членом класса.
2. @Craig, но SqlComm объявлен на уровне класса как общий, а не внутри функции
3. Вы абсолютно правы, я пропустил это, поэтому я удалил свой предыдущий комментарий. Вы правы, что существует потенциально серьезная проблема, если несколько пользователей могут одновременно выполнять эту функцию. Первый может попытаться выполнить запрос на частично настроенном
SqlComm
(и который будет частично настроен для неправильного запроса).4. Да, я тоже думал, что это будет проблематично, но автор этого класса в общей ссылке в вопросе говорит, что у него не будет никаких проблем, и этот класс используется таким количеством приложений с несколькими пользователями. Я не знаю, как подтвердить фактический результат, поэтому разместил вопрос здесь
5. 1 к тому, что сказал Хардкод. Однако, помимо этого, основываясь на показанном вами использовании, я не вижу абсолютно никаких причин для объявления SqlComm и SqlDA общими полями уровня класса