Я подозреваю, что проблема связана с тем, как вы управляете вашим gconIntegration
соединением. Вы слишком стараетесь продолжать использовать это же соединение. Было бы полезно увидеть, где он живет.
Лучше получить "новые" соединения из пула и позволить .Net беспокоиться об этом за вас.
Кроме того, в вашем общем коде «GetSQLTable» отсутствует важная часть: он не учитывает установку параметров, что говорит мне о том, что вы встраиваете их непосредственно в строки запроса. Это путь к катастрофе: это приведет к дырам в безопасности впрыска Sql.
Еще одна вещь: не устанавливайте объекты на Nothing
в .Net. Либо утилизируйте их, если необходимо, либо дайте им выпасть из области видимости самостоятельно.
Вот мой обычный метод получения данных из данных:
Function GetSomeData(ByVal Table2ID As Integer)
Dim result As New DataTable
Dim sql As String = "SELECT Column1,Column2 FROM [Table1] WHERE Table2ID= @Table2ID"
Using cn As New SqlConnection( GetConnectionString() ), _
Using cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@Table2ID", SqlDbType.Int).Value = Table2ID
Using rdr As SqlDataReader = cmd.ExecuteReader()
result.Load(rdr)
End Using
End Using
return result
End Function
Некоторые примечания к этому коду:
- Оператор
Using
гарантирует, что связанный объект расположен в соответствующем End Using
.
- Параметры запроса строго типизируются, и никогда никогда не подставляется непосредственно в строку запроса, даже когда они передаются на сервер. Sql Data и Sql Code никогда не смешиваются.
- Вам нужна отдельная функция для каждого запроса, который нужно отправить. Это действительно хорошая вещь, поскольку она приводит к созданию строго типизированного интерфейса для вашей базы данных. В идеале все эти функции находятся в одном классе, а функция GetConnectionString является закрытой для этого класса. За пределами этого уровня данных доступ к базе данных не происходит.