ASP.NET在运行时修改connectionstring

ASP.NET在运行时修改connectionstring,asp.net,vb.net,connection-string,Asp.net,Vb.net,Connection String,我需要更改数据集连接字符串,以便在运行时指向不同的数据库 我看过许多解决方案,但它们似乎都与WinForms或web应用程序项目或其他与我使用的技术略有不同的技术有关,所以我还没有弄清楚如何应用它们 应用程序就像一场讨论。这是一个基于最初在VS2005下编写的代码的网站项目,目前没有预算(或个人天赋!)进行重大更改。应用程序是用vb.net编写的;我能理解c语言的答案。我在VS2013工作 该应用程序有三个类型化数据集指向一个MDF,称之为“MainDB.MDF”。这三个数据集中有几十个Tabl

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

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

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

该应用程序有三个类型化数据集指向一个MDF,称之为“MainDB.MDF”。这三个数据集中有几十个TableAdapter

我将把应用程序部署为“alpha/demo”版本。我希望对所有用户使用相同的代码库,对每个用户使用单独的MainDB物理版本,以减少用户彼此崩溃的可能性

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

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

在tableapter的每个实例化处更改tableadapter连接字符串将需要太多的代码更改(至少几百个实例化);我只想创建完整的独立站点,而不是那样做。如果我不能在运行时动态更改ConnectionString(或者学习其他方法使这个通用方案工作),那么这就是我的退路

任何关于如何处理这一问题的建议都将不胜感激

谢谢

更新:根据注释,这里是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调用它。在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
Sub-ChangeTableAdapter()
Dim wrkNewConnStr As String=“”
Dim wrkSel作为整数
wrkSel=2
wrkNewConnStr=wrkNewConnStr&“数据源=。\SQLEXPRESS;”
wrkNewConnStr=wrkNewConnStr&“AttachDbFilename=D:\9000\u TestSite\App\u Data\TESTDB1.MDF;集成安全性=True;用户实例=True”
选择Case wrkSel
案例1
wrkNewConnStr=wrkNewConnStr.Replace(“TESTDB1”、“TESTDB1”)
案例2
wrkNewConnStr=wrkNewConnStr.Replace(“TESTDB1”、“TESTDB2”)
案例3
wrkNewConnStr=“数据源=本地主机;初始目录=test01;”
wrkNewConnStr=wrkNewConnStr&“用户ID=testuser1;密码=testuserpw1”
结束选择
尝试
Dim TA作为新的DataSetTableAdapters.NamesTableAdapter
TA.Connection.ConnectionString=wrkNewConnStr
Response.Write(“1-”&wrkNewConnStr)
响应。写入(“
”) Response.Write(“2-”&TA.Connection.ConnectionString) 特例 Dim exmsg As String=ex.消息 Response.Write(exmsg) 结束尝试 端接头
连接字符串:

      <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应用程序项目(带有项目文件)或在实例化每个表适配器时修改它们。所以,虽然我不打算实现它,但我相信这是技术上的答案


如果这个答案太晚了,很抱歉,但我也遇到了完全相同的问题,并最终提出了使用反射的解决方案

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

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

经过测试,工作正常

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

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