Buona sera a tutti,
ho creato una classe che inserisce in WebConfigurationManager.ConnectionStrings una connection string dinamicamente. Per farlo ho utilizzato la Reflection, in modo da rendere True l'attributo bReadOnly della collection. Il tutto funziona in ambiente di sviluppo, mentre in area di test mi rende il seguente errore:
Attempt by method 'OS.clsConnectionString.AddSQLConnectionStringFromRegistry(System.String, System.String, System.String, System.String, System.String)' to access field 'System.Configuration.ConfigurationElementCollection.bReadOnly' failed.
Qualcuno può aiutarmi?
Grazie in anticipo. Di seguito riporto la classe.
Imports Microsoft.VisualBasic
Imports System
Imports System.Web
Imports System.Web.Configuration
Imports System.Reflection
Imports System.Data
Imports System.IO
Imports System.Data.SqlClient
Imports System.Configuration
Public Class clsConnectionString
Public Enum ConnectionType
SQL = 0
End Enum
Private _sConnName As String
Private _sDBName As String
Private _sDSName As String
Private _sUser As String
Private _sPwd As String
Public Sub New(ByVal ConnectionType As ConnectionType, ByVal NewConnectionName As String, ByVal DataBaseName As String, ByVal DataSourceName As String, ByVal UserId As String, ByVal Password As String)
_sConnName = NewConnectionName
_sDBName = DataBaseName
If ConnectionType = clsConnectionString.ConnectionType.SQL Then
AddSQLConnectionStringFromRegistry(NewConnectionName, DataBaseName, DataSourceName, UserId, Password)
End If
End Sub
Private Sub AddSQLConnectionStringFromRegistry(ByVal NewConnectionName As String, ByVal DataBaseName As String, ByVal DataSourceName As String, ByVal UserId As String, ByVal Password As String)
Try
Dim csSettings As ConnectionStringSettings = ConfigurationManager.ConnectionStrings(NewConnectionName)
If csSettings IsNot Nothing Then Return
csSettings = New ConnectionStringSettings(NewConnectionName, "Data Source=" & DataSourceName & ";Initial Catalog=" & DataBaseName & ";Persist Security Info=True;User ID=" & UserId & ";Password=" & Password, "System.Data.SqlClient")
Dim cssc As ConnectionStringSettingsCollection = WebConfigurationManager.ConnectionStrings
Dim t As Type = cssc.GetType().BaseType ' System.Configuration.ConfigurationElementCollection
Dim fi As FieldInfo = t.GetField("bReadOnly", BindingFlags.Instance Or BindingFlags.NonPublic)
fi.SetValue(cssc, False)
WebConfigurationManager.ConnectionStrings.Add(csSettings)
Catch ex As Exception
IO.File.AppendAllText(HttpContext.Current.Server.MapPath("~") & "Files\Log\GeneralLog.txt", Now & " " & ex.Message & "<br>" & vbCrLf)
End Try
End Sub
End Class