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

NET y Visual C#

Página 1 de 16

el Guille, la Web del Visual Basic, C#, .NET y más...
Lo Nuevo - VS2005 - .NET - ADO.NET - ASP.NET Cómo... - Colabora - VB6 - API - Bases - HTML - Sistema Links

La OFERTA de alojamiento más económica: 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#
Código de ejemplo válido para cualquier versión de Visual C#
Publicado el 05/Feb/2006 Actualizado el 05/Feb/2006 Autor: Guillermo 'guille' Som

Introducción
Este artículo en realidad consta de varias partes, aunque todas esas partes formarán un todo, y ese todo es un ejemplo muy básico (o elemental) de cómo acceder a una base de datos de tipo SQL Server usando ADO.NET y Visual Basic, (cualquier versión, ya sea la 1.x o la 2.0), permitiendo navegar entre los registros, añadir

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

en este ejemplo también verás cómo hacer lo siguiente: -Deshabilitar los controles que estén incluidos en un GroupBox. las cuales estarán en otro combo. Si la tabla de prueba no existe en la base de datos seleccionada. veremos cómo mostrar las bases de datos que tiene esa instancia. -Crear una tabla (la usada en esta aplicación de ejemplo). Al final tienes el link al zip con el código de ejemplo para Visual C#. http://www. buy a license.A Quality PDF Writer and PDF Converter to create PDF files. -Eliminar una fila de la tabla. Pulsa aquí para ver un ejemplo parecido para una base de datos de tipo Access con AcroPDF . las cuales se mostrarán en un combo.info/NET/ADONET/ejemplo_adonet_sql_csharp. También veremos cómo saber las instancias de SQL Server que hay instaladas en el equipo. pulsa este link si quieres ver el artículo con el código de ejemplo para Visual Basic. Siguiente y Último. tendremos la posibilidad de crearla. -Conectar a la base de datos de SQL Server usando la autenticación integrada de Windows. Nota: A lo largo de este artículo. modificar o borrar los existentes. -Añadir nuevos registros (o filas) a la tabla. Además de lo dicho. te muestro el código de Visual C#.htm 20/07/2006 . To remove the line.S.elguille. Y como valor añadido.NET y Visual C# Página 2 de 16 nuevos datos. -Actualizar los datos de la fila actual. (excepto las del sistema o propias de SQL). -Saber las bases de datos de una instancia de SQL Server. al seleccionar la instancia. Espero que te sea de utilidad y que esté más claro y menos "liante" que el otro ejemplo que ya tenía publicado. -Saber si una tabla en concreto existe en una base de datos de SQL. -Obtener todos los datos indicados en una orden SELECT y guardarlos en un DataTable. Anterior. Nos vemos Guillermo P. la utilidad de ejemplo también tiene código para: -Saber las instancias de SQL Server. -Moverse por los registros de la tabla usando los típicos comandos: Primero.Acceso a una base de datos de SQL Server con ADO. el cual es válido tanto para las versiones 2003 y 2005.

NET y Visual C# Página 3 de 16 OleDb. buy a license. Pulsa aquí si quieres saber cómo crear una base de datos de SQL Server usando código de Visual C#. el programa te preguntará si la quieres crear. Nombre campo ID Nombre e-mail FechaAlta Comentario Tipo int nvarchar nvarchar datetime nvarchar Comentario Clave principal auto-numérica (identidad) 50 caracteres 128 caracteres 2048 caracteres El formulario para acceder a la base de datos La aplicación de ejemplo tiene un formulario con el siguiente aspecto: AcroPDF . Si no la tienes creada en la base de datos que elijas. La estructura de esa tabla (Prueba) es la que se muestra en la siguiente tabla. http://www.htm 20/07/2006 . Estructura de la tabla de ejemplo Para que este código funcione.A Quality PDF Writer and PDF Converter to create PDF files.info/NET/ADONET/ejemplo_adonet_sql_csharp. debes tener una base de datos en la que se incluya una tabla llamada Prueba.Acceso a una base de datos de SQL Server con ADO.elguille. To remove the line. así que no te preocupes de que no la tengas creada.

se usarán los datos que actualmente tengamos en las cajas de textos. (en la misma fila que los dos combos) nos servirá para conectarnos a la base de datos y a la instancia seleccionadas usando autenticación de Windows. Pulsa aquí para saber cómo averiguar las bases de datos que contiene una instancia de SQL Server usando código de Visual C#. de forma que te resulte fácil de modificar. El botón que está en la parte derecha. A la derecha. salvo el ID. de no ser así. buy a license.info/NET/ADONET/ejemplo_adonet_sql_csharp. navegar entre las filas. Al pulsar en el botón de conectar. (btnConectar). cargar los datos en la tabla (DataTable) y empezar a mostrar los datos. To remove the line. por tanto. siguiente y último.NET y Visual C# Página 4 de 16 El formulario de la aplicación de ejemplo Como vemos. si vas a usar otra tabla diferente a la usada en el ejemplo. y por tanto se crea solo. crear y eliminar registros. Cuando pulsamos en ese botón. En ese botón se crea la conexión a la base de datos y se asigna el DataAdapter que usaremos para conectar directamente con la base de datos. En el código he intentado separar el código que depende de los campos. Los botones de navegación (o movimiento) nos servirán para ir a los distintos registros: Primero. nos preguntará si la queremos crear. el código comprueba si la tabla de pruebas existe. anterior. Pulsa aquí si quieres saber cómo averiguar las instancias de SQL Server que hay en el equipo usando código de Visual C#.htm 20/07/2006 . El botón Nuevo lo usaremos para añadir un nuevo registro. AcroPDF . http://www. actualizar.Acceso a una base de datos de SQL Server con ADO. En el GroupBox tenemos los controles para mostrar los datos. 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.A Quality PDF Writer and PDF Converter to create PDF files. ya que en la tabla de ejemplo es autonumérico. tenemos un ComboBox (cboInstancias) en el que mostraremos las instancias de SQL Server que hay instaladas en el equipo. este formulario utiliza los campos que tiene la tabla que vamos a usar. Por tanto será en el código de ese botón donde tendrás que escribir todo lo necesario para realizar la conexión.elguille. Empezando por arriba. tendrás que crear tu propio diseño del formulario. El botón de Actualizar lo usaremos para actualizar los datos del registro actual.

http://www.htm 20/07/2006 . para leer los datos y actualizarlos.info/NET/ADONET/ejemplo_adonet_sql_csharp. private SqlDataAdapter da. En este evento utilizamos una función llamada instanciasInstaladas. buy a license. será el índice de la fila actual.A Quality PDF Writer and PDF Converter to create PDF files. (pulsando en el botón Nuevo). Cuando se elimina el registro. el código de esa AcroPDF . también usamos una función (basesDeDatos). que recibe como parámetro el nombre de la instancia seleccionada. El resto de controles simplemente los usamos para mostrar los datos. no trabajamos en modo desconectado. private int fila. es decir. será el adaptador que nos permitirá acceder a la base de datos. fila del tipo int. Nota IMPORTANTE: Las tres operaciones indicadas se hacen directamente en la base de datos. esa es la que nos indica las instancias de SQL Server que tenemos instaladas en nuestro equipo y si quieres ver el código puedes hacerlo desde este link. To remove the line. seleccionaremos la primera (índice cero). deshabilitaremos los controles que están en el GroupBox. para saber las bases de datos que tiene la instancia de SQL Server que hemos seleccionado. será la tabla a la que asignaremos los datos de la tabla de la base de datos da del tipo SqlDataAdapter. ya que al crear un nuevo registro (o fila) el valor del campo ID se genera automáticamente.elguille. la anterior o la fila que queremos actualizar. sino que cualquier cambio se reflejará inmediatamente en la base de datos. por si queremos volver a crearlo.NET y Visual C# Página 5 de 16 El botón de Eliminar lo usaremos para eliminar el registro que esté actualmente activo. con idea de saber cual será la siguiente. y si hay alguna base de datos (que no sea del sistema). Las variables comunes para todo el código A lo largo de la aplicación usaremos algunas variables comunes. además. averiguaremos las instancias de SQL Server que hay actualmente en el equipo y las asignaremos en el combo correspondiente. los datos permanecen en los controles. En este mismo evento y en el correspondiente al cambio de selección del combo de las instancias.Acceso a una base de datos de SQL Server con ADO. aunque el ID usado será diferente al mostrado. en el evento Form_Load. en realidad son tres: dt del tipo DataTable. Form_Load: Deshabilitar los controles y asignar el path de la base de datos Al empezar la aplicación. también añadiremos al otro combo las bases de datos que contenga la instancia predeterminada de SQL Server. // Las variables que usaremos en este ejemplo private DataTable dt.

