Sie sind auf Seite 1von 16

Acceso a una base de datos de SQL Server con ADO.

NET y Visual C#

Pgina 1 de 16

el Guille, la Web del Visual Basic, C#, .NET y ms...


Lo Nuevo - VS2005 - .NET - ADO.NET - ASP.NET Cmo... - Colabora - VB6 - API - Bases - HTML - Sistema Links

La OFERTA de alojamiento ms econmica: 2.95 Eur


XtraGrid Suite .NET
Advanced and feature complete data grid and UI library for VS.NET

Visual Bubble

The largest independent resource website for Mindjet MindManager

Excel Tablas Dinamicas

Automatice el reporting de su empresa generando reportes Excel.

ASP.NET Combobox

r.a.d.combobox AJAX XHTML & accessibility compliance

Anuncios Goooooogle

Anunciarse en este sitio

ADO .NET Acceso a una base de datos de SQL Server con ADO.NET y Visual C#
Cdigo de ejemplo vlido para cualquier versin de Visual C#
Publicado el 05/Feb/2006 Actualizado el 05/Feb/2006 Autor: Guillermo 'guille' Som

Introduccin
Este artculo en realidad consta de varias partes, aunque todas esas partes formarn un todo, y ese todo es un ejemplo muy bsico (o elemental) de cmo acceder a una base de datos de tipo SQL Server usando ADO.NET y Visual Basic, (cualquier versin, ya sea la 1.x o la 2.0), permitiendo navegar entre los registros, aadir

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 2 de 16

nuevos datos, modificar o borrar los existentes. Tambin veremos cmo saber las instancias de SQL Server que hay instaladas en el equipo, las cuales se mostrarn en un combo; al seleccionar la instancia, veremos cmo mostrar las bases de datos que tiene esa instancia, (excepto las del sistema o propias de SQL), las cuales estarn en otro combo. Si la tabla de prueba no existe en la base de datos seleccionada, tendremos la posibilidad de crearla. Adems de lo dicho, en este ejemplo tambin vers cmo hacer lo siguiente: -Deshabilitar los controles que estn incluidos en un GroupBox. -Conectar a la base de datos de SQL Server usando la autenticacin integrada de Windows. -Obtener todos los datos indicados en una orden SELECT y guardarlos en un DataTable. -Moverse por los registros de la tabla usando los tpicos comandos: Primero, Anterior, Siguiente y ltimo. -Aadir nuevos registros (o filas) a la tabla. -Eliminar una fila de la tabla. -Actualizar los datos de la fila actual. Y como valor aadido, la utilidad de ejemplo tambin tiene cdigo para: -Saber las instancias de SQL Server. -Saber las bases de datos de una instancia de SQL Server. -Saber si una tabla en concreto existe en una base de datos de SQL. -Crear una tabla (la usada en esta aplicacin de ejemplo). Espero que te sea de utilidad y que est ms claro y menos "liante" que el otro ejemplo que ya tena publicado.

Nota: A lo largo de este artculo, te muestro el cdigo de Visual C#, pulsa este link si quieres ver el artculo con el cdigo de ejemplo para Visual Basic.

Al final tienes el link al zip con el cdigo de ejemplo para Visual C#, el cual es vlido tanto para las versiones 2003 y 2005.

Nos vemos Guillermo P.S. Pulsa aqu para ver un ejemplo parecido para una base de datos de tipo Access con

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 3 de 16

OleDb.

Estructura de la tabla de ejemplo


Para que este cdigo funcione, debes tener una base de datos en la que se incluya una tabla llamada Prueba. Pulsa aqu si quieres saber cmo crear una base de datos de SQL Server usando cdigo de Visual C#. La estructura de esa tabla (Prueba) es la que se muestra en la siguiente tabla. Si no la tienes creada en la base de datos que elijas, el programa te preguntar si la quieres crear, as que no te preocupes de que no la tengas creada. Nombre campo ID Nombre e-mail FechaAlta Comentario Tipo int nvarchar nvarchar datetime nvarchar Comentario Clave principal auto-numrica (identidad) 50 caracteres 128 caracteres 2048 caracteres

