ASP.NET在运行时

时间:2015-09-07 23:12:03

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

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

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

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

该应用程序有三个指向一个MDF的类型化数据集,称之为" MainDB.mdf"。三个数据集中有几十个tableadapter。

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

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

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

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

任何关于如何处理此问题的建议都将受到赞赏。

谢谢!

更新:根据评论,这里是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。它提供了一个简单的gridview。我尝试从Page_Load,Page_PreLoad,ObjectDataSource_Init和Gridview_Databind中调用它。在结束响应时,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

1 个答案:

答案 0 :(得分:0)

抱歉,如果这个答案为时已晚,但我遇到了完全相同的问题,并最终找到了使用Reflection的解决方案。

我的解决方案是&#34;保存&#34;运行时设置中连接字符串的新默认值,这意味着表适配器的任何进一步使用都使用新的连接字符串。

应该注意术语&#34;保存&#34;当应用程序关闭时,新值会丢失,这会产生误导。

经过测试和完美工作。

    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();
    }