2016-04-01 6 views
0

Я поделился с вами многими сообщениями об этой проблеме, но ни одно из предложений, похоже, не помогает закрыть мои 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"/> 

Также я хочу добавить, что это код, который я унаследовал, и я пытаюсь нг пропатчить его ....

+0

'SET @inReqId = подстроки (@ProjectRequestId, 3, Len (@ProjectRequestId) -2)', что это плохо , Создайте '@ ProjectRequestId' тип' Int', тогда вам не нужно делать все, что не имеет значения. Кроме того, напишите 'objDataClass.Create_Connection()' код для этого ... 'objDataClass.Create_Connection()' этот экземпляр объекта - это ваша проблема, у него есть указатель на это соединение (объект) ... – Codexer

+0

Я сделал редактируйте мой код с отсутствующей функцией ... спасибо за ответ! – bryankerk

+0

Я знаю, что это не ответ, но не могли бы вы сделать следующее ... Создать соединение .... пропустить через добавления, а затем закрыть/удалить соединение после завершения всех дополнений в цикле? Более эффективный метод, который открывается и закрывается после каждого добавления. – Mych

ответ

0

Пожалуйста, дайте этому выстрел ...

Public Shared Function Create_Connection() As String 
    Return ConnectionString 'Just return the connection string... 
End Function 

Using cmd As New SqlClient.SqlCommand 
    Using con As New SqlClient.SqlConnection(Create_Connection()) 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Connection = con 'use the con which is your connection now... 
      cmd.CommandText = "usp_InsertOtherProjectMember" 
      cmd.Parameters.AddWithValue("@ProjectRequestId", inProjectRequestId) 
      cmd.Parameters.AddWithValue("@EmployeeId", inEmployeeId) 
      cmd.Parameters.AddWithValue("@Employee", inEmployee) 

      con.Open() 
      reader = cmd.ExecuteReader() 
      reader.Close() 
      con.Close() 
    End Using 
End Using