Inicio > ADO.NET, C# > Acceso conectado a una BD en C#

Acceso conectado a una BD en C#

Hace ya varios días que me preguntaron de esto, de hecho ayer un amigo de la escuela y como en los cursos de ADO.NET que tome en mis vacaciones lo recordé, pues ak un pequeño resumen de cómo hacerlo.

La parte más importante o más pesada cuando realizamos un acceso a una base de datos nos la encontramos cuando hacemos la conexión a nuestra base de datos, sin embargo creo que esta tarea es simple siempre y cuando la hagamos de manera correcta, quizá diga que es pesada ya que es la que más recursos del sistema del sistema consume, pero para hacerlo bien debemos tomar en cuenta ciertas cosas:

  • La conexión debe realizarse, siempre que esté dentro de lo posible con los proveedores de acceso nativos, esto porque son más rápidos.
  • La conexión debe de abrirse lo más tarde posible, y de ser posible definir todas las variables que podamos antes de realizar la conexión.
  • La conexión debe cerrarse lo antes posible, siempre y cuando no tengamos la necesidad de usarla posteriormente.

Estas recomendaciones no son exactamente normas de acceso a datos, pero digamos que si las importantes en cuanto al acceso se refiere ya que depende de lo que queramos hacer para tomar una decisión y aplicar una u otra de estas recomendaciones.

En aquellas ocasiones en que sea necesario estar trabajando con la aplicación en estado conectado a la base de datos, lo que vamos a usar en un DataReader.

¿Qué hace un DataReader?

El objeto DataReader recupera un conjunto de valores llenando un pequeño búfer de datos. Si los objetos que hay en el búfer se acaban, el objeto DataReader regresará a la base de datos para recuperar más registros, por lo tanto su el servicio de SQL Server esta detenido o el de alguno de nuestros orígenes de datos esto provocaría un error.

Pero basta de rollos vamos a ver un ejemplo, pero antes necesitamos una base de datos, si tiene una perfecto, sino aquí un post de cómo crear una base de datos con SQL Server, ya que tenemos nuestra base ahora hacemos lo siguiente:

Creamos una aplicación para Windows a la que llamaremos AccesoConectado, como se ve en la figura:

        AccesoConectado1

Dentro ya de nuestro formulario, vamos a trabajar con un DataGridView para mostrar nuestros datos y un botón para mostrarlos, entonces nuestro formulario quedaría así:

                   AccesoConectado2

Ahora vamos agregar un origen de datos a nuestro proyecto para ello damos clic en la pestaña Datos->Agregar nuevo origen de datos lo que hacemos ak es solo utilizar el asistente, así como guardar nuestra cadena de conexión que es la que utilizaremos.

Ya con la base en el proyecto, ahora trabajaremos con ella desde código🙂, y es aquí en donde iniciamos con el método LeerBaseDeDatos y el código es el siguiente:

public void leerBaseDeDatos()
        {
            //abrimos la base de datos

            string cadenConexion = "Data Source=.\\SQLEXPRESS;AttachDbFilename='C:\\Users\\nor\\Desktop\\Curso UNAM\\AccesoConectado\\AccesoConectado\\NORTHWND.MDF';" +
                "Integrated Security=True;User Instance=True";
            
            conexionBD = new SqlConnection(cadenConexion);
            conexionBD.Open();

            //creamos una consulta
            string Consulta = "SELECT LastName, FirstName FROM Employees";
            Orden = new SqlCommand(Consulta, conexionBD);

            //ExecuteReader Hacela consulta y devuelve un SqlDataAdapter
            Lector = Orden.ExecuteReader();
            
            //llamamos siempre al método Read antes de aacedera los datos
            if (Lector.Read())
            {
                //asignamos al gridview
                miData = new DataTable();
                miData.Load(Lector);
                dataGridView1.DataSource = miData;
                       
                
            }
            //llamamos siempre al close  una vez finalizada la lectura
            Lector.Close();
        }

