Как установить строку подключения адаптера таблицы (на ту, которая задается динамически)

#.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