Enabled = false. } if( this.AddRange(bases).Text="Ejemplo acceso SQL Server C#".Clear().Enabled = false.AddRange(bases). EventArgs e) { string[] bases = basesDeDatos(cboInstancias.htm 20/07/2006 . // Los nombres de las bases de datos string[] bases = basesDeDatos("(local)"). las que esa instancia contiene.NET y Visual C# Página 6 de 16 función lo puedes ver siguiendo este link. } this. instancias = instanciasInstaladas(). en el que comprobamos si hay alguna base de datos (la función que comprueba las bases que hay en la instancia indicada. cuando seleccionamos una de las instancias del combo con los servidores (o instancias) de SQL Server. } } cboInstancias.Count > 0 ){ cboBases. } // Deshabilitarlos c.cboBases. if( bases != null ){ this.cboBases.SelectedIndex = 0. asignamos en el combo de las bases de datos.Add(@"(local)\" + s).Items. EventArgs e) { this. // Limpiar los controles del GroupBox y // deshabilitarlos hasta que se conecte a la base de datos foreach(Control c in this. El código del evento SelectedIndexChanged es el siguiente. // // Las instancias de SQL Server que hay instaladas string[] instancias. To remove the line.Count > 0 ){ this. foreach(string s in instancias){ if( s == "MSSQLSERVER" ){ cboInstancias. if( bases != null ){ this.Text = "Debes conectar antes de usar los datos". las agregamos al combo y seleccionamos el primer elemento.SelectedIndex = 0. devuelve Nothing si solo están las bases del propio SQL Server).Items. buy a license.Items.GroupBox1.Items. } if( cboBases. http://www.Text = "(local)".A Quality PDF Writer and PDF Converter to create PDF files. } AcroPDF . } } Al seleccionar una instancia.info/NET/ADONET/ejemplo_adonet_sql_csharp.Items.Add("(local)"). private void cboInstancias_SelectedIndexChanged(object sender. private void Form1_Load(object sender.Text).GroupBox1.cboBases.Acceso a una base de datos de SQL Server con ADO.elguille. cboBases.Controls){ // Limpiar los textbox if( c is TextBox ){ c. this.Text = "". asignar las bases de datos que contiene Como te he comentado antes.Items. }else{ cboInstancias.GroupBox1.Items.cboBases.

Debido a que la tabla de ejemplo utiliza un campo autoincremental.info/NET/ADONET/ejemplo_adonet_sql_csharp.Acceso a una base de datos de SQL Server con ADO. y como de lo que en este artículo se trata es que sea fácil.. Por último creamos el nuevo objeto del tipo DataTable. al añadir nuevos registros se incrementará el valor del ID. En la tabla de ejemplo. una eñe o contener espacios. Esos comandos los creamos con un objeto del tipo SqlCommandBuilder que aunque no es la forma más efectiva. pues eso. que será el que usemos con el método Fill del adaptador. para ello usaremos la función existeTabla a la que le pasaremos el objeto conexión que hemos creado y el nombre de la tabla que queremos comprobar si existe o no. al usar ese método. ¡mejor estar seguros de que se asignan!. INSERT y DELETE). Los comandos los asignaremos a los objetos correspondientes del adaptador.. y llenaremos el objeto DataTable con los datos que hayamos indicado en la cadena de selección. AcroPDF .A Quality PDF Writer and PDF Converter to create PDF files. En este ejemplo.. esto en realidad no es necesario. Los datos los obtendremos mediante una cadena de selección (SELECT). de esta forma. Crearemos los comandos que necesitaremos para actualizar los datos en la base de datos (UPDATE. pero algunas veces me ha dado error al no hacerlo.htm 20/07/2006 . tendremos que asignar a la propiedad MissingSchemaAction el valor AddWithKey. pero también podría haber seleccionado con una cláusula WHERE otros diferentes. estamos usando un campo que contiene caracteres que pueden ser conflictivos. en este caso lo que hacemos es indicar en el objeto del tipo CommandBuilder que utilice prefijo y sufijo para "envolver" automáticamente esos campos conflictivos. que en nuestro ejemplo se llama Prueba. crearemos los objetos que nos permitirán acceder a la base de datos (mediante un objeto del tipo SqlDataAdapter). pero podría ser una vocal acentuada. necesitamos una cadena de conexión al servidor de SQL Server que indique que base de datos vamos a usar. esa indicación la hacemos mediante las propiedades QuotePrefix y QuoteSufix. será cuando se conecte con la base de datos y asigne a la tabla los datos indicados en la cadena de selección (SELECT). al menos es la más fácil de usar. le indico que traiga todos los datos. así que.elguille. http://www. Nota: En realidad el objeto SqlConnection no hace falta para rellenar los datos por medio del DataAdapter. To remove the line.NET y Visual C# Página 7 de 16 } Conectar a la base de datos Para conectar con la base de datos y obtener los datos. en este caso es simplemente un guión. buy a license. Una vez que tenemos la conexión creada y que sabemos que la tabla existe. En el siguiente código comprobamos también si la tabla que usaremos existe en la base de datos seleccionada.. pero si lo necesitamos para comprobar si la tabla existe.

. "No existe la tabla".GetInsertCommand(). que es la usada para este ejemplo. SqlConnection cnn = new SqlConnection(sCnn). añadir.Text + ".YesNo) == DialogResult. deshabilitamos el botón de actualizar y el de eliminar. da. MessageBoxButtons.QuoteSuffix = "]".MissingSchemaAction = MissingSchemaAction..Acceso a una base de datos de SQL Server con ADO. cb. tan solo tendremos acceso a esos dos campos. buy a license. To remove the line. EventArgs e) { // Conectar y mostrar los datos // // La cadena de conexión string sCnn = "Server=" + cboInstancias.NET y Visual C# Página 8 de 16 Otra cosa importante que debemos tener en cuenta con el código de selección (SELECT) es que si en lugar de indicar un asterisco para que se utilicen todos los campos ( SELECT * ). y cualquier intento de acceder a otros campos (aunque sean válidos y existan en la tabla) dará error. en las actualizaciones y lecturas de datos solo podremos incluir los campos indicados. actualizar y eliminar SqlCommandBuilder cb = new SqlCommandBuilder(da). } } // La cadena de selección string sSel = "SELECT * FROM Prueba ORDER BY ID". eliminar. Nombre FROM Prueba. private void btnConectar_Click(object sender.A Quality PDF Writer and PDF Converter to create PDF files.AddWithKey.InsertCommand = cb. // // Esta base de datos usa el ID con valores automáticos da.\n" + "¿Quieres crearla?". para permitir solo añadir nuevos datos. si la tabla no contiene alguna fila).DeleteCommand = cb. da. y mostraremos el primer registro. si hacemos: SELECT ID. // Como hay campos con caracteres especiales.) da.elguille.htm 20/07/2006 . Si no hay datos. AcroPDF . Finalmente habilitamos nuevamente los controles que están en el GroupBox para que podamos navegar.GetDeleteCommand().Text + ". cb. // al usarlos incluirlos entre corchetes. // Asignar los comandos al DataAdapter // (se supone que lo hace automáticamente. actualizar y escribir en las cajas de texto. Por ejemplo. } } else{ return. http://www. pero. " + "database=" + cboBases.Show("NO existe la tabla Prueba. if( existeTabla(cnn. indicamos solo los campos que nos interesan. // // Comprobar si hay algún error try{ // Crear un nuevo objeto del tipo DataAdapter da = new SqlDataAdapter(sSel. // dt = new DataTable(). // Crear los comandos de insertar.QuotePrefix = "[". sCnn).UpdateCommand = cb.Yes ) { if( crearTablaPrueba() == false ){ return. para ello llamamos al código del evento del botón para mostrar el primer registro. (es decir. "Prueba") == false ){ if( MessageBox.info/NET/ADONET/ejemplo_adonet_sql_csharp.GetUpdateCommand(). integrated security=yes".