Como se pueden dar cuenta, en este método hacemos la conexión a nuestra base, realizamos una consulta sencilla, aplicamos el ExecuteReader que nos devuelve un SqlAdapter, llenamos un data table y lo asignamos a nuestro GridView.

Ahora solo un método más para cerrar nuestro lector y nuestra conexión esto una vez que ya no usamos nuestra base de datos. El método se llama CerrarConexion y el código es este:

public void CerrarConexion()
        {
            //cerramos nuestrs conexion cuando ya no le necesitemos
            if (Lector != null)
                Lector.Close();
            if (conexionBD != null)
                conexionBD.Close();
        }

por último dentro de nuestro evento clic de nuestro botón mandamos llamar estos métodos, aplicando el control de excepciones, y esto queda así:

public void CerrarConexion()
        {
            //cerramos nuestrs conexion cuando ya no le necesitemos
            if (Lector != null)
                Lector.Close();
            if (conexionBD != null)
                conexionBD.Close();
        }

Ahora solo resta crear una solución del proyecto, si todo va bien como parece, ejecutamos y el resultado al dar clic en el botón es algo como lo que se ve en la siguiente figura:

                     Dibujo1

Con esto tenemos ya un acceso de datos y con el DataReader podemos manipular de la misma manera manipular los datos, pero esto lo veremos en otro ejemplo. Aquí el archivo con el código completo.

Acceso  Conectado a una Base de Datos

Saludos!!🙂

