【问题标题】:ASP.NET modify connectionstring at runtimeASP.NET 在运行时修改连接字符串
【发布时间】:2015-09-07 23:12:02
【问题描述】:

我需要在运行时更改数据集连接字符串以指向不同的数据库。

我查看了许多解决方案,但它们似乎都与 WinForms 或 web 应用程序 项目或其他与我使用的技术略有不同的技术有关,所以我没有想到了解如何应用它们。

该应用程序就像一个讨论。这是一个基于最初在 VS2005 下编写的代码的网站站点项目,目前没有预算(或个人才能!)进行重大更改。该应用程序是用 vb.net 编写的;我可以理解 C# 中的答案。我在 VS2013 工作。

该应用程序具有三个指向一个 MDF 的类型化数据集,称为“MainDB.mdf”。三个数据集中有几十个表适配器。

我将把应用程序部署为“alpha/demo”版本。我想为所有用户使用相同的代码库,并为每个用户使用单独的 MainDB 物理版本,以减少用户相互崩溃的机会。

初始演示访问 URL 将包含查询字符串信息,我可以使用这些信息将用户与正确的物理数据库文件联系起来。我应该能够从查询字符串信息中识别数据库名称,从而识别连接字符串参数(可能在通用连接字符串上使用替换)。如有必要,我可以使用 appsettings 来存储完整的连接字符串,但是,我想避免这种情况。

我希望能够在访问应用程序的入口点页面时更改所有数据集的连接字符串。

在 tableapters 的每个实例化时更改 tableadapter 连接字符串将需要太多的代码更改(至少几百个实例化);我只是制作完整的单独网站而不是这样做。如果我不能在运行时动态更改连接字符串(或学习一些其他方法来使这个通用方案工作),那就是后备位置。

任何有关如何解决此问题的建议将不胜感激。

谢谢!

更新:每个 cmets,这里是 tableadapter 的示例实例

    Public Shared Sub ClearOperCntrlIfHasThisStaff( _
    varSesnID As Integer, varWrkprID As Integer)

    Dim TA As GSD_DataSetTableAdapters.OPER_CNTRLTableAdapter

    Dim DR As GSD_DataSet.OPER_CNTRLRow
    DR = DB.GetOperCntrlRowBySesnID(varSesnID)

    If IsNothing(DR) Then
        Exit Sub
    End If

    If DR.AField = varWrkprID Then
        DR.AField = -1
        TA.Update(DR)
        DR.AcceptChanges()
    End If

End Sub

更新:下面是我在测试站点中尝试在 tableadapter 的单个实例中修改 connectionString 的测试代码。它提供了一个简单的网格视图。我尝试从 Page_Load、Page_PreLoad、ObjectDataSource_Init 和 Gridview_Databind 调用它。在最后的 response.writes 中,wrkNewConnString 看起来更改为 TestDB2,TA.Connection.ConnectionString 值看起来更改为 TestDB2,但显示的 gridview 数据仍然来自 TestDB1。也许它需要从其他地方调用?

Sub ChangeTableAdapter()
    Dim wrkNewConnStr As String = ""
    Dim wrkSel As Integer
    wrkSel = 2

    wrkNewConnStr = wrkNewConnStr & "Data Source=.\SQLEXPRESS;"
    wrkNewConnStr = wrkNewConnStr & "AttachDbFilename=D:\9000_TestSite\App_Data\TESTDB1.MDF;Integrated Security=True;User Instance=True"

    Select Case wrkSel
        Case 1
            wrkNewConnStr = wrkNewConnStr.Replace("TESTDB1", "TESTDB1")
        Case 2
            wrkNewConnStr = wrkNewConnStr.Replace("TESTDB1", "TESTDB2")

        Case 3
            wrkNewConnStr = "Data Source=localhost; Initial Catalog=test01;"
            wrkNewConnStr = wrkNewConnStr & " User ID=testuser1; Password=testuserpw1"
    End Select

    Try
        Dim TA As New DataSetTableAdapters.NamesTableAdapter
        TA.Connection.ConnectionString = wrkNewConnStr

        Response.Write("1 - " & wrkNewConnStr)
        Response.Write("<br/>")
        Response.Write("2 - " & TA.Connection.ConnectionString)

    Catch ex As Exception
        Dim exmsg As String = ex.Message
        Response.Write(exmsg)
    End Try
End Sub

连接字符串:

      <add name="TestDB1ConnectionString" 
       connectionString="Data Source=.\SQLEXPRESS;
AttachDbFilename=D:\9000_TestSite\App_Data\TESTDB1.MDF;Integrated Security=True;User Instance=True"
      providerName="System.Data.SqlClient" />

更新:下面的帖子有很多解决方案,但是,它们似乎专注于 Web 应用程序项目,这些项目有一个带有设置的项目文件,而这个网站项目没有。

link with possible solutions

更新:这个下一个链接引起了我的注意,在处理它时我确实让它工作了,但是,它仍然依赖于拥有一个 Web 应用程序项目(带有项目文件)或修改每个表适配器,因为它们被实例化。所以,虽然我不打算实现它,但我相信这是技术上的答案。

modifying connection strings

【问题讨论】:

  • 看看适配器模式,你的问题很简单,解决办法也很简单
  • (在 tableapters 的每个实例化时更改 tableadapter 连接字符串将需要太多的代码更改(至少几百个实例化)) 您能否为我们提供一个代码示例?适配器现在是如何初始化的?
  • 添加到原帖中的 tableadapter 使用示例
  • @Dalorzo:我可以称之为经验丰富的业余程序员。所以,不幸的是,不知道你的评论该去哪里;如果你能提供更多信息,也许我可以探索一下。
  • 虽然我想我可以搜索“tableadapter”的所有用途,并添加一个对更改连接字符串的例程的调用,如果这可行,并且它是否可以相当通用。我必须考虑对项目的影响以及“破坏”代码的风险。然后我可以让例程“什么都不做:如果/当它转移到生产环境。虽然我希望在那一点上彻底重写。问题是,这行得通吗?我尝试了一个在运行时更改单个 tableadapter 的测试用例,并且可以不让它工作。

标签: asp.net vb.net connection-string


【解决方案1】:

对不起,如果这个答案为时已晚,但我有完全相同的问题,最终想出了一个使用反射的解决方案。

我的解决方案是在运行时在设置中为连接字符串“保存”一个新的默认值,这意味着对表适配器的任何进一步使用都会使用新的连接字符串。

应注意,“保存”一词具有误导性,因为当应用程序关闭时新值会丢失。

已经过测试并且运行良好。

    public void ChangeDefaultSetting(string name, string value)
    {
        if (name == null)
            throw new ArgumentNullException("name");

        if (value == null)
            throw new ArgumentNullException("value");

        Assembly a = typeof({Put the name of a class in the same assembly as your settings class here}).Assembly;
        Type t = a.GetType("{Put the full name of your settings class here}");
        PropertyInfo propertyInfo = t.GetProperty("Default");
        System.Configuration.ApplicationSettingsBase def = propertyInfo.GetValue(null) as System.Configuration.ApplicationSettingsBase;

        //change the "defalt" value and save it to memory
        def[name] = value;
        def.Save();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2017-11-17
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多