Principales respuestas
Conexion a base de datos desde un archivo .ini

Pregunta
-
Estimados
Junto con saludarlos y estar agradecidos con el foro, vengo a realizar una consulta sobre como puedo realizar una conexion a la base de datos desde un archivo .ini por ejemplo y este pueda modificarlo para crear una nueva conexion a la base de datos ingresando nuevos datos a los campos ya determinados. Encontre el siguiente link http://explicandocodigo.blogspot.cl/2016/03/leer-archivos-ini_23.html pero no pude entenderlo a cabalidad la explicacion, si es posible que alguien me de una mano.
De esta manera modifico los datos de mi archivo .ini
//Realizar una query para guardar los registros en una base de datos y esta a su vez consultar dicha base de datos para realizar la conexion if (MessageBox.Show("Esta seguro que desea guardar la configuración", "Guardar configuración", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes) { string cadConn = "datasource=" + txtServer.Text + "; database=" + txtdbMySql.Text + "; username=" + txtdbUser.Text + "; password=" + txtdbPassword.Text + ""; string path = @"D:\Users\Nicolas\Documents\ConnectionString.ini"; if (File.Exists(path)) { File.WriteAllText(path, cadConn); } else { MessageBox.Show("La ruta del archivo no es valida o no existente"); this.Close(); } this.Close(); }
Pero tengo problemas al realizar el login del usuario por ejemplo, el codigo es este
string path = @"D:\Users\Nicolas\Documents\ConnectionString.ini"; if (File.Exists(path)) { string myConnection = File.ReadAllText(path); try { MySqlConnection myConn = new MySqlConnection(myConnection); MySqlCommand SelectCommand = new MySqlCommand("select * from cdctecnicos where codTecnico='" + this.txtUser.Text + "' and Contraseña='" + this.txtPassword.Text + "' ;", myConn); //conexion local //MySqlCommand SelectCommand = new MySqlCommand("select * from cdcontrolST.cdcTecnicos where codTecnico='" + this.txtUser.Text + "' and Contrasena='" + this.txtPassword.Text + "' ;", myConn); MySqlDataReader myReader; MySqlCommand insert = new MySqlCommand(); myConn.Open(); myReader = SelectCommand.ExecuteReader(); int count = 0; while (myReader.Read()) { count = count + 1; } if (count == 1) { //insertar datos a DB //string InsertMySql = @"INSERT INTO cdcontrolst.cdchorarios (codEscaner, codTecnico, FechaEntrada, FechaSalida,Comentario) values (@cEscaner,@cTecnico,@fEntrada,@fSalida,@Comment)", MyConn; //MySqlCommand mysqlcmd = new MySqlCommand(InsertMySql); //mysqlcmd.Parameters.AddWithValue("@cEscaner", this.txtUser.Text); //mysqlcmd.Parameters.AddWithValue("@cTecnico", this.txtUser.Text); //mysqlcmd.Parameters.AddWithValue("@fEntrada", this.lblTime.Text); //mysqlcmd.Parameters.AddWithValue("@fSalida", this.lblTime.Text); //mysqlcmd.Parameters.AddWithValue("@Comment", this.txtUser.Text); //mysqlcmd.ExecuteNonQuery(); //MessageBox.Show("El usuario y contraseña es correcta"); string user = txtUser.Text; comL.Consulta(user); ServiceTecn service = new ServiceTecn(); service.txtIDTecnico.Text = txtUser.Text; //Operacion bienvenido string cadSql = "Select * from cdcontrolST2.cdcTecnicos where codTecnico='" + user + "' "; //Open connection //create mysql command MySqlCommand cmd = new MySqlCommand(); //Assign the query using CommandText cmd.CommandText = cadSql; //Assign the connection using Connection string Nombre = myReader["Nombre"].ToString(); string Apellido = myReader["Apellido"].ToString(); string Welcome = "Bienvenido " + Nombre + " " + Apellido + "."; //return Welcome; //System.Windows.Forms.MessageBox.Show(Welcome); service.lblWelcome.Text = Welcome; //Execute query //cmd.ExecuteNonQuery(); //System.Windows.Forms.MessageBox.Show("Se ha almacenado correctamente el comentario en la base de dato"); //close connection //this.CloseConnection(); //Oculta el formulario y abrir otro service.Show(); this.Hide(); myConn.Close(); } else if (count > 1) { MessageBox.Show("Acceso denegado, el usuario y contraseña se encuentra duplicado", "Ingreso de usuario"); txtPassword.Text = ""; myConn.Close(); } else { MessageBox.Show("El usuario y contraseña ingresado no corresponden, por favor intentelo nuevamente", "Ingreso de usuario"); myConn.Close(); txtUser.Text = ""; txtPassword.Text = ""; } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
De esta manera me conecto pero no puedo obtener cada dato de forma solitaria de mi archivo .ini... se entiende como solitaria por ejemplo "database=cdcontrolst".
Respuestas
-
Hola @Nicolás Villablanca
Puedes crear tu cadena de conexión en el archivo App.config en tiempo de ejecución desde un formulario y conectarte a cualquier base de datos que este alojada en el mismo servidor.
Presentación
private void btnGuardar_Click(object sender, EventArgs e) { Utilidades.NServidor = txtNombreServidor.Text; Utilidades.NDatabase = txtNombreDB.Text; Utilidades.NUsuario = txtUsuario.Text; Utilidades.NPass = txtPassword.Text; ConexionConfiguracion.BuilConnectionString(Utilidades.NServidor, Utilidades.NDatabase, Utilidades.NUsuario, Utilidades.NPass); }
Lógica
public static void BuilConnectionString(string DataSource, string InitialCatalog, string UserId, string Password) { Conexion.BuilConnectionString(DataSource, InitialCatalog, UserId, Password); }
Acceso Datos: Adaptalo a tus necesidades
public class Conexion { private static string nCon; internal static string providerName; public static string GetConexion() { try { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConnectionStringSettings cs = config.ConnectionStrings.ConnectionStrings["default"]; if (cs == null) throw new ArgumentNullException("nameConnectionString", "El nombre de la cadena de conexión no existe" + " en el archivo de configuración de la aplicación."); nCon = cs.ConnectionString; if ((nCon == string.Empty)) throw new ArgumentNullException("nameConnectionString", "No existe la cadena de conexion en el valor" + " con nombre especificado."); //nCon = String.Empty providerName = cs.ProviderName; if (providerName == string.Empty) throw new ArgumentNullException("nameConnectionString", "El proveedor .net especificado" + " actualmente no se encuentra soportado."); return string.Empty; } catch (ArgumentException ex) { MessageBox.Show(ex.ToString()); return ex.Message; //Throw ex nCon = ""; } } public static SqlConnection Conectar() { SqlConnection cnMDB = new SqlConnection(); if (string.IsNullOrEmpty(nCon)) GetConexion(); if (nCon != null) { try { cnMDB.ConnectionString = nCon; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return cnMDB; } public static void BuilConnectionString(string DataSource, string InitialCatalog, string UserId, string Password) { // Obtenemos el archivo de configuración de la aplicación. // Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // Obtenemos la sección connectionStrings. // ConnectionStringsSection section = config.ConnectionStrings; // Obtenemos el objeto ConnectionStringSettings // correspondiente al nombre de la cadena de // conexión especificada. ConnectionStringSettings settings = section.ConnectionStrings["default"]; //if ((settings == null)) // return; // Creamos el objeto DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); // Le asignamos el valor de la cadena de conexión builder.ConnectionString = settings.ConnectionString; builder["Data Source"] = DataSource; builder["Initial Catalog"] = InitialCatalog; builder["User Id"] = UserId; builder["Password"] = Password; // Le asignamos la cadena de conexión existente // en el objeto DbConnectionStringBuilder. // settings.ConnectionString = builder.ConnectionString; // Modificamos la cadena de conexión en el archivo app.config. // AddAndSaveOneConnectionStringSettings(config, settings); } public static void AddAndSaveOneConnectionStringSettings(System.Configuration.Configuration configuration, System.Configuration.ConnectionStringSettings connectionStringSettings) { // You cannot add to ConfigurationManager.ConnectionStrings using // ConfigurationManager.ConnectionStrings.Add // (connectionStringSettings) -- This fails. // But you can add to the configuration section and refresh the ConfigurationManager. // Get the connection strings section; Even if it is in another file. ConnectionStringsSection connectionStringsSection = configuration.ConnectionStrings; // Add the new element to the section. connectionStringsSection.ConnectionStrings.Add(connectionStringSettings); // Save the configuration file. configuration.Save(ConfigurationSaveMode.Minimal); // This is this needed. Otherwise the connection string does not show up in // ConfigurationManager ConfigurationManager.RefreshSection("connectionStrings"); } }
Formulario
Cuando ejecutes tu app presiona las teclas Ctrl + F5
Espero la información brindada sea de utilidad.
NOTA: Algún moderador que mueva este hilo al foro de C#
Saludos.
Pedro Ávila
"El hombre sabio querrá estar siempre con quien sea mejor que él."
Lima - Perú
- Editado Pedro Ávila martes, 20 de junio de 2017 4:15
- Propuesto como respuesta Joyce_ACModerator martes, 20 de junio de 2017 14:00
- Marcado como respuesta Nicolás Villablanca martes, 20 de junio de 2017 15:14
Todas las respuestas
-
¿Tienes algún requerimiento especial por el que ocupas un archivo con extensión 'ini' para contener una cadena de conexión?. Lo habitual es que la cadena de conexión se escriba sobre un archivo de configuración, podría ser el propio archivo 'App.config'
How to get Connection String from App.Config in C#
ConfigurationManager.ConnectionStrings Property
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
-
-
Si es un requerimiento especial ya que present la propuesta de usar App.config en vez de un archivo .ini pero lo quieren a base ese tipo de archivo ya que lo conocen mas.
Los archivos de configuración son el estándar en .NET para almacenar información del usuario y de la aplicación, de hecho, la biblioteca de clases del marco de trabajo de .NET implementa las clases y miembros de clase necesarios para trabajar con estos archivos de manera simple. En lo personal yo evitaría trabajar con archivos INI, entiendo que hace años se utilizaba, hoy en día quizá no sea lo adecuado.
Respecto a como agregar/editar la sección, atributos o valores de la cadena de conexión: App.config es un archivo con formato XML que puedes editar y escribir los valores que consideres necesario, sin embargo, también es posible editar o agregar atributos a la cadena de conexión desde la aplicación: SqlConnectionStringBuilder Class
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
Estimado Williams
Segui tu consejo sobre la app.conf bueno ya tengo mi conexion a la base de datos de esta manera
string server = ConfigurationManager.AppSettings["Server"].ToString(); string database = ConfigurationManager.AppSettings["Database"].ToString(); string username = ConfigurationManager.AppSettings["Username"].ToString(); string pass = ConfigurationManager.AppSettings["Password"].ToString(); private void btnEnter_Click(object sender, EventArgs e) { //string path = @"D:\Users\Nicolas\Documents\ConnectionString.ini"; string path = @"D:\Users\Nicolas\Documents\Visual Studio\Visual Studio 2017\Projects\cdControlSTv1.3\CapaPresentacion\App.config"; if (File.Exists(path)) { string myConnection = "datasource="+server+";database="+database+";username="+username+";password="+pass; try { MySqlConnection myConn = new MySqlConnection(myConnection); MySqlCommand SelectCommand = new MySqlCommand("select * from cdctecnicos where codTecnico='" + this.txtUser.Text + "' and Contraseña='" + this.txtPassword.Text + "' ;", myConn); //conexion local //MySqlCommand SelectCommand = new MySqlCommand("select * from cdcontrolST.cdcTecnicos where codTecnico='" + this.txtUser.Text + "' and Contrasena='" + this.txtPassword.Text + "' ;", myConn); MySqlDataReader myReader; MySqlCommand insert = new MySqlCommand(); myConn.Open(); myReader = SelectCommand.ExecuteReader(); int count = 0; while (myReader.Read()) { count = count + 1; } if (count == 1) { //insertar datos a DB //string InsertMySql = @"INSERT INTO cdcontrolst.cdchorarios (codEscaner, codTecnico, FechaEntrada, FechaSalida,Comentario) values (@cEscaner,@cTecnico,@fEntrada,@fSalida,@Comment)", MyConn; //MySqlCommand mysqlcmd = new MySqlCommand(InsertMySql); //mysqlcmd.Parameters.AddWithValue("@cEscaner", this.txtUser.Text); //mysqlcmd.Parameters.AddWithValue("@cTecnico", this.txtUser.Text); //mysqlcmd.Parameters.AddWithValue("@fEntrada", this.lblTime.Text); //mysqlcmd.Parameters.AddWithValue("@fSalida", this.lblTime.Text); //mysqlcmd.Parameters.AddWithValue("@Comment", this.txtUser.Text); //mysqlcmd.ExecuteNonQuery(); //MessageBox.Show("El usuario y contraseña es correcta"); string user = txtUser.Text; comL.Consulta(user); ServiceTecn service = new ServiceTecn(); service.txtIDTecnico.Text = txtUser.Text; //Operacion bienvenido string cadSql = "Select * from "+database+".cdcTecnicos where codTecnico='" + user + "' "; //Open connection //create mysql command MySqlCommand cmd = new MySqlCommand(); //Assign the query using CommandText cmd.CommandText = cadSql; //Assign the connection using Connection string Nombre = myReader["Nombre"].ToString(); string Apellido = myReader["Apellido"].ToString(); string Welcome = "Bienvenido " + Nombre + " " + Apellido + "."; //return Welcome; //System.Windows.Forms.MessageBox.Show(Welcome); service.lblWelcome.Text = Welcome; //Execute query //cmd.ExecuteNonQuery(); //System.Windows.Forms.MessageBox.Show("Se ha almacenado correctamente el comentario en la base de dato"); //close connection //this.CloseConnection(); //Oculta el formulario y abrir otro service.Show(); this.Hide(); myConn.Close(); } else if (count > 1) { MessageBox.Show("Acceso denegado, el usuario y contraseña se encuentra duplicado", "Ingreso de usuario"); txtPassword.Text = ""; myConn.Close(); } else { MessageBox.Show("El usuario y contraseña ingresado no corresponden, por favor intentelo nuevamente", "Ingreso de usuario"); myConn.Close(); txtUser.Text = ""; txtPassword.Text = ""; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
Lo hice de esta manera para modificar desde otro formulario cada uno de los campos, pero ahi estoy en dilema ya que no se como se modifican los valores de los tags en la app.config
-
-
Esta es mi App.config de mi aplicacion:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <appSettings> <clear /> <add key="Server" value="localhost"/> <add key="Database" value="cdcontrolst"/> <add key="Username" value="root"/> <add key="Password" value="Maddy173005482"/> </appSettings> </configuration
Intento realizarla modificacion y la persistencia de los parametros de la siguiente manera:
private void btnSave_Click(object sender, EventArgs e) { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings["Server"].Value = txtServer.Text; config.Save(ConfigurationSaveMode.Full); }
Pero no logro que de resultado como en este link https://johnbarquin.wordpress.com/2009/04/10/%C2%BFcomo-leer-y-escribir-parametros-de-configuracion-en-c/ y no se como guiarme para realizar las modificaciones y estas queden almacenadas en mi App.config
-
Hola @Nicolás Villablanca
Puedes crear tu cadena de conexión en el archivo App.config en tiempo de ejecución desde un formulario y conectarte a cualquier base de datos que este alojada en el mismo servidor.
Presentación
private void btnGuardar_Click(object sender, EventArgs e) { Utilidades.NServidor = txtNombreServidor.Text; Utilidades.NDatabase = txtNombreDB.Text; Utilidades.NUsuario = txtUsuario.Text; Utilidades.NPass = txtPassword.Text; ConexionConfiguracion.BuilConnectionString(Utilidades.NServidor, Utilidades.NDatabase, Utilidades.NUsuario, Utilidades.NPass); }
Lógica
public static void BuilConnectionString(string DataSource, string InitialCatalog, string UserId, string Password) { Conexion.BuilConnectionString(DataSource, InitialCatalog, UserId, Password); }
Acceso Datos: Adaptalo a tus necesidades
public class Conexion { private static string nCon; internal static string providerName; public static string GetConexion() { try { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConnectionStringSettings cs = config.ConnectionStrings.ConnectionStrings["default"]; if (cs == null) throw new ArgumentNullException("nameConnectionString", "El nombre de la cadena de conexión no existe" + " en el archivo de configuración de la aplicación."); nCon = cs.ConnectionString; if ((nCon == string.Empty)) throw new ArgumentNullException("nameConnectionString", "No existe la cadena de conexion en el valor" + " con nombre especificado."); //nCon = String.Empty providerName = cs.ProviderName; if (providerName == string.Empty) throw new ArgumentNullException("nameConnectionString", "El proveedor .net especificado" + " actualmente no se encuentra soportado."); return string.Empty; } catch (ArgumentException ex) { MessageBox.Show(ex.ToString()); return ex.Message; //Throw ex nCon = ""; } } public static SqlConnection Conectar() { SqlConnection cnMDB = new SqlConnection(); if (string.IsNullOrEmpty(nCon)) GetConexion(); if (nCon != null) { try { cnMDB.ConnectionString = nCon; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return cnMDB; } public static void BuilConnectionString(string DataSource, string InitialCatalog, string UserId, string Password) { // Obtenemos el archivo de configuración de la aplicación. // Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // Obtenemos la sección connectionStrings. // ConnectionStringsSection section = config.ConnectionStrings; // Obtenemos el objeto ConnectionStringSettings // correspondiente al nombre de la cadena de // conexión especificada. ConnectionStringSettings settings = section.ConnectionStrings["default"]; //if ((settings == null)) // return; // Creamos el objeto DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); // Le asignamos el valor de la cadena de conexión builder.ConnectionString = settings.ConnectionString; builder["Data Source"] = DataSource; builder["Initial Catalog"] = InitialCatalog; builder["User Id"] = UserId; builder["Password"] = Password; // Le asignamos la cadena de conexión existente // en el objeto DbConnectionStringBuilder. // settings.ConnectionString = builder.ConnectionString; // Modificamos la cadena de conexión en el archivo app.config. // AddAndSaveOneConnectionStringSettings(config, settings); } public static void AddAndSaveOneConnectionStringSettings(System.Configuration.Configuration configuration, System.Configuration.ConnectionStringSettings connectionStringSettings) { // You cannot add to ConfigurationManager.ConnectionStrings using // ConfigurationManager.ConnectionStrings.Add // (connectionStringSettings) -- This fails. // But you can add to the configuration section and refresh the ConfigurationManager. // Get the connection strings section; Even if it is in another file. ConnectionStringsSection connectionStringsSection = configuration.ConnectionStrings; // Add the new element to the section. connectionStringsSection.ConnectionStrings.Add(connectionStringSettings); // Save the configuration file. configuration.Save(ConfigurationSaveMode.Minimal); // This is this needed. Otherwise the connection string does not show up in // ConfigurationManager ConfigurationManager.RefreshSection("connectionStrings"); } }
Formulario
Cuando ejecutes tu app presiona las teclas Ctrl + F5
Espero la información brindada sea de utilidad.
NOTA: Algún moderador que mueva este hilo al foro de C#
Saludos.
Pedro Ávila
"El hombre sabio querrá estar siempre con quien sea mejor que él."
Lima - Perú
- Editado Pedro Ávila martes, 20 de junio de 2017 4:15
- Propuesto como respuesta Joyce_ACModerator martes, 20 de junio de 2017 14:00
- Marcado como respuesta Nicolás Villablanca martes, 20 de junio de 2017 15:14
-
Estimado Pedro
Gracias por tu respuesta, pero se me genera la siguiente duda: El usuario siempre debera ingresar los datos para realizar la conexion a la base de datos o esta queda ya almacenada en el App.config. Ya que la idea es que dicha aplicacion este en mas de un computador y si la cadena de conexion se desea cambiar permita este cambio y no genere perdida de tiempo al usuario.
-
Hola @Nicolás Villablanca
El usuario siempre debera ingresar los datos para realizar la conexion a la base de datos o esta queda ya almacenada en el App.config.
En el momento que instalan la aplicación por primera vez se configura la conexión y si queda grabada en el archivo App.config
Ya que la idea es que dicha aplicacion este en mas de un computador y si la cadena de conexion se desea cambiar permita este cambio y no genere perdida de tiempo al usuario.
El resto ya depende de lo que necesites si deseas conectarte a otra base de datos vuelve a llamar al formulario de configuración para conectarte a otra base de datos y vuelve a escribir en el archivo App.confg
Espero la información proporcionada sea de utilidad.
Saludos.
Pedro Ávila
"El hombre sabio querrá estar siempre con quien sea mejor que él."
Lima - Perú -
Estimado Pedro
Dentro de tu codigo no mencionaste sobre el App.config me gustaria saber si mi App.config debo modificarlo o dejarlo tal como esta... y la otra duda que me aqueja es la siguiente ya que en tu codigo no mencionas sobre Utilidades
Utilidades.NServidor = txtNombreServidor.Text; Utilidades.NDatabase = txtNombreDB.Text; Utilidades.NUsuario = txtUsuario.Text; Utilidades.NPass = txtPassword.Text;
Podrias explicarme para saber si debo adaptar mi codigo
-
Hola
Así queda tu App.config
<?xml version="1.0"?> <configuration> <connectionStrings> <add name="default" providerName="System.Data.SqlClient" connectionString=""/> </connectionStrings> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration>
NServidor, NDataBase, etc son variables de tipo string declaralas a nivel de formulario o donde mas te convenga.
Para comprobar lo mencionado vas al explorador de soluciones y le das click a "Mostrar todos los archivo", carpeta bin/Debug/WindowsUI.Controles.vshost.exe.config
Saludos.
Pedro Ávila
"El hombre sabio querrá estar siempre con quien sea mejor que él."
Lima - Perú- Editado Pedro Ávila miércoles, 21 de junio de 2017 4:17