none
Como hacer que el usuario mediante textbox cree la conexion de la base de datos RRS feed

  • Pregunta

  • Tengo una aplicación que tiene por defecto una cadena de conexión para poder entrar al sistema, y dentro de esta hay un apartado donde permite crear una nueva base de datos.

    public void CrearEmpresa(string nombre)
     {
         using(var conexion = ObtenerConexion())
     {
         conexion.Open();
         using(var comando = new SqlCommand())
       {
             comando.Connection = conexion;
             comando.CommandText = "create database " + nombre;
             comando.CommandType = CommandType.Text;
             comando.ExecuteNonQuery();
            }
         }
     }

    Pero a la hora de ejecutar el Script para crear las tablas me dice que ya existe, pero ella existe en la base de datos predeterminada. El usuario es quien escoge el nombre de la base de datos. 

    Preguntas:

    1. como hago para usar la base de datos que acabo de crear para insertar las tablas?

    2. Como creo esa cadena de conexión con el nombre de la base de datos que inserto el usuario para que al abrir la base de datos me deje guardar los registros en la BD creada y ver sus registros.

    Pregunto esto porque la aplicación se inicia con un login, y en el login hay que escoger la base de datos que se va a usar, entonces para poder usarla imagino que tiene que agarrar su propia cadena de conexión para poder insertar los datos a donde pertenecen.

    Espero haberme explicado bien. De Antemano Muchas gracias a todos por sus respuestas

    jueves, 23 de abril de 2020 1:52

Respuestas

  • Hola NathalyChR

    Te recomiendo que revises estos links

    Create SQL Server DB

    Create SQL Server Dynamically

    Saludos

    Oscar Navarro

    • Marcado como respuesta NathalyChR viernes, 24 de abril de 2020 1:26
    jueves, 23 de abril de 2020 13:01
    Moderador
  • Hola

    ADO.net, proporciona una herramienta para hacer esto, esta se llama 

    SqlConnectionStringBuilder

    esta la usas de la siguiente forma


    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
        builder.DataSource = [servidos];
        builder.InitialCatalog=[base de datos};
        builder.IntegratedSecurity = true;



    y la consultas de la siguiente forma

    builder.ConnectionString


    Es importante que consideres estas propiedades

    Integrated Security: Establece u obtiene el valor que indica el tipo de conexión. True-> para la seguridad integrada de windows, y False-> para indicar usuario y contraseña.
    UserId: El usuario de SQL Server asociado a la conexión.
    Password: Establece u obtiene la contraseña para la cuenta de SQL Server asociada a la conexión.

    Saludos


    Ing. Carlos Monroy

    • Marcado como respuesta NathalyChR viernes, 24 de abril de 2020 1:25
    jueves, 23 de abril de 2020 17:09
  • Tenes que, para acceder a las distintas bases de datos, cambiar la CadenaConexion, podes pasarle un parámetro al constructor ConexionBD con el nombre de la base de datos, o una propiedad para acceder a CadenaConexion. 

    Primero creas la base de datos nueva con la conexión por omisión, y luego para acceder a la nueva base de datos creas otra conexión y le cambias el nombre de la bd con Replace, o podes usar SqlConnectionStringBuilder como te dijo Carlos Adan. 

    jueves, 23 de abril de 2020 20:13