Categorías:ADO.NET, C#
  1. SuperDotado
    septiembre 12, 2008 a las 7:16 pm

    Hola yo tengo un problema con mi conexion, estoy usando la base de datos que tiene el ID de Visual Studio, pero no se como poner bien la cadena de conexion:

    asi como la tengo:

    string CadenaConexion = “Data Source=.\\SQLEXPRESS;AttachDbFilename=’C:\\Programas Escritorio\\Uno\\SISTEMARAM\\SISTEMARAM\\Base.mdf\\Integrated Security=True;User Instance=True”;

    y pues me subraya la cadeja en rojo, cual es el problema?

    gracias por tu tiempo !!!

  2. septiembre 12, 2008 a las 11:27 pm

    mmm

    pueden ser varias cosas:

    1.- si es una aplicacion para escritorio, puedes cambiar la ruta, dandole propiedades a la BD desde el explorador de soluciones, ahi trae un path, reemplazalo por el que me muestras y debe de funcionar.
    1.1- si usas Windows vista, asegurate de tener deshabilitada las segueridad de los usuarios (aquí unos post de como hacerlo segun la version que tengas https://mspnor.wordpress.com/?s=deshabilitar+seguridad)

    2.- si es una aplicacion para la web con ASP.NET, pudes colocar la cadena de conexion en el Web.config y asiganarle un nombre y ese es el que usas de tu aplicación.

    3.- si haces la conexion con un asistente al agregar un origen de datos, este te crea la cadena por default.

    nota: te ayudaria mas si me dijeras que es lo que estas haciendo😀

    Saludos!!

  3. SuperDotado
    septiembre 13, 2008 a las 1:14 am

    Hola norber gracias por responder a mi duda.

    lo que estoy haciendo es trabajo en windows forms, apenas estoy aprendiendo, y si hice eso de sacar la ruta desde la propiedades de la base de datos pero cuando la pego, me sale una parte de la rutam subrayada de rojo, esta marcando un error:

    esta es mi cadena: “Data Source=.\SQLEXPRESS;AttachDbFilename=”C:\Programas Escritorio\Uno\SISTEMARAM\SISTEMARAM\Base.mdf”;Integrated Security=True;User Instance=True”;

    mi duda es como es la sintaxis correcta del path de la cadena.

    otra cosa mi intencion es dar de alta,eliminar,modificar,actualizar, usuarios,

    Ejemplo: tengo una forma con varias cajas de texo y bueno que todo eso que se valla capturando se valla guardando.

    camarada sabes del algun foro donde puedo aprender lo que te digo? estoy muy interesado, me he puesto a estudir mucho, pero solo encuentro tituriales para trabajar de manera desconectada y usando asistentes, eso a mi no me sirve yo deseo tanto hacerlo manualmente.

    gracias por tu tiempo.

    saludos!

  4. pit
    octubre 13, 2008 a las 6:14 pm

    otra duda relacionada y trato de ser claro
    bueno la coas es asi: ya conecte, envie comandos, procese resultados, etc.
    pero mi problema esta en como distribuir la aplicacion (una aplicacion simple, un executable monousario) tengo el archivo de base de datos .mdf pero quiero que este valla con mi exe.
    Las preguntas son:
    1.-puedo embeber (creo que esa es la palabra para insertar archivos dentro del exe) los archivos de base de datos dentro del executable y usarlos desde ahi, si es posible podrias decirme cómo?
    2.- ya sea embebido o no el archivo .mdf puedo correr el exectuable sin servicios de sql (creo que no pero no estoy seguro) como en el caso de los de acces

    gracias desde ahora por sus respuestas y felicitaciones por su pagina

  5. octubre 16, 2008 a las 4:36 pm

    que tal pit,

    gracias por visitar el blog y dejar comentarios, esto es muy importante para seguir colocando post de interes. Sobre tu duda…

    Te paso el link sobre un buen articulo de como distribuior aplicaciones con Bases de Datos SQL, espero que te se de utilidad. en este artículo se describe la forma de integrar e implementar aplicaciones basadas en Microsoft SQL Server Express mediante archivos de configuración y la tecnología de implementación ClickOnce en Microsoft Visual Studio. aquí el link:

    http://www.microsoft.com/spanish/msdn/articulos/archivo/300106/voices/emsqlexcustapp.mspx

    Saludos

  6. octubre 16, 2008 a las 4:43 pm

    que tal Superdotado,

    una disculpa por responder tan tarde, pero apenas hoy estoy respondiendo a los pendientes, sobre el posible error de tu cadena, es que estas haciendo mal la referencia a la BD, intenta agregarla a tu proyecto, te debe agregarla a la carpeta de debug, y la cadena es diferente, no aparece lo de “C:\…”, sino que hace referencia a el directorio de aplicacción y te agrega la cadena de conexion en el archivo app.config.

    sobre los foros, te recomiendo los del guille y claro los de MSDN:

    http://forums.microsoft.com/MSDN-ES/default.aspx?SiteID=11

    http://foros.elguille.info/

    Saludos!!!

  7. pit
    octubre 21, 2008 a las 10:22 pm

    gracias amigo
    aun no checo el articulo pero de cualquier manera gracias por tu respuesta que seguramente me sera de utilidad. un saludo

  8. luis
    octubre 30, 2008 a las 9:17 pm

    hola norber;

    saludos, esta muy completa tu explicación, de hecho me ayudo bastante a aprender como realizar la conn con la bd, seguí paso a paso tu ejemplo y me funcionó, PERO, si tngo N datos en la BD, me muestra n-1 datos… pense q era algo de mi código o conn pero bajé tu ejemplo y me pasa lo mismo.

    Yo estoy corriendo el ejemplo en sql server 2005 y VS 2008, si puedes ayudarme sería de gran utilidad, gracias de antemano

  9. Estela
    diciembre 23, 2008 a las 7:30 pm

    Hola Norbet! Tengo un problema con mi web from, realizo:
    SqlConnection coneccion = new SqlConnection();
    coneccion.ConnectionString = ConfigurationSettings.AppSettings[“CadenaConeccion”];
    coneccion.Open();
    String sql = “insert into dbo.Roles (RolID,Descripcion) values (” +
    txtRolID.Text + “,'” + txtDescrpEmp.Text + “‘)”;
    SqlCommand comando = new SqlCommand(sql, coneccion);
    comando.ExecuteNonQuery();
    txtRolID.Text = Convert.ToString(Convert.ToInt32(txtRolID.Text) + 1);
    txtDescrpEmp.Text = “”;
    coneccion.Close();
    comando.Dispose();
    }
    para poder guardar los registros en la Base de datos sql, pero solo me guarda cierta cantidad de registros no me guarda mas. por su ayuda gracias

    • diciembre 23, 2008 a las 8:18 pm

      Hola Estela,

      no he checado el código, pero a primera vista parece que realmente funciona y el problema puede estar en la definicion del campo, dependiendo de que tipo es y si en tu base lo estableciste para que se auto incrementara el indice.

      Otra cosa, te recomiendo utilizar un try {} catch{} para revisar en donde falla o porque esque no lo hace. Puden ser varias cosas como si es una conexion remota, lo haces por Web Services o algo así, pero voy a reviar el código y hacer un ejemplo con el vale.}

      Saludos!!

  10. Zero
    enero 5, 2009 a las 4:26 am

    Hola, tengo una pequeña duda, yo no trabajo con sql express si no con sql server 2005, como seria en tal caso? sobre todo en // cadenConexion = “Data Source=.\\SQLEXPRESS //

    Espero me puedan ayudar con este pequeño detalle, saludos!

    • enero 9, 2009 a las 8:26 pm

      que tal Zero,

      mira si trabajas con la version Professional, Estandar o cualquiera superior a la Express, tu cadena debe ser algo así:

      connectionString =”Data Source=NombreDeTuServidorOTuIp; Initial Catalog=NombreDeLaBD; User id=UserId; password=*******;” providerName =”System.Data.SqlClient”.

      En el ejemplo es SQLEXPRESS porque asi se llama el servidor por default cando instalo el Sql Express. Cuando tu instalaste el Sql debiste hacer una asignación de nombre a tu servidor.

      espero te pueda ayudar.

      Saludos

  11. cristian
    febrero 7, 2009 a las 3:12 am

    hola soy cristian tengo una tremenda duda estoy usando el visual web developer en c# tengo un grewview y necesito restar dos fechas alguien sabe como

    • febrero 7, 2009 a las 5:22 pm

      Que tal cristian,

      Ak publique con post donde trabajo con fechas y ver el detalle de la resta, aunque no lo comento es posible restar dieractemente un Getdate() de una feche posterior sin problemas, de cualquier modo ahi esta un ejemplo. si sale algo mal me comentas aquí el link:

      https://mspnor.wordpress.com/2009/02/07/sql-restando-fechas/

      Saludos.

  12. cristian
    febrero 7, 2009 a las 3:16 am

    Alguien tiene. algun manual didactico y facil de entender de como utilizar el visual web developer 2008, la otra duda es como puedo agregar a un grewview un drop down list y q por medio de este pueda seleccionar algun elemento y q posteriormente lo guarde en la base de datos

  13. jose
    junio 3, 2009 a las 11:13 pm

    yo tengo una base de datos sql server 2008 conectada con visual studio pero en el lenguaje de c#, y lo que pasa es que yo no le introduzco datos desde que la creo sino durante la ejecucion del programa le agrego datos pero no los guarda en la base de datos.
    por que despues ya no aparencen los datos que introduci

  14. jose
    junio 4, 2009 a las 1:14 am

    TENGO UNA BASE DE DATOS SQL SERVER 2008 CONECTADA CON VISUAL STUDIO 2008 PERO EN EL LENGUAJE DE C#.
    EN UNA APLICACION PARA WINDOWS FORM PERO CUANDO LA EJECUTO Y QUIERO INTRODUCIRLE DATOS NO LOS GUARDA

    • junio 4, 2009 a las 1:58 am

      Que tal Jose,

      me imagino que el T-SQL que usas para ingresar los datos no es correcto, o tal vez sea la cadena de conexión, te ayudaria más si pusieras estos datos en los comentarios o mandarlos a mi correo y con gusto te puedo ayudar, pero de primera impresion creo que esos pueden ser los posibles errores.

      Saludos!!

      • JOSE
        junio 5, 2009 a las 12:24 am

        BUENO PUES EL CODIGO QUE LE INTRODUCI AL BOTON PARA QUE GUARDE LOS DATOS EN LA BASE DE DATOS ES :

        this.mODULOSBindingSource.EndEdit(); this.mODULOSTableAdapter.Update(this.mODULODS.MODULOS); MessageBox.Show(“MODULO INSERTADO CORRECTAMENTE”); this.mODULOSBindingSource.AddNew();

      • junio 5, 2009 a las 1:43 pm

        Que tal Jose,

        al parecer creo que estas usando un asistente para crear tu sqldataadapter y tu dataset, en el metodo Update debe de recibir un dataset que es el que sera actualizado, realmente no es necesario colocar el bindignSource, no se de que manera lo estas haciendo, te recomiendo este video que hice hace un buen rato sobre como llenar un datagridview con asistentes y actualizarlo, échale un vistazo y me dices como te va, aquí el link

        http://north18rojas.spaces.live.com/blog/cns!4C4C81F348B07461!809.entry

        Saludos!

        no olvides votar por mi blog😀

  15. JOSE
    junio 9, 2009 a las 3:30 am

    OK GRACIAS LO VOY A CHECAR Y DESPUES TE DIGO COMO ME FUE
    GRACIAS POR TU TIEMPO.
    ESTOS SI SON BLOGS CHIDO

  16. JOSE
    junio 9, 2009 a las 3:42 am

    OK LO VOY A CHECAR GRACIAS POR TU TIEMPO.
    ESTE BLOG SI ESTA CHIDO…..
    Y SI SE PUEDE DESCATGAR EL VIDEO A PROPOSITO CUAL ES TU CORREO

  17. EGA
    junio 10, 2009 a las 5:37 pm

    hola que tal, lo que pasa es que yo tengo un problema para insertar datos en DB la insertcion lo hace pero despues que cierro el programa desaparecen los datos que inserte, para esto la conexion esta bien utlizo un clase para hacer esto, este es mi codigo haber si me pueden ayudar.
    //esta es la clase
    private SqlConnection conexi;

    private DataSet DS = new DataSet();

    public ConexionSQL()
    {
    string rutaConexion;
    rutaConexion= “Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\base de datos.mdf;Integrated Security=True;User Instance=True”;
    conexi = new SqlConnection(rutaConexion);
    }
    public void abrir()
    {
    conexi.Open();
    }
    public void cerrar()
    {
    conexi.Close();
    }
    public DataSet consulta(string info, string tabla)
    {
    SqlDataAdapter cmd = new SqlDataAdapter(info, conexi);
    cmd.Fill(DS, tabla);
    return DS;
    }
    //este es para insertar, eliminar y actualizar
    public void AEIdatos(string datosAEI, string tabla)
    {
    SqlCommand comandos = new SqlCommand(datosAEI, conexi);
    comandos.ExecuteNonQuery();

    }
    //esto es como lo llamo desde mi programa:
    ConexionSQL conecta = new ConexionSQL();

    try
    {
    conecta.abrir();
    conecta.AEIdatos(“INSERT INTO tipo_medida(id_medida, medida) VALUES (‘” + idm + “‘,'” + tipo + “‘)”, “tipo_medida”);

    conecta.cerrar();
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    finally
    {
    conecta.cerrar();
    }
    no me marca ni error lo relaizaa de echo me aparecen los datos que ingrese pero despues que cierro el programa se borran los datos que inserte ojala me ayuden muchas gracias.

    • junio 10, 2009 a las 10:09 pm

      Hola Ega,

      al parecer el asunto es la ubicación de tu base de datos, ya que me imagino que lo que hiciste fue añadir un nuevo elemento y eso te adjunto la base en la carpeta de tu proyecto, pero para que esto funciones debes copiar dicha base en la carpeta Bin del mismo, este es un problema un poco serio que casi nadie explica cuando pone sus ejemplo, como yo xD.

      Puedes hacer varias cosas para que esto funcione, aquí un par de ellas:
      1. Crea tu base desde el Management Studio de SQL Server express y la cadena de conexión sería más o menos así:
      Data Source=.\SQLNOR; –> SQLNOR es el nombre de tu servidor, en tu caso creo que es SQLEXPRESS
      Initial Catalog=BdWPFEjemplo;
      Persist Security Info=True;
      User ID=*****;
      Password=*****
      para esto debes asignarle a tu base un usuario y contraseña, que en muchas veces funciona solo con el ‘sa’ (super admin) y la constraseña que le pusiste al instalar el SQL Server

      Para ayudarte aquí un post que hice con WPF:

      https://mspnor.wordpress.com/2009/05/10/wpf-conectndome-a-una-base-de-datos-sql/

      2. La otra un poco menos recomendada es copiar la base a la carpeta bin de tu proyecto y veras que funciona a la perfección, puedes ir checando que los cambios se hacen desde el explorador de servidores, el problema que te pasa es que solo se actualiza el Dataset y no hace la actualizacion a la base, si utilizaste el asistente asegurate de hacer el update de dataadapter con el correspondiente dataset.

      de nuevo aquí una ayuda con un video que hice hace ya un rato:

      http://north18rojas.spaces.live.com/blog/cns!4C4C81F348B07461!809.entry
      espero que te ayude, y no olvides votar por mi blog, en el siguiente link dice como hacerlo😀

      https://mspnor.wordpress.com/2009/05/30/blog-como-votar-por-este-blog-en-el-concurso-de-blotit/

  18. EGA
    junio 12, 2009 a las 2:32 am

    hola que tal muchisimas gracias ya encontre el proble leyendo en internet encontre que cuando estas en el diseño y ejecutas todo se crea temporalmente y que cuando termina se borra todo aquello que se modifico, hice una prueba de exportar mi proyecto para ver si los guardaba y si los guarda y o se borra nada bueno en mi caso as sucede no se si otos tendran otro problema diferente. pero de ante mano muchas gracias man y esta bien chido todo tu blog y me estaras leeindo muy seguido por si me sale alguna duda jejejejeje.

  19. octubre 14, 2009 a las 8:39 pm

    Hola… Me preguntaba si puedes ayudarme… Veras he realizado una aplicación en escritorio en visual estudio 2008 con framework 3.5 en el cual trato que la ruta de conexion pueda estalbecerlo dinàmicamente… Ahora esta conexion la tengo guardada en un archivo de xml en el cual se encuentra de la siguiente forma…

    Data Source=ESTUDIAN-6555\\SQLEXPRESSS…..
    Ahora esa conexion esta bien porque lo probe antes estableciendo esa conexion…
    El problema es que cuando tratod de obtenerlo desde un archivo xml que contiene esta conexion por medio de un metodo que extrae del archivo xml esta conexion la tra asi como esta definido pero a al momento de que un metodo que usa esa conexion que contiene el archivo me dice parametro fallido…
    Si te interesa te lo envio a tu correo… Saludos

    • octubre 16, 2009 a las 1:42 pm

      Que tal Michael,

      claro, me agradaria ayudarte así que espero tu mail para revisar el proyecto va

      Saludos.

  20. antares89
    enero 25, 2010 a las 12:25 am

    tengo un problema estoy trabajando en VS 2008 C# y sql server 2000, el problema es que cuando quiero conectar mi programa a la bd desde otra maquina no funciona!!. Intente utilizar la conexion que da VS en los datagridview para ver la conexion pero no veo las bd , solo puedo ver la pc en donde tengo la bd y con esto no realiza el string???..si me pueden ayudar

  21. enero 10, 2013 a las 9:53 am

    Hi, every time i used to check webpage posts here early in the morning, for the reason that i love to gain knowledge of more and more.

  22. julio 12, 2014 a las 10:36 am

    siempre que te leo me sorprendes para bien, muchas gracias

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: