Я вижу несколько проблем.
- Вы используете конкатенацию в операторе SQL. Это плохая практика. Вместо этого используйте параметризованный запрос.
- Вы окружаете пароль одинарными кавычками. Они не нужны, и на самом деле, я удивлен, что это работает даже при условии, что сам пароль не имеет одинарных кавычек.
- Вы должны окружать классы, которые реализуют IDisposable, блоком Using
- Вы должны воссоздать объект соединения WASP в GetWASPcr следующим образом:
Public Sub GetWASPAcr()
Dim username As String = HttpContext.Current.User.Identity.Name
Dim listOfDatabaseConnectionString As String = "..."
Using listOfDatabaseConnection As SqlConnection( listOfDatabaseConnectionString )
Using cmd As New SqlCommand("SELECT WASPDatabase FROM dbo.aspnet_Users WHERE UserName = @Username")
cmd.Parameters.AddWithValue( "@Username", username )
Dim dt As New DataTable()
Using da As New SqlDataAdapter( cmd )
da.Fill( dt )
If dt.Rows.Count = 0 Then
WaspConnection = Null
Else
Dim connString As String = String.Format("Data Source=JURA;Initial Catalog={0};User Id={1};Password={2};" _
, dt.Rows(0)("WASPDatabase") _
, ConfigurationManager.AppSettings("WASPDBUserName") _
, ConfigurationManager.AppSettings("WASPDBPassword"))
WaspConnection = New SqlConnection(connString);
End If
End Using
End Using
End Using
End Sub
В этом примере listOfDatabaseConnectionString
- это начальная строка подключения к центральной базе данных, где он может найти имя каталога, которое следует использовать для последующих подключений.
Все это говорит, зачем вам нужна переменная уровня класса для хранения соединения? Вы должны сделать все ваши вызовы базы данных открыть соединение, сделать заявление SQL, закрыть соединение. Таким образом, пять вызовов базы данных открывают и закрывают соединение пять раз. Это звучит дорого, за исключением того, что .NET предоставляет вам пул подключений, поэтому, когда вы закончите с подключением, а другое будет запрошено, оно извлечет его из пула.