this.elguille.Message. } } // return existe. "Comprobar tabla"). } else{ fila = -1.GroupBox1.Enabled = true. http://www.A Quality PDF Writer and PDF Converter to create PDF files.GroupBox1. // // Habilitar los controles foreach(Control c in this.Rows.NET y Visual C# Página 9 de 16 // Llenar la tabla con los datos indicados da.OK.htm 20/07/2006 .Rows){ if( dr["TABLE_NAME"]. foreach(DataRow dr in dt.Controls){ c.Text = "Conexión realizada". btnActualizar.TABLES " + "WHERE TABLE_TYPE = 'BASE TABLE' " + "ORDER BY TABLE_TYPE". To remove the line.info/NET/ADONET/ejemplo_adonet_sql_csharp.Fill(dt). // try{ SqlDataAdapter da = new SqlDataAdapter( "SELECT * FROM INFORMATION_SCHEMA.Fill(dt). buy a license. "Conectar con la base". } } La función para saber si existe la tabla indicada private bool existeTabla(SqlConnection cnn. bool existe = false. } } catch(Exception ex){ MessageBox.Message.Acceso a una base de datos de SQL Server con ADO.Count > 0 ){ btnFirst_Click(null.Show("ERROR: " + ex. string nombreTabla) { // Devuelve true si la tabla indicada está en la base usada con la conexión DataTable dt = new DataTable(). // da. // Y mostrar el primer registro if( dt. null).Show("ERROR al conectar o recuperar los datos:\n" + ex. if( nombreTabla == null) nombreTabla = "Prueba".GroupBox1. MessageBoxIcon. } this. } catch(Exception ex){ MessageBox.Enabled = true. } } AcroPDF .ToString() == nombreTabla ){ return true. return false. MessageBoxButtons.Enabled = false. cnn).Error).