El formulario para acceder a la base de datos


La aplicacin de ejemplo tiene un formulario con el siguiente aspecto:

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 4 de 16

El formulario de la aplicacin de ejemplo Como vemos, este formulario utiliza los campos que tiene la tabla que vamos a usar, por tanto, si vas a usar otra tabla diferente a la usada en el ejemplo, tendrs que crear tu propio diseo del formulario. En el cdigo he intentado separar el cdigo que depende de los campos, de forma que te resulte fcil de modificar. Empezando por arriba, tenemos un ComboBox (cboInstancias) en el que mostraremos las instancias de SQL Server que hay instaladas en el equipo. Pulsa aqu si quieres saber cmo averiguar las instancias de SQL Server que hay en el equipo usando cdigo de Visual C#. A la derecha, tenemos otro ComboBox (cboBases) en el que mostraremos las bases de datos que tiene la instancia de SQL Server que hayamos seleccionado del primer combo. Pulsa aqu para saber cmo averiguar las bases de datos que contiene una instancia de SQL Server usando cdigo de Visual C#. El botn que est en la parte derecha, (btnConectar), (en la misma fila que los dos combos) nos servir para conectarnos a la base de datos y a la instancia seleccionadas usando autenticacin de Windows. En ese botn se crea la conexin a la base de datos y se asigna el DataAdapter que usaremos para conectar directamente con la base de datos. Por tanto ser en el cdigo de ese botn donde tendrs que escribir todo lo necesario para realizar la conexin, cargar los datos en la tabla (DataTable) y empezar a mostrar los datos. Al pulsar en el botn de conectar, el cdigo comprueba si la tabla de pruebas existe, de no ser as, nos preguntar si la queremos crear. En el GroupBox tenemos los controles para mostrar los datos, navegar entre las filas, actualizar, crear y eliminar registros. Los botones de navegacin (o movimiento) nos servirn para ir a los distintos registros: Primero, anterior, siguiente y ltimo. El botn de Actualizar lo usaremos para actualizar los datos del registro actual. El botn Nuevo lo usaremos para aadir un nuevo registro. Cuando pulsamos en ese botn, se usarn los datos que actualmente tengamos en las cajas de textos, salvo el ID, ya que en la tabla de ejemplo es autonumrico, y por tanto se crea solo.

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 5 de 16

El botn de Eliminar lo usaremos para eliminar el registro que est actualmente activo. Cuando se elimina el registro, los datos permanecen en los controles, por si queremos volver a crearlo, (pulsando en el botn Nuevo), aunque el ID usado ser diferente al mostrado, ya que al crear un nuevo registro (o fila) el valor del campo ID se genera automticamente.

Nota IMPORTANTE: Las tres operaciones indicadas se hacen directamente en la base de datos, es decir, no trabajamos en modo desconectado, sino que cualquier cambio se reflejar inmediatamente en la base de datos.

El resto de controles simplemente los usamos para mostrar los datos.

Las variables comunes para todo el cdigo


A lo largo de la aplicacin usaremos algunas variables comunes, en realidad son tres: dt del tipo DataTable, ser la tabla a la que asignaremos los datos de la tabla de la base de datos da del tipo SqlDataAdapter, ser el adaptador que nos permitir acceder a la base de datos, para leer los datos y actualizarlos. fila del tipo int, ser el ndice de la fila actual, con idea de saber cual ser la siguiente, la anterior o la fila que queremos actualizar.
// Las variables que usaremos en este ejemplo private DataTable dt; private SqlDataAdapter da; private int fila;

Form_Load: Deshabilitar los controles y asignar el path de la base de datos


