Как установить строку подключения адаптера таблицы (к динамически настроенной) - PullRequest
1 голос
/ 18 мая 2011

Я только что унаследовал роль «Базы данных парней» от другого разработчика, который больше не работает в компании, поэтому, пожалуйста, прости меня, если я звучу особенно нубистски.

Приложение - приложение VB.NET 4.

Строка соединения с БД для наших адаптеров таблиц была строкой в ​​my.settings (My.Settings.DBConnectionString), которая устанавливается во время выполнения.Когда мне пришлось модифицировать адаптеры таблиц, они не могли видеть никаких данных в My.Settings.DBConnectionString и, таким образом, не позволяли мне редактировать их, пока я не установил «настоящую» (или жестко закодированную) строку подключения.Теперь я хочу изменить его на динамически установленный, но Visual Studio, похоже, не хочет, чтобы я это делал.Я считаю, что в автоматически сгенерированном коде за файлом .xsd я нашел место, где можно изменить строку подключения для конкретного адаптера таблицы, но если я это сделаю, произойдут ли плохие вещи?Или есть какой-то другой механизм для изменения строки подключения адаптера таблицы, кроме панели свойств на стороне Visual Studio, о которой я не знаю?

Как вторичный вопрос, есть ли плохие / не лучшиечто здесь происходит?

Спасибо!

Ответы [ 3 ]

1 голос
/ 02 декабря 2013

Вот как я решил проблему изменения строки подключения во время выполнения.Надеюсь, это поможет.

В моих настройках у меня есть 2 записи enter image description here

У меня есть набор данных с именем DataSet1

enter image description here

У меня есть3 формы, называемые Form1, Form2 и Form3

Form1 имеет следующие элементы управления

enter image description here

И следующий код

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=" & TextBox1.Text & "\" &
            TextBox2.Text & ";Initial Catalog=001;Persist Security Info=True;User ID=" &
            TextBox3.Text & ";Password=" & 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 имеетследующие элементы управления

enter image description here

со следующим кодом

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 имеет следующие элементы управления

enter image description here

со следующим кодом

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
0 голосов
/ 03 марта 2019

Вот как я обновил строку подключения из файла INI с помощью модуля в VB, который показывает немного другой способ обновления строки подключения.

Позволяет клиенту обновлять соединение из формы в приложении. Текстовые поля в форме связаны со строками Public в модуле. Нажатие кнопки сохранения в форме вызывает метод сохраненного набора в модуле. Затем, когда приложение запускается, оно загружает новые настройки из созданного файла INI

Imports System.Configuration
Imports System.Environment
Imports System.IO
Module SetupOptions
    Public DBJacksServer As String = "CSTDesktop1\SQLExpress"
    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
0 голосов
/ 18 мая 2011

Звучит так, как будто строка подключения вашего настольного адаптера устанавливается настройкой приложения ?

Я не совсем понимаю, что вы имеете в виду, устанавливая их динамически, но похоже, что вы, возможно, сталкивались с часто оспариваемой (я знаю, необходима цитата ...) функция , которая означает, что вы не можете установить настройки области приложения во время выполнения. Это потому, что автоматически сгенерированные классы предоставляют свойства только для чтения для настроек вашего приложения. Настройки области действия пользователя могут быть изменены (подробности см. В предыдущей ссылке).

Здесь есть сообщение , в котором обсуждаются изменения настроек приложения, которые могут быть полезны.

Если вам нужно изменить настройки приложения во время выполнения, возможно, стоит реализовать собственный механизм настроек, который использует XML, реестр или что-то еще для хранения, извлечения и изменения настроек.

Надеюсь, это поможет

EDIT:

Внезапно мне пришло в голову, что я не правильно прочитал ваш вопрос. Не только ваша строка подключения, вероятно, получена из настроек приложения, но, возможно, ваш табличный адаптер привязан к этой строке подключения? Если это так, см. в этом посте , в котором объясняется, как можно внедрить / изменить строку подключения для адаптеров таблиц. Для меня это выглядит как взлом, но это должно сработать.

...