2010-03-09 36 views
9

¿Es posible cambiar el valor ConnectionString en un app.config en tiempo de ejecución? De acuerdo con the MSDN documentation debería ser posible ya que la propiedad ConnectionString "Obtiene o establece la cadena de conexión".¿Se puede cambiar el valor de configuración de ConnectionString en el tiempo de ejecución?

Mi código es el siguiente:

ConnectionStringSettings mainConnection = ConfigurationManager.ConnectionStrings["mainConnection"]; 
mainConnection.ConnectionString = "Data Source=SERVER;Initial Catalog=" + NewDatabaseName + ";Integrated Security=True"; 

El error que recibo es la siguiente: "Excepción no controlada: System.Configuration.ConfigurationErrorsException:. La configuración es de sólo lectura"

+0

¿podría explicar por qué desea para cambiar la cadena de base de datos/conexión en tiempo de ejecución?. – ram

+0

Estoy migrando contenido de una versión anterior de una biblioteca a una nueva versión de la biblioteca; ambas versiones usan el mismo nombre de cadena de conexión, pero quiero leer desde una base de datos y escribir en otra base de datos. –

+0

Me acabo de dar cuenta de que escribí web.config en mi publicación, quise decir app.config (actualizado para reflejar el cambio). –

Respuesta

17
Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
    myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text; 
    myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text; 
    myConfiguration.Save(); 

Ref: http://www.beansoftware.com/ASP.NET-Tutorials/Modify-Web.Config-Run-Time.aspx

+6

+1: solo una pequeña modificación: si desea volver a leer el nuevo valor del archivo de configuración sin la necesidad de reiniciar la aplicación, actualice el archivo después de guardarlo llamando a lo siguiente: * System.Configuration. ConfigurationManager.RefreshSection ("connectionStrings"); * –

+4

Esto funcionó, aunque estaba en una aplicación de consola, así que tuve que usar una línea diferente: Configuración myConfiguration = ConfigurationManager.OpenExeConfiguration (exeFilePath); Tenga en cuenta que esto cambia el archivo de configuración física. –

0

No estoy muy seguro de por qué quiere cambiar constantemente su web.config en tiempo de ejecución (no recomendado), pero mire aquí para obtener más información.

Writing to .NET Web.config

Lo principal aquí es que su web.config necesita haber leído y escribir permisos en la cuenta de que el proceso se está ejecutando como ASPNET.

+0

No estoy seguro de por qué esto fue downvoted. Usted proporcionó una recomendación que indica que esta no es una buena práctica y también proporcionó lecturas adicionales sobre el problema que solicitó el OP. – gcoulby

-1

estoy adivinando lo que está viendo es un error del compilador, y no un error de tiempo de ejecución. La clase que está utilizando es un método generado a partir de la configuración de la aplicación, y las propiedades generadas solo tienen un getter en la propiedad y ningún setter. Es por eso que recibes ese error.

Para cambiar la propiedad, debe usar la clase de configuración y usar la propiedad AppSettings, pasando la cadena para la clave. Luego puede llamar al método Configuration.Save.

+1

Es un ConnectionStringSetting, no un AppSetting, y definitivamente no es un error de compilación. Lo extraño es que la documentación dice que puedo * establecer * el valor. –

-1

No se recomienda cambiar la cadena de conexión utilizando web.config en el tiempo de ejecución.
Sugeriría mantener estas conexiones en un archivo diferente e implementar un archivo vigilante para verificar si el valor de estos parámetros ha cambiado.

0

connectionStrings-Section is readonly. Necesito cambiar solo durante la sesión, p. consulta de base de datos con una cuenta de solo lectura y después de las operaciones de actualización/modificación de validación con una cuenta otorgada.

Entonces mi solución es un connectionString en appSettings-Section, que se puede modificar durante el tiempo de ejecución.

En Web.config: <appSettings> <add key="dbconnectionstr" value="Database=...;Host=...;Password=...;Username=..."/> </appSettings>

En SQLDataSource: <asp:SqlDataSource ID="datasource1" runat="server" ConnectionString="<%$ AppSettings:dbconnectionstr %>" .... </asp:SqlDataSource>

Y al Código: WebConfigurationManager.AppSettings["dbconnectionstr"] = newonnectionString;

Cuestiones relacionadas