Al empezar la aplicacin, en el evento Form_Load, deshabilitaremos los controles que estn en el GroupBox, adems, averiguaremos las instancias de SQL Server que hay actualmente en el equipo y las asignaremos en el combo correspondiente, tambin aadiremos al otro combo las bases de datos que contenga la instancia predeterminada de SQL Server, y si hay alguna base de datos (que no sea del sistema), seleccionaremos la primera (ndice cero). En este evento utilizamos una funcin llamada instanciasInstaladas, esa es la que nos indica las instancias de SQL Server que tenemos instaladas en nuestro equipo y si quieres ver el cdigo puedes hacerlo desde este link. En este mismo evento y en el correspondiente al cambio de seleccin del combo de las instancias, tambin usamos una funcin (basesDeDatos), que recibe como parmetro el nombre de la instancia seleccionada, para saber las bases de datos que tiene la instancia de SQL Server que hemos seleccionado, el cdigo de esa

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 6 de 16

funcin lo puedes ver siguiendo este link.


private void Form1_Load(object sender, EventArgs e) { this.Text="Ejemplo acceso SQL Server C#"; // Limpiar los controles del GroupBox y // deshabilitarlos hasta que se conecte a la base de datos foreach(Control c in this.GroupBox1.Controls){ // Limpiar los textbox if( c is TextBox ){ c.Text = ""; } // Deshabilitarlos c.Enabled = false; } this.GroupBox1.Enabled = false; this.GroupBox1.Text = "Debes conectar antes de usar los datos"; // // Las instancias de SQL Server que hay instaladas string[] instancias; instancias = instanciasInstaladas(); foreach(string s in instancias){ if( s == "MSSQLSERVER" ){ cboInstancias.Items.Add("(local)"); }else{ cboInstancias.Items.Add(@"(local)\" + s); } } cboInstancias.Text = "(local)"; // Los nombres de las bases de datos string[] bases = basesDeDatos("(local)"); if( bases != null ){ this.cboBases.Items.AddRange(bases); } if( this.cboBases.Items.Count > 0 ){ this.cboBases.SelectedIndex = 0; } }

Al seleccionar una instancia, asignar las bases de datos que contiene


Como te he comentado antes, cuando seleccionamos una de las instancias del combo con los servidores (o instancias) de SQL Server, asignamos en el combo de las bases de datos, las que esa instancia contiene. El cdigo del evento SelectedIndexChanged es el siguiente, en el que comprobamos si hay alguna base de datos (la funcin que comprueba las bases que hay en la instancia indicada, devuelve Nothing si solo estn las bases del propio SQL Server), las agregamos al combo y seleccionamos el primer elemento.
private void cboInstancias_SelectedIndexChanged(object sender, EventArgs e) { string[] bases = basesDeDatos(cboInstancias.Text); cboBases.Items.Clear(); if( bases != null ){ this.cboBases.Items.AddRange(bases); } if( cboBases.Items.Count > 0 ){ cboBases.SelectedIndex = 0; }

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 7 de 16

Conectar a la base de datos


Para conectar con la base de datos y obtener los datos, necesitamos una cadena de conexin al servidor de SQL Server que indique que base de datos vamos a usar. Los datos los obtendremos mediante una cadena de seleccin (SELECT). En el siguiente cdigo comprobamos tambin si la tabla que usaremos existe en la base de datos seleccionada, para ello usaremos la funcin existeTabla a la que le pasaremos el objeto conexin que hemos creado y el nombre de la tabla que queremos comprobar si existe o no, que en nuestro ejemplo se llama Prueba.

Nota: En realidad el objeto SqlConnection no hace falta para rellenar los datos por medio del DataAdapter, pero si lo necesitamos para comprobar si la tabla existe.

Una vez que tenemos la conexin creada y que sabemos que la tabla existe, crearemos los objetos que nos permitirn acceder a la base de datos (mediante un objeto del tipo SqlDataAdapter), y llenaremos el objeto DataTable con los datos que hayamos indicado en la cadena de seleccin. Crearemos los comandos que necesitaremos para actualizar los datos en la base de datos (UPDATE, INSERT y DELETE). Esos comandos los creamos con un objeto del tipo SqlCommandBuilder que aunque no es la forma ms efectiva, al menos es la ms fcil de usar, y como de lo que en este artculo se trata es que sea fcil, pues eso... Los comandos los asignaremos a los objetos correspondientes del adaptador, esto en realidad no es necesario, pero algunas veces me ha dado error al no hacerlo, as que... mejor estar seguros de que se asignan!. Debido a que la tabla de ejemplo utiliza un campo autoincremental, tendremos que asignar a la propiedad MissingSchemaAction el valor AddWithKey, de esta forma, al aadir nuevos registros se incrementar el valor del ID. En la tabla de ejemplo, estamos usando un campo que contiene caracteres que pueden ser conflictivos, en este caso es simplemente un guin, pero podra ser una vocal acentuada, una ee o contener espacios, en este caso lo que hacemos es indicar en el objeto del tipo CommandBuilder que utilice prefijo y sufijo para "envolver" automticamente esos campos conflictivos, esa indicacin la hacemos mediante las propiedades QuotePrefix y QuoteSufix. Por ltimo creamos el nuevo objeto del tipo DataTable, que ser el que usemos con el mtodo Fill del adaptador, al usar ese mtodo, ser cuando se conecte con la base de datos y asigne a la tabla los datos indicados en la cadena de seleccin (SELECT). En este ejemplo, le indico que traiga todos los datos, pero tambin podra haber seleccionado con una clusula WHERE otros diferentes.

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 8 de 16

Otra cosa importante que debemos tener en cuenta con el cdigo de seleccin (SELECT) es que si en lugar de indicar un asterisco para que se utilicen todos los campos ( SELECT * ), indicamos solo los campos que nos interesan, en las actualizaciones y lecturas de datos solo podremos incluir los campos indicados. Por ejemplo, si hacemos: SELECT ID, Nombre FROM Prueba, tan solo tendremos acceso a esos dos campos, y cualquier intento de acceder a otros campos (aunque sean vlidos y existan en la tabla) dar error.

Finalmente habilitamos nuevamente los controles que estn en el GroupBox para que podamos navegar, aadir, eliminar, actualizar y escribir en las cajas de texto, y mostraremos el primer registro, para ello llamamos al cdigo del evento del botn para mostrar el primer registro. Si no hay datos, (es decir, si la tabla no contiene alguna fila), deshabilitamos el botn de actualizar y el de eliminar, para permitir solo aadir nuevos datos.
private void btnConectar_Click(object sender, EventArgs e) { // Conectar y mostrar los datos // // La cadena de conexin string sCnn = "Server=" + cboInstancias.Text + "; " + "database=" + cboBases.Text + "; integrated security=yes"; SqlConnection cnn = new SqlConnection(sCnn); if( existeTabla(cnn, "Prueba") == false ){ if( MessageBox.Show("NO existe la tabla Prueba, que es la usada para este ejemplo.\n" + "Quieres crearla?", "No existe la tabla", MessageBoxButtons.YesNo) == DialogResult.Yes ) { if( crearTablaPrueba() == false ){ return; } } else{ return; } } // La cadena de seleccin string sSel = "SELECT * FROM Prueba ORDER BY ID"; // // Comprobar si hay algn error try{ // Crear un nuevo objeto del tipo DataAdapter da = new SqlDataAdapter(sSel, sCnn); // Crear los comandos de insertar, actualizar y eliminar SqlCommandBuilder cb = new SqlCommandBuilder(da); // Como hay campos con caracteres especiales, // al usarlos incluirlos entre corchetes. cb.QuotePrefix = "["; cb.QuoteSuffix = "]"; // Asignar los comandos al DataAdapter // (se supone que lo hace automticamente, pero...) da.UpdateCommand = cb.GetUpdateCommand(); da.InsertCommand = cb.GetInsertCommand(); da.DeleteCommand = cb.GetDeleteCommand(); // // Esta base de datos usa el ID con valores automticos da.MissingSchemaAction = MissingSchemaAction.AddWithKey; // dt = new DataTable();

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 9 de 16

// Llenar la tabla con los datos indicados da.Fill(dt); // // Habilitar los controles foreach(Control c in this.GroupBox1.Controls){ c.Enabled = true; } this.GroupBox1.Enabled = true; this.GroupBox1.Text = "Conexin realizada"; // Y mostrar el primer registro if( dt.Rows.Count > 0 ){ btnFirst_Click(null, null); } else{ fila = -1; btnActualizar.Enabled = false; } } catch(Exception ex){ MessageBox.Show("ERROR al conectar o recuperar los datos:\n" + ex.Message, "Conectar con la base", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

La funcin para saber si existe la tabla indicada


private bool existeTabla(SqlConnection cnn, string nombreTabla) { // Devuelve true si la tabla indicada est en la base usada con la conexin DataTable dt = new DataTable(); bool existe = false; // try{ SqlDataAdapter da = new SqlDataAdapter( "SELECT * FROM INFORMATION_SCHEMA.TABLES " + "WHERE TABLE_TYPE = 'BASE TABLE' " + "ORDER BY TABLE_TYPE", cnn); // da.Fill(dt); if( nombreTabla == null) nombreTabla = "Prueba"; foreach(DataRow dr in dt.Rows){ if( dr["TABLE_NAME"].ToString() == nombreTabla ){ return true; } } // return existe; } catch(Exception ex){ MessageBox.Show("ERROR: " + ex.Message, "Comprobar tabla"); return false; } }

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 10 de 16

El mtodo para crear la tabla de ejemplo (Prueba)


private bool crearTablaPrueba() { // Crear la tabla de prueba en la base e instancias seleccionadas // Devuelve true si todo fue bien bool creada = false; string sCnn = "Server=" + cboInstancias.Text + "; database=" + cboBases.Text + "; integrated security=yes"; string sCmd = "CREATE TABLE [dbo].[Prueba]( " + "[ID] [int] IDENTITY(1,1) NOT NULL, " + "[Nombre] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NULL," + "[e-mail] [nvarchar](128) COLLATE Modern_Spanish_CI_AS NULL," + "[FechaAlta] [datetime] NULL," + "[Comentario] [nvarchar] (2048) COLLATE Modern_Spanish_CI_AS NULL," + "CONSTRAINT [PK_Prueba] PRIMARY KEY CLUSTERED (" + "[ID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY])" + " ON [PRIMARY]"; SqlConnection cnn = null; try{ cnn = new SqlConnection(sCnn); cnn.Open(); SqlCommand cmd = new SqlCommand(sCmd, cnn); cmd.ExecuteNonQuery(); creada = true; } catch(Exception ex){ MessageBox.Show("Error al crear la tabla:\n" + ex.Message); } finally{ if( cnn != null ){ if( cnn.State == ConnectionState.Open ){ cnn.Close(); } } } return creada; }

Aadir nuevos registros


Para aadir nuevos registros, lo primero que tenemos que hacer es crear una nueva fila. Para ello utilizamos el mtodo NewRow del objeto DataTable. Al usar ese mtodo, nos aseguramos que la nueva fila creada tiene todos los datos sobre la estructura de la tabla (o de la seleccin que hemos hecho), de forma que podamos asignar los campos, etc. La asignacin de los campos la hacemos mediante el mtodo asignarDatos, aunque podramos haberlo hecho directamente. El hacerlo mediante ese mtodo es para que nos resulte ms cmo adaptar este ejemplo a otra tabla diferente a la que yo propongo, ya que en ese mtodo haramos todas las asignaciones que debamos hacer, salvo la del campo ID ya que al ser autonumrico no podemos asignarle un valor, porque ese valor lo asignar

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 11 de 16

automticamente ADO.NET. Una vez que la fila tiene asignados los valores de los campos, la aadimos a las fila de la tabla. Esto es necesario, ya que el mtodo NewRow solo crea una fila, pero no la "relaciona" (o aade) a la tabla actual. Finalmente actualizamos los datos mediante el mtodo Update del adaptador. En realidad no hace falta hacer esa actualizacin en este preciso momento, pero si no lo hacemos, debemos aadir otro botn para que los datos se asignen a la base de datos, ya que al aadir un nuevo valor a la tabla, lo haremos en la "copia" que tenemos localmente en memoria, y no directamente en la base de datos, como ocurra, por ejemplo, con VB6 y los Recordsets. Una vez actualizados los datos en la base de datos, le indicamos a la tabla que acepte los cambios que hayamos hecho, de forma que quede sincronizada nuevamente. Esto es necesario, ya que si no lo hacemos, la tabla mantendr los cambios que hayamos hecho y si nuevamente "sincronizamos" esos datos con la base real, se podran producir errores.

Es importante que sepamos que cuando llamamos al mtodo Update del adaptador, se realizan todas las actualizaciones, es decir, no solo aadir nuevos datos, como "se supone" que es lo que hace este mtodo, sino que si hubisemos eliminado filas, o modificado algunas, esas modificaciones tambin se reflejaran en la base de datos.

Debido a cmo funcionan los campos autincrementales, para asegurarnos de que en realidad el valor de ese ID se actualiza correctamente, si es el primer registro que aadimos (o vale cero, como es la comprobacin que hacemos aqu), deberamos volver a leer los datos reales de la base de datos (que ser despus de haber aadido el primer registro) con idea de que ese ID tenga el valor correcto. Esto no es necesario en los siguientes datos que vayamos aadiendo, ya que en otros casos el valor del ID se asignar correctamente. Como ves, tambin controlamos los errores que se puedan producir... nunca est de ms!
private void btnNuevo_Click(object sender, EventArgs e) { // Crear un nuevo registro DataRow dr = dt.NewRow(); // Asignar los datos de los textbox a la fila asignarDatos(dr); // Aadir la nueva fila a la tabla dt.Rows.Add(dr); // Guardar fsicamente los datos en la base try{ da.Update(dt); dt.AcceptChanges(); // Si es el primer registro de la base, // volver a leer los datos para actualizar los IDs if( Convert.ToInt32("0" + dr["ID"].ToString()) == 0 ){ dt = new DataTable(); da.Fill(dt); } // Posicionarlo en la ltima fila btnLast_Click(null, null); }catch(DBConcurrencyException ex){ MessageBox.Show("Error de concurrencia:\n" + ex.Message); }catch(Exception ex){

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 12 de 16

MessageBox.Show(ex.Message); } }

Si la caja de textos para la fecha no tiene nada, usamos un valor "nulo" para asignar a ese campo. De todas formas, deberamos usar un try/catch para comprobar que la fecha asignada es vlida.
private void asignarDatos(DataRow dr) { // Usar los datos que hay en los textbox dr["Nombre"] = txtNombre.Text; dr["e-mail"] = txtEmail.Text; if( txtFechaAlta.Text == "" ){ dr["FechaAlta"] = DBNull.Value; } else{ dr["FechaAlta"] = txtFechaAlta.Text; } dr["Comentario"] = txtComentario.Text; }

Actualizar los registros modificados


La actualizacin de los datos, es decir, cuando modificamos un registro (o fila) y queremos que esos datos se guarden, es muy simple. En el cdigo del mtodo de actualizar, primero comprobamos que el valor de la variable fila sea vlido, es decir, est dentro del rango de filas que tiene el DataTable. Si es as, asignamos a una variable del tipo DataRow la fila en cuestin y posteriormente llamamos al mtodo asignarDatos que vimos antes, que como sabes es el que se encarga de asignar las cajas de texto a los campos correspondientes. Una vez que la fila tiene los nuevos datos, volvemos a llamar al mtodo Update del adaptador, como coment antes, esta llamada al mtodo Update solo es necesario si queremos asignar directamente los datos en la base, es decir, hacer que los cambios se hagan en ese preciso momento. Tambin encerramos esa actualizacin dentro de un Try/Catch para detectar los errores que se puedan producir.
private void btnActualizar_Click(object sender, EventArgs e) { // Actualizar los datos en la fila actual if( fila < 0 || fila > dt.Rows.Count - 1 ) return; DataRow dr = dt.Rows[fila]; // Asignar los datos de los textbox a la fila asignarDatos(dr); try{ da.Update(dt); dt.AcceptChanges(); }catch(DBConcurrencyException ex){ MessageBox.Show("Error de concurrencia:\n" + ex.Message); }catch(Exception ex){ MessageBox.Show(ex.Message);

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 13 de 16

} }

Eliminar el registro actual


Una vez que tenemos un registro mostrado, podemos pulsar en el botn Eliminar, para hacerlo, usamos el mtodo Delete de la fila indicada y a continuacin le indicamos al adaptador que actualice los datos fsicamente en la base y a la tabla le tenemos que indicar que acepte los cambios, con idea de que esa fila que hemos eliminado, la elimine tambin de la memoria. Cuando eliminamos un registro, en nuestro programa se dejan los datos, de forma que si nos arrepentimos, podamos volver a crearlos, no recuperarlos, sino crear un registro nuevo, con su nuevo ID, etc.
private void btnEliminar_Click(object sender, EventArgs e) { // Eliminar la fila actual if( fila < 0 || fila > dt.Rows.Count - 1 ) return; try{ // Eliminar la fila de la tabla dt.Rows[fila].Delete(); // Actualizar fsicamente la base de datos da.Update(dt); // Aceptar los cambios en la copia local dt.AcceptChanges(); }catch(DBConcurrencyException ex){ MessageBox.Show("Error de concurrencia:\n" + ex.Message); }catch(Exception ex){ MessageBox.Show(ex.Message); } }

Nota: Si lo que realmente te interesa es que los datos NO se eliminen directamente en la base de datos, (ni se actualicen ni creen nuevos), hasta que tu quieras, la llamada al mtodo Update del adaptador y la llamada al mtodo AcceptChanges de la tabla no deberas llamarla en estos tres mtodos que acabamos de ver, sino que puedes hacerlo, por ejemplo, cuando el usuario "realmente" quiera que todos esos cambios se hagan fsicamente en la base de datos. Pero eso es, como siempre, a tu criterio.

Moverse entre registros, con comandos para ir al primero, al ltimo, al anterior y al siguiente
AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 14 de 16

Para movernos entre los registros usaremos cuatro mtodos, uno para ir al principio, otro para ir al final, otro para ir al registro anterior y otro para el siguiente. En estos cuatro mtodos usaremos un mtodo extra que ser el que se encargue de comprobar si todo est correcto (o casi) y de mostrar los datos adecuados en cada caja de texto. Al igual que antes con el mtodo asignarDatos, lo he puesto por separado, entre otras cosas para facilitar la modificacin del cdigo para otras tablas. Tambin para que no haya que estar repitiendo en el resto de los mtodos las comprobaciones de que el valor de fila indicado est dentro del rango vlido. Ese rango debe estar entre cero para el primer registro y uno menos del nmero total de filas para el ltimo, por tanto, si el valor del nmero de la fila indicado no es correcto, no hacemos nada, simplemente salimos del mtodo. En caso de que sigamos, quiere decir que es un valor de fila correcto, por tanto leemos esa fila (asignndola a una variable de tipo DataRow) y asignamos los valores a las cajas de texto, en este caso si que usamos el valor del campo ID con idea de que veamos ese valor. Por ltimo habilitamos el botn de actualizar y eliminar, ya que se supone que hay datos.
private void mostrarDatos(int f) { int uf = dt.Rows.Count - 1; if( f < 0 || uf < 0 ) return; // DataRow dr = dt.Rows[f]; txtID.Text = dr["ID"].ToString(); txtNombre.Text = dr["Nombre"].ToString(); txtEmail.Text = dr["e-mail"].ToString(); txtFechaAlta.Text = dr["FechaAlta"].ToString(); txtComentario.Text = dr["Comentario"].ToString(); // btnActualizar.Enabled = true; btnEliminar.Enabled = true; }

Los cuatro mtodos para movernos son los siguientes, veamos que es lo que hacemos en cada uno de ellos, aunque creo que viendo el cdigo queda clara la intencin.

Nota: Como veremos en el cdigo, en realidad no hace falta pasarle ningn parmetro al mtodo mostrarDatos, ya que al tener la variable fila disponible en todo el formulario, podramos usar esa variable en lugar del parmetro, pero... lo dejo as por si se te ocurre hacer cambios y no usar esa variable, que hay gente que no le gusta usar variables "globales" al formulario o clase...

Para ir al primero, simplemente asignamos cero a la variable de la fila actual y llamamos al mtodo de mostrar los datos.

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 15 de 16

private void btnFirst_Click(object sender, EventArgs e) { // Posicionarse en la primera fila fila = 0; // Mostrar los datos de la fila indicada mostrarDatos(fila); }

Para ir al ltimo, averiguamos cual es la ltima fila, que como vemos es el valor devuelto por la propiedad Count de la coleccin de filas (Rows), menos uno, ya que como sabemos todos los arrays y colecciones de .NET siempre empiezan con el ndice cero.
private void btnLast_Click(object sender, EventArgs e) { // Posicionarse en la ltima fila fila = dt.Rows.Count - 1; // Mostrar los datos de la fila indicada mostrarDatos(fila); }

Para ir al anterior simplemente le restamos uno al valor de la fila actual, pero debemos hacer una comprobacin de que no sea menor de cero, ya que es posible que estemos en el primer registro y pulsemos en el botn de ir al anterior. En caso de que estemos en el primero, seguiremos en ese mismo registro.
private void btnPrev_Click(object sender, EventArgs e) { // Posicionarse en la fila anterior fila = fila - 1; if( fila < 0 ) fila = 0; // Mostrar los datos de la fila indicada mostrarDatos(fila); }

Por ltimo, para ir al siguiente, hacemos lo mismo que antes, pero en lugar de restar uno, lo que hacemos es aadir uno al valor de la fila actual, y en el caso de que sea mayor que la ltima fila, pues nos quedamos en esa ltima fila.
private void btnNext_Click(object sender, EventArgs e) { // Posicionarse en la fila siguiente int uf = dt.Rows.Count - 1; fila = fila + 1; if( fila > uf ) fila = uf; // Mostrar los datos de la fila indicada mostrarDatos(fila); }

Link al cdigo de ejemplo


Aqu tienes los links al cdigo de ejemplo para Visual C#. El proyecto est creado con Visual Studio 2003, pero funcionar igualmente en la versin 2005 y con cambios menores, tambin en la versin 2002. El cdigo para Visual C#: ejemploDatosSQLCS.zip - 11.00 KB

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Acceso a una base de datos de SQL Server con ADO.NET y Visual C#

Pgina 16 de 16

(MD5 checksum: 9ADF5E65CA151BE0B1045C61B6E1985A)

La cajita de Panorama Box:

Calificacin: Lectores: 20 Guillermo guille Autor: Som Calif. Autor: DCE: 1 Normal

Calificar

Mi Panorama SOS Escribe para Nosostros

AcroPDF - A Quality PDF Writer and PDF Converter to create PDF files. To remove the line, buy a license. http://www.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp.htm 20/07/2006

Das könnte Ihnen auch gefallen