de forma que podamos asignar los campos.Show("Error al crear la tabla:\n" + ex.A Quality PDF Writer and PDF Converter to create PDF files. ya que en ese método haríamos todas las asignaciones que debamos hacer.ExecuteNonQuery().htm 20/07/2006 . try{ cnn = new SqlConnection(sCnn). nos aseguramos que la nueva fila creada tiene todos los datos sobre la estructura de la tabla (o de la selección que hemos hecho).Message).Text + ".[Prueba]( " + "[ID] [int] IDENTITY(1. string sCnn = "Server=" + cboInstancias. SqlCommand cmd = new SqlCommand(sCmd." + "[e-mail] [nvarchar](128) COLLATE Modern_Spanish_CI_AS NULL. } } } return creada. integrated security=yes". etc.Open()." + "CONSTRAINT [PK_Prueba] PRIMARY KEY CLUSTERED (" + "[ID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY])" + " ON [PRIMARY]". cnn). lo primero que tenemos que hacer es crear una nueva fila. } Añadir nuevos registros Para añadir nuevos registros. " + "[Nombre] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NULL. } finally{ if( cnn != null ){ if( cnn. Para ello utilizamos el método NewRow del objeto DataTable. } catch(Exception ex){ MessageBox. Al usar ese método.State == ConnectionState. La asignación de los campos la hacemos mediante el método asignarDatos. string sCmd = "CREATE TABLE [dbo].elguille.NET y Visual C# Página 10 de 16 El método 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." + "[Comentario] [nvarchar] (2048) COLLATE Modern_Spanish_CI_AS NULL. El hacerlo mediante ese método es para que nos resulte más cómo adaptar este ejemplo a otra tabla diferente a la que yo propongo.Acceso a una base de datos de SQL Server con ADO.Text + ". cmd. To remove the line. database=" + cboBases. creada = true. salvo la del campo ID ya que al ser autonumérico no podemos asignarle un valor. buy a license. SqlConnection cnn = null.info/NET/ADONET/ejemplo_adonet_sql_csharp." + "[FechaAlta] [datetime] NULL.1) NOT NULL.Close(). porque ese valor lo asignará AcroPDF . http://www.Open ){ cnn. aunque podríamos haberlo hecho directamente. cnn.

Esto es necesario. http://www. o modificado algunas. Una vez actualizados los datos en la base de datos. ya que el método NewRow solo crea una fila. Finalmente actualizamos los datos mediante el método Update del adaptador.Acceso a una base de datos de SQL Server con ADO. Esto no es necesario en los siguientes datos que vayamos añadiendo. con VB6 y los Recordsets. da. deberíamos volver a leer los datos reales de la base de datos (que será después de haber añadido el primer registro) con idea de que ese ID tenga el valor correcto.Fill(dt). le indicamos a la tabla que acepte los cambios que hayamos hecho.NET.elguille.info/NET/ADONET/ejemplo_adonet_sql_csharp. la tabla mantendrá los cambios que hayamos hecho y si nuevamente "sincronizamos" esos datos con la base real. }catch(DBConcurrencyException ex){ MessageBox. se realizan todas las actualizaciones. Es importante que sepamos que cuando llamamos al método Update del adaptador.AcceptChanges(). como ocurría. Como ves. ¡nunca está de más! private void btnNuevo_Click(object sender.htm 20/07/2006 . To remove the line. // Añadir la nueva fila a la tabla dt.ToInt32("0" + dr["ID"]. debemos añadir otro botón para que los datos se asignen a la base de datos.. no solo añadir nuevos datos.A Quality PDF Writer and PDF Converter to create PDF files. buy a license. Debido a cómo funcionan los campos autincrementales. ya que en otros casos el valor del ID se asignará correctamente. // Guardar físicamente los datos en la base try{ da. Una vez que la fila tiene asignados los valores de los campos. como "se supone" que es lo que hace este método. // volver a leer los datos para actualizar los IDs if( Convert.ToString()) == 0 ){ dt = new DataTable().Show("Error de concurrencia:\n" + ex.NET y Visual C# Página 11 de 16 automáticamente ADO. la añadimos a las fila de la tabla. de forma que quede sincronizada nuevamente. dt. por ejemplo. }catch(Exception ex){ AcroPDF . si es el primer registro que añadimos (o vale cero. esas modificaciones también se reflejarían en la base de datos. para asegurarnos de que en realidad el valor de ese ID se actualiza correctamente.NewRow(). Esto es necesario. también controlamos los errores que se puedan producir. como es la comprobación que hacemos aquí). // Asignar los datos de los textbox a la fila asignarDatos(dr). pero no la "relaciona" (o añade) a la tabla actual.Message). y no directamente en la base de datos.Update(dt). pero si no lo hacemos.. es decir. } // Posicionarlo en la última fila btnLast_Click(null.Add(dr). lo haremos en la "copia" que tenemos localmente en memoria. // Si es el primer registro de la base.Rows. se podrían producir errores. EventArgs e) { // Crear un nuevo registro DataRow dr = dt. ya que si no lo hacemos. ya que al añadir un nuevo valor a la tabla. sino que si hubiésemos eliminado filas. null). En realidad no hace falta hacer esa actualización en este preciso momento.

}catch(Exception ex){ MessageBox. volvemos a llamar al método Update del adaptador. es decir. } Actualizar los registros modificados La actualización de los datos. asignamos a una variable del tipo DataRow la fila en cuestión y posteriormente llamamos al método asignarDatos que vimos antes. Si es así.NET y Visual C# Página 12 de 16 MessageBox.elguille.Text.Show(ex.info/NET/ADONET/ejemplo_adonet_sql_csharp. Una vez que la fila tiene los nuevos datos.Text. EventArgs e) { // Actualizar los datos en la fila actual if( fila < 0 || fila > dt. dt. En el código del método de actualizar.Rows. es muy simple.Rows[fila].1 ) return.htm 20/07/2006 .Text. También encerramos esa actualización dentro de un Try/Catch para detectar los errores que se puedan producir.Count . usamos un valor "nulo" para asignar a ese campo.Message). http://www. try{ da. cuando modificamos un registro (o fila) y queremos que esos datos se guarden. private void asignarDatos(DataRow dr) { // Usar los datos que hay en los textbox dr["Nombre"] = txtNombre. }catch(DBConcurrencyException ex){ MessageBox. AcroPDF .Text. es decir.Show("Error de concurrencia:\n" + ex. que como sabes es el que se encarga de asignar las cajas de texto a los campos correspondientes. // Asignar los datos de los textbox a la fila asignarDatos(dr).Acceso a una base de datos de SQL Server con ADO. esté dentro del rango de filas que tiene el DataTable.Value.Text == "" ){ dr["FechaAlta"] = DBNull. To remove the line. if( txtFechaAlta. DataRow dr = dt.Message). hacer que los cambios se hagan en ese preciso momento. } } Si la caja de textos para la fecha no tiene nada.Show(ex. es decir. dr["e-mail"] = txtEmail.A Quality PDF Writer and PDF Converter to create PDF files. } else{ dr["FechaAlta"] = txtFechaAlta. como comenté antes.Update(dt).AcceptChanges(). primero comprobamos que el valor de la variable fila sea válido. buy a license. De todas formas.Message). private void btnActualizar_Click(object sender. deberíamos usar un try/catch para comprobar que la fecha asignada es válida. } dr["Comentario"] = txtComentario. esta llamada al método Update solo es necesario si queremos asignar directamente los datos en la base.

