2015-09-07 42 views
0

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

我看了一些解决方案,但他们似乎都与WinForms或web 应用程序项目或其他技术略有不同,因为我使用,所以我还没有想出如何应用它们。

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

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

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

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

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

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

任何关于如何解决这个问题的建议将不胜感激。

谢谢!

UPDATE:每评论,这里是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 

UPDATE的样本实例:下面是测试代码,我在测试现场试图修改的connectionString在一个TableAdapter的单实例。它提供了一个简单的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 

连接字符串:

 <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

UPDATE:这下一个环节被带到了我的注意,并在它的工作我没有得到它的工作,但是,它仍然依赖或者在具有Web应用程序项目(含项目文件)或在实例化时修改每个表适配器。所以,虽然我不打算实施它,但我相信这是技术上的答案。

modifying connection strings

+0

看看适配器模式,你的问题是简单,所以是解决 – Dalorzo

+0

_(改变在tableapters的每个实例TableAdapter的连接字符串需要太多的代码改变(至少几百实例))_你能否给我们提供一个代码示例?适配器现在如何初始化? –

+0

使用tableadapter添加到原始文章 – wayfarer

回答

0

对不起,如果这个答案是为时已晚,但我有完全相同的问题,并最终与使用反射的解决方案上来。

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

应该注意的是,“保存”这个词是误导性的,因为当应用程序关闭时新值丢失。

已完成测试和工作。

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