2015-09-07 36 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(); 
    }