1 ) return. sino que puedes hacerlo. la elimine también de la memoria. cuando el usuario "realmente" quiera que todos esos cambios se hagan físicamente en la base de datos. private void btnEliminar_Click(object sender. sino crear un registro nuevo.Acceso a una base de datos de SQL Server con ADO. no recuperarlos. } } Nota: Si lo que realmente te interesa es que los datos NO se eliminen directamente en la base de datos. en nuestro programa se dejan los datos. Cuando eliminamos un registro.Message).Update(dt).NET y Visual C# Página 13 de 16 } } Eliminar el registro actual Una vez que tenemos un registro mostrado. podemos pulsar en el botón Eliminar. al último. con su nuevo ID. // Actualizar físicamente la base de datos da.elguille. EventArgs e) { // Eliminar la fila actual if( fila < 0 || fila > dt. hasta que tu quieras.Rows.AcceptChanges(). por ejemplo. Pero eso es. (ni se actualicen ni creen nuevos). etc.Rows[fila]. con idea de que esa fila que hemos eliminado.info/NET/ADONET/ejemplo_adonet_sql_csharp.Count . la llamada al método Update del adaptador y la llamada al método AcceptChanges de la tabla no deberías llamarla en estos tres métodos que acabamos de ver.Message).htm 20/07/2006 . de forma que si nos arrepentimos. podamos volver a crearlos. al anterior y al siguiente AcroPDF . buy a license. try{ // Eliminar la fila de la tabla dt. }catch(Exception ex){ MessageBox.Delete(). como siempre. // Aceptar los cambios en la copia local dt. }catch(DBConcurrencyException ex){ MessageBox. a tu criterio. To remove the line.Show("Error de concurrencia:\n" + ex. http://www. Moverse entre registros. con comandos para ir al primero.A Quality PDF Writer and PDF Converter to create PDF files.Show(ex. para hacerlo. usamos el método Delete de la fila indicada y a continuación le indicamos al adaptador que actualice los datos físicamente en la base y a la tabla le tenemos que indicar que acepte los cambios.

