Я поделился с вами многими сообщениями об этой проблеме, но ни одно из предложений, похоже, не помогает закрыть мои SQL-соединения.Закрыть SQL-соединение с VB.net MVC 3.5 - проблема с таймаутом
Это функция, которую я использую в vb.net:
Private Function InsertOtherProjectMembers(ByVal inProjectRequestId, ByVal inEmployeeId, ByVal inEmployee) As Boolean
Dim reader As SqlDataReader
Using cmd As New SqlClient.SqlCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = objDataClass.Create_Connection()
cmd.CommandText = "usp_InsertOtherProjectMember"
cmd.Parameters.AddWithValue("@ProjectRequestId", inProjectRequestId)
cmd.Parameters.AddWithValue("@EmployeeId", inEmployeeId)
cmd.Parameters.AddWithValue("@Employee", inEmployee)
reader = cmd.ExecuteReader()
reader.Close()
cmd.Connection.Close()
cmd.Dispose()
End Using
End Function
Я только недавно добавил Использование - End Using из идей, которые я нашел здесь. Я также добавил reader.Close, cmd.Connection.Close, cmd.Dispose. Прежде, чем код был в Try-Catch-finally.
Каждый раз, когда этот код запускается, он добавляет Работников в базу данных в цикле, поэтому он вставляет для каждого сотрудника, открывая соединение с базой данных для каждого сотрудника. список добавляемых сотрудников может быть довольно длинным, иногда 30-40 сотрудников.
Я пытаюсь закрыть соединения после их создания, поскольку, как только пользователь выполняет сохранение и пытается загрузить что-либо еще в приложение, мы получаем ошибку SQL, в которой указано, что слишком много соединений с базой данных. Когда я запускаю sp_who
в БД, он показывает мне инкрементное количество подключений к БД, изначально это может быть 2 или 3, которые включают регистрацию и загрузку начальных данных, но после запуска этой вставки она увеличивается до 15, а затем 20ish, а затем в 30-е годы. Он всегда создает новые соединения и никогда не закрывает старые.
Это код SQL, который вызывается для usp_InsertOtherProjectMember
ALTER PROCEDURE [dbo].[usp_InsertOtherProjectMember]
@ProjectRequestId Varchar(50),
@EmployeeId varchar(5),
@Employee varchar(50)
AS
-- Get the integer part of the transmitted request number
Declare @inReqId AS Int
SET @inReqId = Substring(@ProjectRequestId, 3, Len(@ProjectRequestId)-2)
Insert Into tblProjectRequestOtherMembers(ProjectRequestId, EmployeeId, Employee)
Values(@inReqId, @EmployeeId, @Employee)
Есть ли что-нибудь еще я должен добавить/изменить в своем коде, чтобы закрыть соединение? В настоящее время соединения только закрываются сборщиком мусора, в конечном итоге ....
Спасибо за помощь!
EDIT: Добавление кода для Create_Connection()
Public Function Create_Connection() As Data.SqlClient.SqlConnection
Dim strConn As String
strConn = ConnectionString
Dim Conn As New Data.SqlClient.SqlConnection(strConn)
Conn.Open()
Create_Connection = Conn
End Function
ConnectionString в настоящее время взяты из WebConfig и определяется в качестве публичной переменной:
ConnectionString = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
В WebConfig:
<add name="ConnectionString" connectionString="Server=*SERVERNAME*;Database=*DATABASENAME*;Trusted_Connection=True"/>
Также я хочу добавить, что это код, который я унаследовал, и я пытаюсь нг пропатчить его ....
'SET @inReqId = подстроки (@ProjectRequestId, 3, Len (@ProjectRequestId) -2)', что это плохо , Создайте '@ ProjectRequestId' тип' Int', тогда вам не нужно делать все, что не имеет значения. Кроме того, напишите 'objDataClass.Create_Connection()' код для этого ... 'objDataClass.Create_Connection()' этот экземпляр объекта - это ваша проблема, у него есть указатель на это соединение (объект) ... – Codexer
Я сделал редактируйте мой код с отсутствующей функцией ... спасибо за ответ! – bryankerk
Я знаю, что это не ответ, но не могли бы вы сделать следующее ... Создать соединение .... пропустить через добавления, а затем закрыть/удалить соединение после завершения всех дополнений в цикле? Более эффективный метод, который открывается и закрывается после каждого добавления. – Mych