#.net #connection-string
#.net #строка подключения
Вопрос:
Я только что унаследовал роль «Специалиста по базам данных» от другого разработчика, который больше не работает в компании, поэтому, пожалуйста, простите меня, если я кажусь особенно глупым.
Приложение представляет собой VB.NET 4 приложение.
Строка подключения к БД для наших адаптеров таблиц была строкой в my.settings (Мои настройки.DBConnectionString), которая устанавливается во время выполнения. Когда мне пришлось модифицировать табличные адаптеры, они не смогли увидеть никаких данных в My.Settings.DBConnectionString и, таким образом, не позволял мне редактировать их, пока я не установлю «реальную» (или жестко запрограммированную) строку подключения. Теперь я хочу изменить ее обратно на динамически заданную, но Visual Studio, похоже, не хочет позволять мне это делать. Я полагаю, что нашел место в автоматически сгенерированном коде за файлом .xsd, чтобы иметь возможность изменять строку подключения для конкретного адаптера таблицы, но если я это сделаю, произойдут ли плохие вещи? Или есть какой-то другой механизм для изменения строки подключения адаптера таблицы, отличный от панели свойств на стороне Visual Studio, о котором я не знаю?
Просто как дополнительный вопрос, есть ли здесь плохие / не лучшие практики?
Спасибо!
Ответ №1:
Вот как я решил проблему изменения строки подключения во время выполнения. Надеюсь, это поможет.
В моих настройках у меня есть 2 записи
У меня есть набор данных с именем DataSet1
У меня есть 3 формы, называемые Form1, Form2 и Form3
Form1 имеет следующие элементы управления
И следующий код
Public Class Form1
Private Sub GenericoBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles GenericoBindingNavigatorSaveItem.Click
Me.Validate()
Me.GenericoBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.TableAdapterManager.Connection.ConnectionString = My.MySettings.Default._001NewConnectionString
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
Label5.Text = My.MySettings.Default._001NewConnectionString
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
My.MySettings.Default("_001NewConnectionString") = "Data Source=" amp; TextBox1.Text amp; "" amp;
TextBox2.Text amp; ";Initial Catalog=001;Persist Security Info=True;User ID=" amp;
TextBox3.Text amp; ";Password=" amp; TextBox4.Text
My.MySettings.Default.Save()
Me.TableAdapterManager.Connection.ConnectionString = My.MySettings.Default._001NewConnectionString
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
Try
Me.GenericoTableAdapter.Fill(Me.DataSet1.generico)
Catch ex As Exception
MessageBox.Show("error Form1")
End Try
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim f As New Form2(TableAdapterManager.Connection.ConnectionString)
f.ShowDialog()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim f As New Form3(TableAdapterManager.Connection.ConnectionString)
f.ShowDialog()
End Sub
End Class
Form2 имеет следующие элементы управления
с помощью следующего кода
Public Class Form2
Private Sub UtentesBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles UtentesBindingNavigatorSaveItem.Click
Me.Validate()
Me.UtentesBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
End Sub
Public Sub New(ConnectionString As String)
InitializeComponent()
Me.TableAdapterManager.Connection.ConnectionString = ConnectionString
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
End Sub
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Me.UtentesTableAdapter.Fill(Me.DataSet1.utentes)
Catch ex As Exception
MessageBox.Show("Form2")
End Try
End Sub
End Class
и Form3 имеет следующие элементы управления
с помощью следующего кода
Public Class Form3
Public Sub New(ConnectionString As String)
InitializeComponent()
Me.TableAdapterManager.Connection.ConnectionString = ConnectionString
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
End Sub
Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Me.UtentesTableAdapter.Fill(Me.DataSet1.utentes)
Catch ex As Exception
MessageBox.Show("Form3")
End Try
End Sub
Private Sub UtentesBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles UtentesBindingNavigatorSaveItem.Click
Me.Validate()
Me.UtentesBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.DataSet1)
End Sub
End Class
Ответ №2:
Похоже, что строка подключения вашего адаптера таблицы устанавливается с помощью настройки приложения?
Я не совсем уверен, что вы имеете в виду, устанавливая их динамически, но, похоже, вы, возможно, сталкивались с часто оспариваемой (я знаю, нужна цитата …) функцией, которая означает, что вы не можете установить параметры области приложения во время выполнения. Это связано с тем, что автоматически сгенерированные классы предоставляют свойства только для чтения для настроек вашего приложения. Настройки области пользователя могут быть изменены (подробности см. по предыдущей ссылке).
Здесь есть сообщение, в котором обсуждается изменение настроек приложения, которые могут быть полезны.
Если вам действительно нужно изменить настройки приложения во время выполнения, возможно, стоит реализовать свой собственный механизм настройки, который использует XML, реестр или что-то еще для хранения, извлечения и изменения настроек.
Надеюсь, это поможет
Редактировать:
Внезапно мне пришло в голову, что я неправильно прочитал ваш вопрос. Ваша строка подключения, вероятно, не только получена из настроек приложения, но, возможно, ваш адаптер таблицы привязан к этой строке подключения? Если это так, смотрите этот пост, в котором объясняется, как вы можете ввести / изменить строку подключения для адаптеров таблиц. Мне кажется, это немного взлом, но это должно сработать.
Ответ №3:
Вот как я обновил строку подключения из INI-файла с помощью модуля в VB, который показывает немного другой способ обновления строки подключения.
Это позволяет клиенту обновлять соединение из формы в приложении. Текстовые поля в форме привязаны к общедоступным строкам в модуле. Нажатие кнопки сохранить в форме вызывает метод savedbsetup в модуле. Затем при запуске приложения оно загружает новые настройки из созданного INI-файла
Imports System.Configuration
Imports System.Environment
Imports System.IO
Module SetupOptions
Public DBJacksServer As String = "CSTDesktop1SQLExpress"
Public DBJacksCatalog As String = "PreJacks"
Public DBJacksUserName As String = "sa"
Public DBJacksPassword As String = "dba"
Public appData As String = $"{GetFolderPath(SpecialFolder.ApplicationData)}/CSTSoftware/Jacks"
Public DBJacksSetUpFile As String = $"{appData}/DBJackssetup.ini"
Public DBConnectionStringSettingsName As String = "Jacks.My.MySettings.PreJacksConnectionString"
Public Sub SaveDBSetup()
Try
If Not Directory.Exists(appData) Then
Directory.CreateDirectory(appData)
End If
If File.Exists(DBJacksSetUpFile) Then
File.Delete(DBJacksSetUpFile)
End If
Using sw As StreamWriter = New StreamWriter(DBJacksSetUpFile)
sw.WriteLine(DBJacksServer)
sw.WriteLine(DBJacksCatalog)
sw.WriteLine(DBJacksUserName)
sw.WriteLine(DBJacksPassword)
End Using
Catch ex As Exception
MessageBox.Show($"Failed to Save DB Settings With this Error: {ex.Message}")
End Try
End Sub
Public Sub LoadDBSetup()
Try
If File.Exists(DBJacksSetUpFile) Then
Using sr As StreamReader = New StreamReader(DBJacksSetUpFile)
DBJacksServer = sr.ReadLine()
DBJacksCatalog = sr.ReadLine()
DBJacksUserName = sr.ReadLine()
DBJacksPassword = sr.ReadLine()
End Using
SetDBJacksConnection()
End If
Catch ex As Exception
MessageBox.Show($"Failed to Load DB Settings With this Error: {ex.Message}")
End Try
End Sub
Public Function GetDBJacksConnection() As String
'If File.Exists(DBJacksSetUpFile) Then
' Return $"Data Source={DBJacksServer};Initial Catalog={DBJacksCatalog};Persist Security Info=True;User ID={DBJacksUserName};Password={DBJacksPassword}"
'Else
Return ConfigurationManager.ConnectionStrings(DBConnectionStringSettingsName).ConnectionString
'End If
End Function
Public Sub SetDBJacksConnection()
Dim config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
Dim csSection = config.ConnectionStrings
csSection.ConnectionStrings(DBConnectionStringSettingsName).ConnectionString = $"Data Source={DBJacksServer};Initial Catalog={DBJacksCatalog};Persist Security Info=True;User ID={DBJacksUserName};Password={DBJacksPassword}"
config.Save(ConfigurationSaveMode.Modified)
ConfigurationManager.RefreshSection("connectionStrings")
End Sub
End Module