Rows[f]. otro para ir al final. ya que se supone que hay datos.ToString(). btnEliminar. si el valor del número de la fila indicado no es correcto. por tanto leemos esa fila (asignándola a una variable de tipo DataRow) y asignamos los valores a las cajas de texto. podríamos usar esa variable en lugar del parámetro. En estos cuatro métodos usaremos un método 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. lo he puesto por separado. no hacemos nada..info/NET/ADONET/ejemplo_adonet_sql_csharp. Para ir al primero.htm 20/07/2006 .ToString(). Por último habilitamos el botón de actualizar y eliminar. uno para ir al principio.Acceso a una base de datos de SQL Server con ADO.. } Los cuatro métodos para movernos son los siguientes.elguille.NET y Visual C# Página 14 de 16 Para movernos entre los registros usaremos cuatro métodos. quiere decir que es un valor de fila correcto. lo dejo así por si se te ocurre hacer cambios y no usar esa variable.Rows.Enabled = true. en este caso si que usamos el valor del campo ID con idea de que veamos ese valor. To remove the line. Al igual que antes con el método asignarDatos. pero. AcroPDF . entre otras cosas para facilitar la modificación del código para otras tablas. por tanto. veamos que es lo que hacemos en cada uno de ellos. // DataRow dr = dt. txtFechaAlta.Text = dr["FechaAlta"]. ya que al tener la variable fila disponible en todo el formulario.ToString(). También para que no haya que estar repitiendo en el resto de los métodos las comprobaciones de que el valor de fila indicado está dentro del rango válido.. txtNombre.. private void mostrarDatos(int f) { int uf = dt. Nota: Como veremos en el código. txtEmail.Enabled = true.Text = dr["ID"].ToString(). // btnActualizar. txtID. que hay gente que no le gusta usar variables "globales" al formulario o clase.1. aunque creo que viendo el código queda clara la intención. simplemente asignamos cero a la variable de la fila actual y llamamos al método de mostrar los datos. http://www. otro para ir al registro anterior y otro para el siguiente. Ese rango debe estar entre cero para el primer registro y uno menos del número total de filas para el último.Count .Text = dr["Nombre"]. txtComentario. en realidad no hace falta pasarle ningún parámetro al método mostrarDatos.Text = dr["Comentario"].Text = dr["e-mail"]. En caso de que sigamos.A Quality PDF Writer and PDF Converter to create PDF files. buy a license. simplemente salimos del método.ToString(). if( f < 0 || uf < 0 ) return.