Todas las respuestas

  • Hola NathalyChR

    Te recomiendo que revises estos links

    Create SQL Server DB

    Create SQL Server Dynamically

    Saludos

    Oscar Navarro

    • Marcado como respuesta NathalyChR viernes, 24 de abril de 2020 1:26
    jueves, 23 de abril de 2020 13:01
    Moderador
  • Hola Nathaly

    1) Para usar una base de datos es

    USE base_de_datos

    que lo podes poner en un SqlCommand

    2) Para crear una cadena de conexión que sólo varíe el nombre de la base de datos, tendrías que hacer un string con la cadena pero que en el lugar del nombre de la bd diga "nombre_bd", y luego, con el siguiente código creas cadenas de conexión para cada nombre de bd

    string conexionEspecifica;

    conexionEspecifica = conexionGenerica.Replace("nombre_bd", nombreEspecifico);

    Recorda que los métodos de la clase String devuelven un nuevo objeto String que debe ser asignado a otro objeto String, no modifican el String quien llama al método.

    Saludos

    Pablo

    jueves, 23 de abril de 2020 13:56
  • Hola Tigre Pablito , te comento que use el USE y no me funciono. Yo tengo esa conexion en una clase, trabajo en 3 capas, y cuando la llamo desde mis otras capas, la llamo asi

    namespace Datos.CrearEmpresa
    {
        public class CD_CrearEmpresa:ConexionBD
        {        
               public void CrearEmpresas(string nombre)
               {
                   using(var conexion = ObtenerConexion())
                   {                
                       conexion.Open();
                       using(var comando = new SqlCommand())
                       {
                           comando.Connection = conexion;
                           comando.CommandText = "create database " + nombre;
                           comando.CommandType = CommandType.Text;
                           comando.ExecuteNonQuery();
                       }
                    }
                } 
    
          }
    }

    Entonces mi duda es, como pasarle ese parametro del nombre de la base de datos si utilizo esta forma de agarrar la conexion, ese codigo que muestro esta en otra clase pero de la misma capa datos y llamo a mi cadena de conexion con

    public class CD_CrearEmpresa:ConexionBD
    Como se adaptaria. Gracias de antemano por la ayuda

    jueves, 23 de abril de 2020 16:38
  • Hola

    ADO.net, proporciona una herramienta para hacer esto, esta se llama 

    SqlConnectionStringBuilder

    esta la usas de la siguiente forma


    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
        builder.DataSource = [servidos];
        builder.InitialCatalog=[base de datos};
        builder.IntegratedSecurity = true;



    y la consultas de la siguiente forma

    builder.ConnectionString


    Es importante que consideres estas propiedades

    Integrated Security: Establece u obtiene el valor que indica el tipo de conexión. True-> para la seguridad integrada de windows, y False-> para indicar usuario y contraseña.
    UserId: El usuario de SQL Server asociado a la conexión.
    Password: Establece u obtiene la contraseña para la cuenta de SQL Server asociada a la conexión.

    Saludos


    Ing. Carlos Monroy

    • Marcado como respuesta NathalyChR viernes, 24 de abril de 2020 1:25
    jueves, 23 de abril de 2020 17:09
  • Hola, gracias por responder, mi cadena de conexion esta en otra clase
    namespace Datos
    {
        public abstract class ConexionBD
        {
            private readonly string CadenConexion;
            
            public ConexionBD()
            {
                          
                CadenConexion = "Data Source=DESKTOP-38N3PKP\\SQLEXPRESS;Initial Catalog=basededatos;Integrated Security=True";
              
            }
    
            protected SqlConnection ObtenerConexion()
            {
                return new SqlConnection(CadenConexion);
                
            }
    
        }
    }
    Y la llamo desde otra clase en la misma capa asi:

    namespace Datos.CrearEmpresa
    {
        public class CD_CrearEmpresa:ConexionBD
        {        
               public void CrearEmpresas(string nombre)
               {
                   using(var conexion = ObtenerConexion())
                   {                
                       conexion.Open();
                       using(var comando = new SqlCommand())
                       {
                           comando.Connection = conexion;
                           comando.CommandText = "create database " + nombre;
                           comando.CommandType = CommandType.Text;
                           comando.ExecuteNonQuery();
                       }
                    }
                } 
    
          }
    }

    LA uso llamandola desde la clase 
    public class CD_CrearEmpresa:ConexionBD
    Pero como se ve ya hay una base de datos por defecto, lo que quiero es que al crear la base de datos desde visual studio, me apunta a la que estoy creando para poder insertar tablas, las tablas se insertaran al momento de crear la base de datos, pero me dice que la tabla ya existe porque efectivamente existe pero existe en la base de datos que ya tiene la cadena.

    Por eso mis preguntas, de como apuntar a esa base de datos que cree para que las tablas se guarden ahi y 
    2. al iniciar sesion y escoger entre ejemplo 3 bases de datos desde la aplicacion la base de datos que escoja me abra y pueda guardar los datos y verlos. Espero haberme explicado bien 
    jueves, 23 de abril de 2020 17:45
  • Tenes que, para acceder a las distintas bases de datos, cambiar la CadenaConexion, podes pasarle un parámetro al constructor ConexionBD con el nombre de la base de datos, o una propiedad para acceder a CadenaConexion. 

    Primero creas la base de datos nueva con la conexión por omisión, y luego para acceder a la nueva base de datos creas otra conexión y le cambias el nombre de la bd con Replace, o podes usar SqlConnectionStringBuilder como te dijo Carlos Adan. 

    jueves, 23 de abril de 2020 20:13
  • gracias a todos por sus respuestas, quede mas clara ya
    viernes, 24 de abril de 2020 1:25