我刚刚从另一位不再与公司合作的开发人员那里继承了“数据库之家”的角色,所以如果我听起来特别无趣,请原谅我。
该应用程序是一个VB.NET 4应用程序。
我们的表适配器的数据库连接字符串是my.settings(My.Settings.DBConnectionString)中的一个字符串,它在运行时设置。当我不得不修改表适配器时,他们在My.Settings.DBConnectionString中看不到任何数据,因此在我设置“真实”(或硬编码)连接字符串之前不允许我编辑它们。现在我想将其更改回动态设置,但Visual Studio似乎不想让我这样做。我相信我已经在.xsd文件后面的自动生成代码中找到了能够更改特定表适配器的连接字符串的位置,但如果我这样做会发生坏事吗?或者是否有一些其他机制来更改表适配器的连接字符串,而不是我不知道的Visual Studio一侧的属性窗格?
就像第二个问题一样,这里有不好/不是最好的做法吗?
谢谢!
这是我如何解决在运行时更改连接字符串的问题。希望这可以帮助。
在我的设置中,我有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=" & 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具有以下控件
使用以下代码
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
这听起来像你的表适配器的连接字符串是由application setting设置的?
我不确定你动态设置它们是什么意思,但听起来你可能遇到了经常有争议的(我知道,引用需要......)功能,这意味着你无法在运行时设置应用程序范围设置。这是因为自动生成的类为您的应用程序设置提供只读属性。用户范围设置可以更改(有关详细信息,请参阅上一个链接)。
有一个post here讨论改变可能有用的应用程序设置。
如果确实需要在运行时更改应用程序设置,则可能需要实现自己的设置机制,该机制使用XML,注册表或其他内容来存储,检索和更改设置。
希望有所帮助
编辑:
我突然想到我没有正确地阅读你的问题。您的连接字符串不仅可能来自应用程序设置,而且您的表适配器可能绑定到该连接字符串?如果是这样,请参阅this post,它解释了如何注入/更改表适配器的连接字符串。对我来说似乎有点像黑客,但它应该有效。
以下是我使用VB中的Module更新INI文件中的Connectionstring的方法,该方法显示了更新连接字符串的略有不同的方法。
它允许客户端从应用程序中的表单更新连接。表单上的文本框与模块中的Public字符串相关联。按表单上的“保存”按钮可调用模块中的savedbsetup方法。然后,应用程序启动时,它会从创建的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