private void btnPrev_Click(object sender.info/NET/ADONET/ejemplo_adonet_sql_csharp. averiguamos cual es la última fila. EventArgs e) { // Posicionarse en la fila anterior fila = fila .A Quality PDF Writer and PDF Converter to create PDF files.NET y Visual C# Página 15 de 16 private void btnFirst_Click(object sender. pero debemos hacer una comprobación de que no sea menor de cero.Acceso a una base de datos de SQL Server con ADO. seguiremos en ese mismo registro. pues nos quedamos en esa última fila.Count . pero funcionará igualmente en la versión 2005 y con cambios menores. // Mostrar los datos de la fila indicada mostrarDatos(fila). que como vemos es el valor devuelto por la propiedad Count de la colección de filas (Rows).zip . EventArgs e) { // Posicionarse en la última fila fila = dt. // Mostrar los datos de la fila indicada mostrarDatos(fila). EventArgs e) { // Posicionarse en la primera fila fila = 0. } Para ir al último. To remove the line.NET siempre empiezan con el índice cero. buy a license.elguille.Count .Rows. hacemos lo mismo que antes. EventArgs e) { // Posicionarse en la fila siguiente int uf = dt. // Mostrar los datos de la fila indicada mostrarDatos(fila).11. El proyecto está creado con Visual Studio 2003. } Link al código de ejemplo Aquí tienes los links al código de ejemplo para Visual C#.1. para ir al siguiente. if( fila > uf ) fila = uf. El código para Visual C#: ejemploDatosSQLCS.1. private void btnLast_Click(object sender.1.Rows. ya que es posible que estemos en el primer registro y pulsemos en el botón de ir al anterior. pero en lugar de restar uno. menos uno. if( fila < 0 ) fila = 0. y en el caso de que sea mayor que la última fila. } Por último. } Para ir al anterior simplemente le restamos uno al valor de la fila actual.htm 20/07/2006 . ya que como sabemos todos los arrays y colecciones de . lo que hacemos es añadir uno al valor de la fila actual. fila = fila + 1. también en la versión 2002. // Mostrar los datos de la fila indicada mostrarDatos(fila). http://www. private void btnNext_Click(object sender.00 KB AcroPDF . En caso de que estemos en el primero.

A Quality PDF Writer and PDF Converter to create PDF files. http://www. To remove the line.elguille.Acceso a una base de datos de SQL Server con ADO. buy a license. Autor: DCE: 1 Normal Calificar Mi Panorama SOS Escribe para Nosostros AcroPDF .htm 20/07/2006 .NET y Visual C# Página 16 de 16 (MD5 checksum: 9ADF5E65CA151BE0B1045C61B6E1985A) La cajita de Panorama Box: Calificación: Lectores: 20 Guillermo guille Autor: Som Calif.info/NET/ADONET/ejemplo_adonet_sql_csharp.

Sign up to vote on this title
UsefulNot useful