Introducción
Es muy común tener que definir parámetros en las aplicaciones que se desarrollan proporcionando cierta configuración que si bien se podría considerar casi estática (porque no cambia constantemente), si sea necesario prever la posibilidad de adaptación.
Un ejemplo muy claro de estos es la cadena de conexión a la base de datos, por lo general una vez instalada la aplicación no cambia, pero cuando se esta en la etapa de implementación seguramente sea necesario su adaptación al entorno.
Por lo general se busca que sea un lugar que impacte lo menos posible en el desarrollo, algunos tienden a crear una clase y colocar constantes o variables readonly dentro del propio código, pero el problema con esto es que requieren recompilar por completo el desarrollo, además de tener que actualizar cada cliente por un simple cambio de configuración.
También se busca un lugar estándar y conocido, algunos usan la registry de windows para definir configuración, quizás era una opción se algo mas viable cuando se contaba con Win XP, pero con Sistemas Operativos como ser Vista o Win 7 esto cambio bastante, el modelo de seguridad que estos imponen aplica restricciones a estas acciones, no haciendo tan cómoda la escritura en este sitio.
Entonces porque no usar la propuesta que hace .net al respecto, si se trata de los archivos de configuración, entre las ventajas que este presenta se pueden encontrar:
- una lectura simple, ya que se basa en xml
- fácil acceso y modificación (se puede editar con el notepad), por lo general este archivo se encuentra junto a la aplicación por lo que la seguridad debería permitir la escritura en esta carpeta
Entre los temas que se trataran en este articulo
1- Agregar un archivo de configuración a nuestro proyecto
2- Definir una sección key-value
2a- usando la sección appSettings
2b- definiendo una sección propia
1- Agregar un archivo de configuración a nuestro proyecto
Si bien es una acción sencilla, si recién se esta introduciendo en el desarrollo, puede que no resulte tan intuitivo encontrar los pasos para agregar un archivo de configuración.
Estando sobre el proyecto en el “Solution Explorer”, se acciona el menú que aparece con el boton derecho del mouse, seleccionado el menu Add –> New Item…
en el recuadro se seleccionara la opción:
Esto agregar un archivo de nombre App.config, que en una primer instancia tendrá solo un tag.
Empecemos por una tarea simple, la lectura de una cadena de conexión.
Para lograr esta tarea se necesitara la ayuda de una clase en particular, me refiero al
con esta clase tendremos acceso a los tag de información definidos, pero para hacer uso de la misma se requiere hacer referencia a la librería System.Configuration, los pasos para esta acción serian representados en la siguiente imagen:
Solo queda agregar el código que tomaría la información del archivo de configuración, usándolo luego con los objetos de ado.net para conectarse
En el punto 1 se define el “using” a la librería referenciada en el paso anterior (definiendo así su namespace), mientras que en el 2 se hace uso de la clase ConfigurationManager para tomar la cadena de conexión.
Por supuesto en el archivo de configuración se debió agregar la key que se define en el .config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="default" connectionString="Data Source=LecturaConnectionString\TestDb.sdf;Persist Security Info=False;"/> </connectionStrings> </configuration>
2- Definir una sección key-value
Definir información del tipo key-value en el archivo de configuración puede realizarse de varias formas
- usando la sección appsetting
- por medio de una seccion custom creada por uno
2a- Usando AppSetting
Esta es la forma más simple y directa de definir valores simples en la configuración, solo basta con ingresar en la sección <appSettings> el tag “add” con cada item que se requiera.
En el ejemplo se observará la sección definida como:
<appSettings> <add key="1" value="Efectivo" /> <add key="2" value="Tarjeta Credito" /> <add key="3" value="Tarjeta Debito" /> <add key="4" value="Cheque" /> <add key="5" value="Transferencia Bancaria" /> </appSettings>
En el código, en el Form2, se trabaja con esta información con al ayuda de linq para cargar un combo
private void Form2_Load(object sender, EventArgs e) { var result = (from configKey in ConfigurationManager.AppSettings.Keys.Cast<string>() let configValue = ConfigurationManager.AppSettings[configKey] select new { key = configKey, value = configValue }).ToList(); cmbMediosPago.DisplayMember = "value"; cmbMediosPago.ValueMember = "key"; cmbMediosPago.DataSource = result; }
Acceder a un ítem en concreto es tan simple como usar
ConfigurationManager.AppSettings[key]
private void cmbMediosPago_SelectionChangeCommitted(object sender, EventArgs e) { string key = Convert.ToString(cmbMediosPago.SelectedValue); string value = ConfigurationManager.AppSettings[key]; lblSeleccion.Text = string.Format("Se ha seleccionado\n Key:{0} \n Value:{1}", key, value); }
2b- Definiendo una sección propia
El uso de la sección <appSettings> en algunas circunstancia puede resultar demasiado genérico y no brindar un lugar que sea claramente identificable para el negocio que se esta programando, esta sección al ser tan común se puede llenar rápidamente de items key-value no relacionados, haciendo difícil el mantenimiento.
Pero existe una alternativa a este problema y consiste en crear una sección propia para conserva estos pares key-value de forma personalizada, otorgando una visibilidad con sentido para la aplicación
En el código del Form3 se implementa la solución usando una sección definida por uno mismo, la cual aplica el mismo concepto key-value.
<configuration> <configSections> <section name="MediosPago" type="System.Configuration.DictionarySectionHandler" /> </configSections> <MediosPago> <add key="1" value="Efectivo" /> <add key="2" value="Tarjeta Credito" /> <add key="3" value="Tarjeta Debito" /> <add key="4" value="Cheque" /> <add key="5" value="Transferencia Bancaria" /> </MediosPago> </configuration>
Para recuperar la información y listarla
private void Form3_Load(object sender, EventArgs e) { var result = (from config in ((Hashtable)ConfigurationManager.GetSection("MediosPago")).Cast<DictionaryEntry>() select new { key = config.Key, value = config.Value }).ToList(); cmbMediosPago.DisplayMember = "value"; cmbMediosPago.ValueMember = "key"; cmbMediosPago.DataSource = result; cmbMediosPago.SelectedIndex = -1; }
Obtener un ítem basándonos en la key requiere recuperar la sección completa para luego si acceder al valor
private void cmbMediosPago_SelectionChangeCommitted(object sender, EventArgs e) { string key = Convert.ToString(cmbMediosPago.SelectedValue); string value = ((Hashtable)ConfigurationManager.GetSection("MediosPago"))[key].ToString(); lblSeleccion.Text = string.Format("Se ha seleccionado\n Key:{0} \n Value:{1}", key, value); }
Por supuesto tanto en estos ejemplo hacer uso de las clase de configuración para tomar el valor del ítem seleccionado, no tiene un sentido practico, ya que el propio combobox proporciona ambos datos key y value (usando el SelectedValue y SelectedText), solo se realiza con fines ilustrativos para poder aplicar los conceptos de programación con el archivo de configuración.
Código de ejemplo
[C#] |
[VB.NET] |
Hola Leandro, primero que nada agradecerte tu gran trabajo, he aprendido muchísimo gracias a tus artículos.
ResponderEliminarAhora solo para molestarte si pudieras arreglar las ligas de las imágenes... Este tema me interesa mucho y como que si faltan las imágenes para saber de que estas hablando. Salu2
hola Ulises
ResponderEliminarespero lo mas pronto que pueda solucionar el problema que tengo con el hosting
mientras tanto si necesitas ver las las imagenes y archivos reemplaza el dominio ltuttini.com.ar por http://200.58.122.109/ltuttini.com.ar
por ejemplo, una de las imagenes dice:
http://www.ltuttini.com.ar/blogfiles/WinForms/ConfigSeccionesPropias/Parte1/imagen1.jpg
con el cambio quedaria:
http://200.58.122.109/ltuttini.com.ar/blogfiles/WinForms/ConfigSeccionesPropias/Parte1/imagen1.jpg
este problema es temporal, por eso no actualizo el articulo
saludos
Mil gracias!! ahora si ya entendí todo :-D
ResponderEliminarSaludos leandro,
ResponderEliminares muy buena la utilidad de este proceso, pero al momento de ejecutar la aplicación y cambiar los valores de la configuración, no carga los valores actualizado, a que se debera?
hola Unknown
ResponderEliminarno se si entendi del todo
al cambiar los valores en que momento ? porque si es desde codigo recuerda que debes realizar un Refresh de la seccion de configuracion para que la tome
saludos
Hola Leandro me intereso ese ejemplo. Pero tengo una duda si utilizo ya sea el appsetting o conexion string se puede modificar cuando la aplicacion se este ejecutando? He podido modificarlo pero me obliga a salir y volver a entrar al sistema para que se refleje el cambio. Saludos
ResponderEliminarhola Josengan
ResponderEliminarpor lo general no se recomiendo cambiar informacion de configuracion mientras la aplciacion se ejecuta
pero si tienes un .exe ejecutandose y editas el .config al realziar la lectura con el ConfigurationManager deberia tomar el cambio
sino habria que evaluar de usar
ConfigurationManager.RefreshSection
saludos
Hola Leandro, por favor ayudame:
ResponderEliminarRealizé un proyecto en 3 capas, siguiendo tambien tu tutorial e inclui un archivo app.config para los connectionstring, me funciona a la perfeccion..
Ahora necesito tener un instalador de la aplicacion, y surge el siguiente problema:
Estoy utilizando visual studio para hacer este instalador: arrastro el hasta el proyecto de instalacion archivo.exe(ejecutable) de mi proyecto y este como esta referenciado por defecto me carga las dll de las capas de datos y negocio... pero el archivo app.config no se agrega automaticamente, yo lo agrego como un archivo.... compilo el proyecto de instalacion, instalo mi aplicacion sobre el Sistema Operativo, al momento de ejecutar la aplicacion desde el SO como un programa independiente no se lee el app.config....
Estoy utilizando .Net Framework 4.
Insisto mientras estoy desarrollando, la utilizacion del .config va de maravilla, pero cuando llega la hora de instalar la aplicacion llega el problema...
Como resuelvo esto..???
Muchas gracias...
Espero tu pronta respuesta....
hola GABRIEL
ResponderEliminarel tema es que si lo arrastras como archivo este toma el nombre de App.config, cuando deberia tomar el NombreAplicacion.exe.config
o sea se renombra, esto lo puedes validar en el bin\Debug
lo raro es que en el instalador no incluya de forma automatico el config, hasta donde se deberia incluirlo dentro de la opcion de primary output
saludos
Hola Leandro, disculpa, tengo la necesidad de hacer exactamente lo mismo pero en asp.net con visual
ResponderEliminarestoy utilizando visual studio 2010 y esque quiero optimizar mi codigo porque cada webform tengo una cadena de conexión me podrias recomendar como configurarlo para tnerlo ubicado en un solo lado .. de ante mano muchas gracias
hola Valex
ResponderEliminaraplica de la misma forma, el ConfigurationManager lo puedes usar tambien en un entorno web
quizas la diferencia este en el uso del web.config en lugar del app.config
saludos
Hola leandro... fijate que tengo un problema como el que mencionas. sucede que tengo que cambiar mi base de datos de servidor, tenia mi cadena de conexion en una clase, pero ahora tengo que dejarla de manera que al volver a cambiar de servidor o algo asi no tener que volver a programar, se puede hacer con los archivos de configuracion? pero que parametros deberia de declarar y como usarlos despues? gracias.
ResponderEliminarpor cierto estoy trabajando con vb.net 2008 y sql 2005
ResponderEliminarhola Samanta
ResponderEliminarsi por medio del app.config puede definir la informacion de conexion a la base de datos, como planteo en a primer parte del articulo
lo escrito en el config se puede editar luego con el notepad sin necesidad de volver a compilar si requieres cambiarlo
para acceder a la info usarias el ConfigurationManager
saludos
entonces esta opcion en el app.config es mas viable que la de usar un dsn de los registros de windows??es que comenzando a entender el funcionamiento de estas.
ResponderEliminary otra consulta.. el archivo que se va a modificar en el block de notas, lo hago antes o despues de crear el ejecutable, y es el que encuentro a en bin/debug ? la verdad es primera vez que haria esto , por eso tantas preguntas. gracias por tu atencion.
ResponderEliminarDe cualquiera de las 2 maneras que lo haga igual tendria que volver a instalar la aplicacion en las maquinas que la usan?
ResponderEliminarhola Samanta
ResponderEliminarusar el config es mas flexible que definirlo en cualquier otro lugar
el archivo de configuracion que defines como app.config se copia al bin\Debug con el nombre NombreApp.exe.config, y debes llevar este junto al .exe
si lo vas a actualizar puedes hacerlo directo en la pc del usuario sin necesidad de volver a copiar todo, o instalar
es solo un archivo xml que editas cuando quieres cambiar algo
saludos
Hola leandro gracias por todos tus aportes son buenazos.. puedes ayudarme quiero capturar el valor de la cadena de conexion desde una tabla en mi base de datos y quiero asignarla a mi llave en el appconfig... me podrias ayudar
ResponderEliminarhola Unknown
ResponderEliminarpero eso no seria contradictorio, o sea si debes recuperar la cadena de conexion de la db como sabes como conectarte a esta ?
o la ides es tener dos bases de datos
una db de configuracion y otra a la cual te conectarias
puedes modificar desde codigo el config
http://social.msdn.microsoft.com/Forums/es-ES/20a0f0aa-884d-4579-939c-43ca985c91db/cambiar-valores-a-appconfig-desde-un-form
saludos
claro leandro pero esta cadena que quiero extraer me la va a dar un servicio web que me dara a que servidor deseo entrar es por eso que quiero configurar de esa manera ya que utilizo clic once y la cadena de conexion esta expuesta la idea es que un servicio me de la cadena para acceder a mi sistema ya que en ese servicio la cadena esta oculta en el servidor.. podrias ayudarme saludos
ResponderEliminarhola Unknown
ResponderEliminarpodrias recuperar la cadena de conexion desde el servicio y modificar la config para poner ese valor que recibas
el config se puede grabar desde codigo
saludos
Gracias por tu comentario leandro exelente solucion ya la concrete la solucion que me diste ... Una consulta sobre lector de huellas con vb.net podrias guiarme como realizar uno para solucionar acceso a sistemas... debo leer el acceso medienate un lector de huellas... tengo este lector de huellas Eikon - lector de huella digital saludos
ResponderEliminarhola Unknown
ResponderEliminarvas a necesitar de las librerias para poer interactuar con el lector de huellas, por lo general el fabricante las proporciona, podrias consultarle
tambien podrias ver si algun SDK existente tiene compatibilidad con el lector
cuando tengas las librerias solo sera cuestion de referenciarlas en tu codigo y usar su funcionalidad para interactuar con el hard del lector
saludos
Leandro, me parece excelente el post, felicidades, tengo un problema, al trasladar mi .exe junto con el app.config que me genera el compilado y cambio su configuracion para probar, no lo toma, me podrias ayudar en esto? Agradecido
ResponderEliminarhola Jesus
ResponderEliminarrecuerda que el app.config directamente con ese nombre no es reconocido, sino que deberia ser
NombreAplicacion.exe.config
si vas a la carpeta \bin\Debug veras alli el .exe y junto a este el config con este formato, cuando lo lleves a otra pc debes ponerlo de esa misma forma
saludos
hola leandro una ayuda como puedo agregarle una nueva cadena de conexion a mi app.config que se creee por medio de un formulario.
ResponderEliminarhola jose
ResponderEliminarsimplemente agrega un nuevo tag <add> dentro del <connectionStrings>
por supuesto la key deberia llevar otro nombre, puedes definir varios connection string
saludos
En mi caso, querría poder iniciar la aplicación seleccionando un fichero de configuración. ¿podría indicar cualquier nombre de fichero de configuración? EJ:
ResponderEliminarMiApp.exe.config
OtroparaMiApp.exe.config
hola Unknown
ResponderEliminarpodrias usar el
ConfigurationManager.OpenExeConfiguration Method (String)
para poder leer la config de otra aplicacion y trabajarla
saludos
Hola Leandro, Gracias por responder, tiene la configuracion de nombres como me indicas y nada, estoy haciendo algo mal y no se que es, no me toma los parametros, es como si estuviera tomando los valores que se impusieron cuando se compilo, mi compilacion es a nivel de Release, no lo hice en modo Debug, tiene algo que ver eso? Gracias por tu atención y disculpa tanta molestia, un abrazo
ResponderEliminarhola Jesus
ResponderEliminarvalidaste qne en la carpeta \bin\Release este el .exe y el .config ?
que pasa si intentas ejecutas en modo Debug, funciona ? solo para descartar que sea el modo el que causa el problema
saludos
Hola Leandro:
ResponderEliminartengo un problema cuando coloco
String coneccion = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
en ejecucion me salta el error
{"Referencia a objeto no establecida como instancia de un objeto."}
no entiendo ya que la clase ConfigurationManager es estatica
muchas gracias
hola nicovm
ResponderEliminarese erro se produce cuando el ConfigurationManager no puede encontrar la key que indicas en el config
no es la clase ConfigurationManager la que lanza el error por no instanciarla, sino porque no encuantra la key en el config
el proyecto que defines como inicio para ejecutar, es alli donde defines el app.config ?
saludos
Hola!
ResponderEliminarPrimero que nada excelente el aporte que haces!
Mi inquietud es que si para los reportes (Crystal Reports for VS 2010) también puedo usar un archivo de configuración para conectarme a la base de datos???, y así poder hacer mi aplicación mas portable y no tener que estar compilando el código, cuando tenga que cambiar de base de datos.
hola isiliun
ResponderEliminarla verdad no aconsejaria conectar un reporte de Crystal directo a la db, sino que usarias dataset tipados o colecciones, estas las cargaria usando ado.net y luego las asignaria como ReportSource al reporte
se puede cambiar la conexion del reporte si es que lo conectas directo, pero no es algo que crystal lo realice automatico, sino que desde codigo deberias cambiarlo
Agregar el código de conexión del informe
saludos
HOla leandro, bien tengo pregunta yo estoy realizando una aplicacion en asp.net en la cual en una biblioteca de clases estan mis dbml en la misma se crea un app.config con las cadenas de conexion de la base. pues bien al publicar mi aplicacion se genera un ddl de esa biblioteca de clases la cual por referencia utiliza mi aplicacion web, pero no se como puedo hacer que mis dbml tome las cadenas de mi webconfig y no del app.config de antemano gracias por tu repuesta espero me puedas ayudar.
ResponderEliminarhola Paul
ResponderEliminarsi estas en un entorno web no va ningun app.config porque no te lo va a reconocer
deberias volcar las secciones de configuracion en el web.config es el unico valido para tener la config del sitio
para que la tome del web.config solo definela dentro de este y listo, deberia tomarla de forma automatica
saludos
Excelente tu post, muchas gracias!
ResponderEliminarUna duda, una vez que se hace un publish de la aplicación y esta es instalada es posible modificar los datos que se guardan en el xml y que la aplicación los lea?
Saludos!
hola xosel
ResponderEliminarclaro esa es la idea
una vez publicado puedes ir con el notepad y cambiar los datos del xml de config
el config en definitiva es un archivo de texto con xml
saludos
Hola Leandro en este articulo nos enseñas como leer una seccion personalizada ¿hay forma de modificar los datos de esa seccion?
ResponderEliminarhola Rocio
ResponderEliminarsi se puede cambiar desde codigo
App.Config Dinamico
saludos
¡Buen día, Amigo Leandro Tuttini!;
ResponderEliminarInteresante tus artículos, sobretodo este que vine de referencia desde el MSDN.
Soy usuario de allá, y buscando algo referente a cadenas de conexión, en cuanto a mejores prácticas y uso dentro del App se refiere, salí de dudas con este excelente artículo.
Pero (como siempre) uno a veces lo acompañan más dudas y unas de ellas son ilustradas a continuación:
Pasa es que en mi AppDesktop siempre llamo a SELECT's y/o StoredProcedure's, y tengo que estar colocando la cadena de conexión. Es decir, siempre conectando a la DB con credenciales y luego la consulta.
En esos casos, no es necesario el "Open()". (o no lo he requerido).
Esto comúnmente (o por lo que abarca mi conocimiento) requiere un pequeño lapso de tiempo.
¿Es necesario mantener una conexión abierta al abrir la App?
¿Cuál es la forma más óptima que las consultas a SQL tarde lo mínimo en establecerse e ir directo al procedimiento?
Tengo consultas optimizadas, y desde el Management de SQL Server lo he comprobado (no duran más de 1 seg.).
Agradecido estaría de tu comprensión y respuesta ofrecida.
Ten feliz día.
Agradecido.
Y una última consulta basado en seguridad.
ResponderEliminarMe gusta la opción de llevar mi configuración por el XML por que lo noto mucho más limpio, separado y dinámico.
Ahora ¿Cuál sería la mejor forma de administrar el usuario y contraseña en la conexión? Dado que el .XML puede ser editado o visualizado ¿No?
¿En que lugar o como podría cifrar dichos parámetros para la vista del usuario?
Un saludo amigo.
hola José
ResponderEliminarse puede encriptar una seccion del config para que no pueda ser vista
Encrypting and Decrypting Configuration Sections
saludos
Hola Leandro:
EliminarMuchas gracias por la información, pero tengo un par de dudas, ojalá puedas ayudarme con esto:
1) Un app.config (no un web.config usando IIS) puede ser encriptado/desencriptado sin necesidad de usar IIS?, o sea, la clave "server='abc';uid=sa;password=123" podría quedar "...password=xAS!"#sASD" ???
2) Me urge leer el app.config de otro proyecto, ambos estan en la misma carpeta, pero a pesar que uso el open no me permite, me sale error de acceso y ambos existen, pero parece ser un tema de seguridad, lo otro es que uso EF6 y la cadena no es como una de ADO sino que le agrega metadata y complica la cosa como para sacar el username y database, servername.
Gracias
hola
EliminarPara encriptar el app.config se utiliza el mismo comando de asp.net, o sea el aspnet_regiis.exe, esto si quieres realizarlo desde linea de comando, porque tambien se podria realizar usando codigo
Encrypting App.config For Multiple Machines
Para leer otro .config entiendo deberia accederse usando ConfigurationManager.OpenExeConfiguration()
Using External Configuration Files in .NET Applications (C#)
saludos
Agradecido, amigo Leandro por la documentación. Excelente entonces para la seguridad cuando es necesaria.
ResponderEliminarY ya me leí algo con el PoolConnection más referente arriba, y documentándome, lo estaba realizando de igual modo, pero desde el AppConfig lo noté más óptimo y seguro.
Ten feliz día.
Saludos.
Hola Leandro, seguro yo puedo crear varios archivos de configuracion en un mismo proyecto, sin embargo estyo ya algunos días intentado resolver el problema pero al parecer la invocacion a los archivos de configuracion externo no logran inicializar las secciones y la aplicacion no levanta, me puedes orientar con un ejemplo por favor.
ResponderEliminarhola Santiago
ResponderEliminarno importa cuantos archivos de configuracion definas en lso distintos proyectos cuando ejecutes solo tomara uno solo que corresponde al proyecto que inicia
si es un desarrollo winforms entonces sera este quien tiene que tener todas las secciones de configuracion que requieran ese y los demas proyectos
saludos
Gracias, entenídí y por fin logre hacer lo que deseaba. saludos
ResponderEliminarComo puedo leer los valores si cambié de nombre al App.config???
ResponderEliminarhola Jaime
ResponderEliminary porque has cambiado el nombre al App.config ?
recuerda que este cuando compila ya cambia de nombre siendo (lo puedes ver en el \bin\Debug)
NombreProyecto.exe.config
porque necesitarias cambiarlo de con otro nombre
saludos
Hola Leandro, excelente post, pero tengo una duda, tengo varios servicios de windows que se conectan a una base de datos en SLQ Server, cada servicio tiene su respectivo app.config con la connection string y hasta ahi todo funciona perfecto, mi duda es ya que la base de datos es la misma y los servicios se encuentran en la misma ruta, es posible que estos se conecten a un solo app.config ? me refiero a que en lugar de que yo tenga muchos archivos de configuracion (servicio1.exe.config, servicio2.exe.config, servicion.exe.config.... ) tuviera solo uno para todos los servicios, pues cuando tenemos que migrar base de datos, es tedioso andas modificando archivo por archivo, es posible hacer esto?
ResponderEliminarhola Ignacio
ResponderEliminarhasta donde se, no se puede, ya que cada config tiene el nombre de la aplicaicon con la cual se relaciona
bueno podrias cargar el config mediante codigo, pero ya no seria automatico como reconce la configuracion
me parecio ver en algun momento que habia un atributo que permitia definir una seccion en un archivo separado, pero no estoy seguro si se pueda con el connection string
saludos
Hola leandro quisiera saber como configurar el appconfig para poder conectar dos proyectos de consola para transformarlo en uno solo ya que los dos interactuan ,como debo hacerlo ayudame porfavor
ResponderEliminarhola SEBAXD
ResponderEliminarpero si cada proyecto de consola compila en su propio .exe, entonces cada uno tendra su propio archivos de configuracion
salvo que uno de ellos use el
ConfigurationManager.OpenExeConfiguration Method (String)
para tomar el config en base al nombre del otro .exe, pero no se si eso es lo que buscas
saludos
Hola leandro, tengo una aplicación de escritorio diseñada con c# y linq to sql, como puedo modificar la cadena de conexión del archivo .dbml, esto x si una máquina cliente intenta conectarse com la maquina servidora
ResponderEliminarhola Aquiles
ResponderEliminarhasta donde se el dbml define una entrada en el config con la cadena de conexion
How to change connection string of a dbml file ( LINQ 2 SQL ) dynamically using app.config
aunque por lo que veo no es tan directo
saludos
Hola leandro, muy buena la información, tengo el siguiente problema, una parte de mi codigo se conecta mediante Linq y Entity Framework, mientras que otra parte se conecta con sql, es decir sqlconnection, sql.command, sql.DataReader, etc. (SqlConnection hace referencia a SqlConnection(Properties.Settings.Default.Settings1)) ahora a la hora de modificar el App.Config logro modificar solo lo referido a Linq pero lo demas no logro modificarlo. Sabras en que estoy fallando? debo utilizar completamente Linq. (ya que asi lo plantee en el codigo?)... espero me haya explicado bien y puedas ayudarme, saludos
ResponderEliminarYa esta solucionado, lo que hice fue justamente utilizar todo Linq to Entity Framework y alli la solución, es que desde un comienzo no sabia aplicar Procedimiento almacenado con Entity Framework, investigue, lo aplique y listo. Solucionado. Saludos
ResponderEliminarHola, excelente explicación Leandro, estoy tratando de modificar los valores del archivo de configuración por código pero no lo consigo, podrías complementar tu ejemplo incluyendo el código para actualizar los valores. gracias
ResponderEliminarhola
Eliminarestas intentando hacer algo como esto
Update AppSettings and custom configuration sections in App.config at runtime
saludos
Buenas, tengo una app de configuracion donde tengo una consulta sql que llama unas tablas en sql server, y necesito que me coja ciertos parametros para filtar, que tengo tambien en ese mismo fichero de configuracion como el usuario.¿ Como puedo coger el parametro del usuario y utilizarlo como filtro en la consulta? muchas gracias.
ResponderEliminarBuenas tardes Leandro, primero que todo muchas gracias por este aporte, muy interesante. Por otro lado quisiera saber si de pronto sabe como puedo utilizar varios archivos de configuración, es que me interesa sacar los querys o sentencias SQL del código fuente y ponerlos en archivos para su mejor mantenimiento. Agradezco su colaboración y si depronto sabe de algún link donde pueda investigar le agradezco me regale ese dato.
ResponderEliminarhola
Eliminarlas queries no se definen en los archivos de configuracion, si quieres sacarlas para un mejor rendimiento imagino buscas utilizas Store Procedure
No se que base de datos usas, pero por ejemplo sql server permite crear procedure para definir alli las queries
saludos
Hola leandro, cordial saludos... muy interesante tu aporte pero me gustaría que me ayudaras en como hacer un archivo de configuración de la creación de una base de datos en sql server, es decir que cuando mi aplicación se instale , la base de datos se cree con un archivo .config,.. agradecería tu ayuda.. un abrazo
ResponderEliminarhola
EliminarMe temo que desde un archivo config no vas a poder hacer esto que planteas porque no tienen esa funcionalidad
En el config puedes definir el conection string de la db a la cual conectarte, pero no crearla
Para crearla requieres de un script que defina los CREATE DATABASE, o CREATE TABLE, etc
Un archivo script podria ser un simple acrivo de texto con extension .sql que leas desde codigo y ejecutes
saludos
Hola Leandro.
ResponderEliminarTengo una aplicación VB.net 2010. Es un Complemento de Ms Project 2010. Al compilar la aplicación, los parámetros que definí en mi App.config quedan en duro. Cambiar los valores de parámetros en el archivo App.Config, la aplicación no los lee y sigue con los valores que habían al compilar la aplicación. ¿Como leo los valores actualizados del archivo App.Config?.
En el código fuente esta es la instrucción para leer los párámetros: My.Settings.Mi_Parametro
EL archivo XML App.Config es el siguiente:
c:\windows\
C:\Users\Public
100
BAPI_COMPANY_GETLIST
Z_RFC_GENOPER_SAPPM_MSPROJECT
100
C:\Users\Public
Diagrama de Gan&tt
hola
EliminarQuizas debas cerrar la aplicacion y volver a iniciarla cuando cambias un valor del .config
Tambien podrias intentar usar la clase ConfigurationManager para acceder a los valores de la cofiguracion
Por otro lado ojo porque si en el Settings defines que el dato del config es del usuario esto haria que el archivo se defina en un lugar diferente en la carpeta del usuario en windows, o sea no es el config que esta junto al .exe
saludos
Lo que dice [panadolita] es cierto inicas aplicación con un usuario especifico y no detecta los cambios del *.config. ejecutandolo como administrador recien aplica los cambios al archivo *.config nuevamente lo ejecutas sin elevarlo ahi recien toma los datos. Bueno en lo personal me paso ese caso...
ResponderEliminarExiste algun truco sobre esto.
Gracias.
hola
EliminarPero sobre que carpeta estas ejecutando la aplicacion ? porque si es sobre Programs File puede que el usuario con el cual corres la aplicacion no tenga permisos de escritura, por eso debes ejecutar como admin
O este problema se presenta cuando ejecutas desde el VS ?
saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarhola
EliminarComo un primer comentario podria decirte que el config de las dll no aplica para nada, solo es util el config de la aplicacion que ejecutas, si es winform entonces el config de este proyecto es el que importa.
Las dll que uses tomaran la configuracion del app.config del proyecto winforms.
Por otro lado los .config no se empaquetan dentro de ningun archivo, estos siempre estan por fuera, si se agregaron dentro de una dll es porque alguna configuracion de la propiedad del archivos se ha cambiado, se podria revisar si se cambio el Build Action de este app.config para que se embebiera en la dll
saludos
hola, mi problema lo he visto en varios comentarios. estoy trabajando un programa en C# y tengo dos proyectos, en uno tengo todas las clases que controlan el acceso, envio y recepcion de informacion al servidor. Necesito un archivo App.Config, claramente debo crearlo en el mismo proyecto donde hago toda la gestión a la BD. se supone que la particularidad del archivo es poder modificarlo luego, es flexible, pero, si compilo, el segundo proyecto que tengo de presentacion donde solo tengo los formularios y envio la informacion al proyecto de Gestión de base de datos solo importará la dll de todo el proyecto de gestión como tal, y el App.Config pierde su "Flexibilidad".
ResponderEliminarentonces, mi punto es, qué solución hay a esto, según tu experiencia. por que de no tenerla no habria ningun sentido, ya que me obliga a tener todo dentro de un proyecto y perderia escalabilidad.
gracias de antemano
hola
EliminarLa verdad es que no hay una solucion directa, la secciones de configuracion van siempre en el config del proyecto que ejecuta ya sea web o desktop, las dll toman los datos de ese mismo config.
Equivalent to 'app.config' for a library (DLL)
Usando el ConfigurationManager.OpenExeConfiguration se podria indicar la ruta al .config de la dll que quieres trabajar.
Hola Leandro,
ResponderEliminarEs posible cambiar el name de un conection string a un web config de un sitio completo?
lo intenté y mis Datasets no funcionan ahora, es posible hacer ese cambio?
hola
EliminarEntiendo que podrias hacerlo
Add, Modify, Remove appSettings keys and values in web.config
solo que en tu caso lo aplicarias en otra seccion
saludos
gracias Leandro!
Eliminarsaludos
Hola Leandro, muchas gracias por todas tus aportaciones.
ResponderEliminarTengo una duda es posible modificar el archivo de configuración desde el programa mismo, te comento la aplicación actualmente trabaja con las BD de desarrollo, pero cuando se libere se pretende que el usuario pueda seleccionar el ambiente que necesite, existe una plataforma para contingencias y la plataforma original o incluso si se migra la información que el usuario pueda capturar el nuevo servidor.
Gracias por tu apoyo
hola
EliminarEs que el archivo de configuracion es basicamente un xml, puedes editar este con el notepad, podria el usuario cambiar alli el ambiente. Igualmente se puede desee codigo cambiar la configuracion
Cambiar Valores a App.config Desde un Form
veras como usando el ConfigurationManager.OpenExeConfiguration() abres el config para cambiar el valor
saludos
Muchas gracias, otra duda, en la carpeta donde se instala el paquete el usuario no tiene privilegios para modificar , es posible colocar el app.config en otra carpeta y que la aplicación lo pueda acceder
Eliminarhola
EliminarSi ese es un tema, la verdad no lo veo tan simple. Quizas podrias poner el codigo que cambia el config ejecutando con provilegios de admin
How to force my project in Visual Studio 2013 to always run as Administrator?
como veras se define un archivo de manifest donde puedes indicar que la aplicacion eejcuta como admin, de esta forma podrias cambiar desde codigo el .config
saludos
muchas gracias lo voy a probar
EliminarHola Leandro:
ResponderEliminarComo puedo hacerle en C# para que después de cierto tiempo de inactividad se cierre la aplicación.
Que tal Leandro, te he seguido en varios temas y en distintas fuentes de información y pues como todos lo saben, haces un grandioso trabajo con tus aportes.
ResponderEliminarAhora viene una duda que tengo respecto a la forma de administrar unas aplicaciones en la empresa donde laboro. Desean que cree un "Repositorio" con dichas aplicaciones y que separe en distintas carpetas los .Config, .Dll y los .exe. Con el tema de las DLL voy bien ya que agregue en el app.config de cada proyecto un par de líenas que vi en un aporte tuyo, pero me viene la duda con los .config ya que hice lo mismo pero los exe no se ejecutan en las maquinas de los demas usuarios. Que me recomiendas para este tema?
Desde ya agradeciendo tu asesoría.
Saludos.
Muchas gracias Leandro, me sirvió para una situación especifica, que buena explicación.
ResponderEliminarHola tengo un problema muy particular, estoy creando una app q debe leer un fichero de configuración .ini pero q se guarda indistintamente en la raíz de la aplicación o se puede guardar en la carpeta de configuración de usuario dependiendo de los permisos del usuario ¿ como puedo saber en cuál ruta está para poder leer el fichero .ini?
ResponderEliminarque tal leandro tengo un problema
ResponderEliminartengo un timer
fecha
que actuliza el tiempo cada 10 segundos
'If Not IsPostBack Then
TextBox2.Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
'Me.BindGrid1()
'End If
v_connectionstring.Open()
cmd.CommandText = "SELECT max(folioint) FROM incidencias"
cmd.CommandType = CommandType.Text
cmd.Connection = v_connectionstring
reader = cmd.ExecuteReader()
reader.Read()
If reader.HasRows Then
If reader.Item(0) <> lblcom.Text Then
MsgBox("si entro")
ClientScript.RegisterStartupScript([GetType](), "hola", "mostrarmodal2()", False)
ClientScript.RegisterStartupScript([GetType](), "hola", "toast()", False)
lblcom.Text = reader.Item(0)
Label36.Text = reader.Item(0)
End If
End If
reader.Close()
v_connectionstring.Close()
end sub
manda el valor a una funcion protected sub pero desde ahi no puedo mandar llamar las funciones de javascript y no se porque espero me pudieras ayudar muchas gracias sistemasgaza@gmail.com
por favor muchas gracias
Mil gracias por tus aportaciones... Muy útiles... Saludos y bendiciones
ResponderEliminarHola, no se alguien lo lea...pero tengo una solución con dos proyectos, con su archivo app.config....ambos entran en conflicto y hay problemas, uso entity framework y esta sección da problemas, primero me pide la cadena de conexión en el appconfig del primer proyecto, es un Windows Forms, se la pongo y pide los datos del Entity, se los pongo, pero luego marca conflicto de que:
ResponderEliminarConfigurationErrorsException: Sólo se permite un elemento por archivo de configuración y, si lo hay, debe ser el primer elemento secundario del elemento raíz
Hola Leandro, ante todo te agradezco enormemente tu tiempo y sabiduría.
ResponderEliminarEstoy arrancando con un proyecto que basicamente es un menú desde donde abro diferentes aplicaciones.
Quiero guardar los Path de las app en el archivo de configuración, pero no puedo hacer funcionar la edición de la app.config. La agregué siguiendo los pasos que indicas, pero no me toma el comando
Probé tambíen con la personalizada de tu ejemplo de medios de pago, pero tampoco me funciona.
Agregué la referencia de System.configuración. Debo hacer algo mas?
Mi codigo es:
Muchas gracias!!!!