SQL Server

Published on May 2016 | Categories: Documents | Downloads: 59 | Comments: 0 | Views: 309
of 24
Download PDF   Embed   Report

Comments

Content

SQL SERVER- ¿Qué es un procedimiento Almacenado?
OCTOBER 26, 2008 BY MREDISON 3 COMMENTS

7 Votes Procedimiento Almacenado o StoreProcedures (En inglés) son unidades de código compuestas por una o más sentencias Transact-SQL o T-SQL y que son almacenados en el servidor. SPs nos dan la habilidad de extender el lenguaje T-SQL gracias a que podemos añadir nuestras propias subrutinas y procedimientos para las bases de datos SQL SERVER. Veamos la sintaxis.

CREATE PROCEDURE [ schema_name. ] procedure_name [ ;number ] [ ( ] [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT | OUTPUT ] ] [ , ...n ] [ ) ] [ WITHprocedure_option [ , ...n ] ] [ FOR REPLICATION ] AS { sql_statement [;][ ... n ] }
Como se pueden dar cuenta se inicia con un CREATE PROCEDURE seguido del nombre del SP. En el nombre se puede especificar el esquema, el nombre y el numero (opcional). El esquema siempre debe ser incluido ya que asegura que tu SP, es creado en el esquema apropiado. El procedure_name es el nombre que le asignamos a nuestro SP. Podemos añadir un numero para algun grupo, pero esto lo debemos hacer con un ;

CREATE PROCEDURE dbo.MiStoreProcedure

AS SET NOCOUNT ON CREATE TABLE Prueba(id INT PRIMARY KEY NOT NULL); INSERT INTO Prueba(id)VALUES(1); RETURN
Este pequeño ejemplo crea una tabla en mi Base de Datos, e ingresa un valor en el campo de Identificador.

SET ANSI_NULLS ON

GO SET QUOTED_IDENTIFIER ON GO

CREATE PROCEDURE dbo.SeleccionarProductos

AS BEGIN SELECT Codigo, Descripcion, Precio

FROM Productos RETURN END GO
Aquí hago una consulta sencilla con un SELECT a una tabla Productos

Podemos llamar a nuestros procedimientos almacenados de la siguiente manera.

executeSeleccionarProductos

Acceso a una base de datos de SQL Server con ADO.NET y Visual Basic
Publicado el 05/Feb/2006 Actualizado el 05/Feb/2006 Autor: Guillermo 'guille' Som

Código de ejemplo válido para cualquier versión de Visual Basic para .NET

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 nuevos datos, modificar o borrar los existentes. También veremos cómo saber las instancias de SQL Server que hay instaladas en el equipo, las cuales se mostrarán en un combo; al seleccionar la instancia, veremos cómo mostrar las bases de datos que tiene esa instancia, (excepto las del sistema o propias de SQL), las cuales estarán en otro combo. Si la tabla de prueba no existe en la base de datos seleccionada, tendremos la posibilidad de crearla. Además de lo dicho, en este ejemplo también verás cómo hacer lo siguiente: -Deshabilitar los controles que estén incluidos en un GroupBox. -Conectar a la base de datos de SQL Server usando la autenticación 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 típicos comandos: Primero, Anterior, Siguiente y Último. -Añadir nuevos registros (o filas) a la tabla. -Eliminar una fila de la tabla. -Actualizar los datos de la fila actual. Y como valor añadido, la utilidad de ejemplo también tiene código 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 aplicación de ejemplo). Espero que te sea de utilidad y que esté más claro y menos "liante" que el otro ejemplo que ya tenía publicado.

Nota: A lo largo de este artículo, te muestro el código de Visual Basic, pulsa este link si quieres ver el artículo con el código de ejemplo para C#.

Al final tienes el link al zip con el código de ejemplo para Visual Basic, el cual es válido 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 OleDb.

Estructura de la tabla de ejemplo
Para que este código funcione, debes tener una base de datos en la que se incluya una tabla llamada Prueba. Pulsa aquí si quieres saber cómo crear una base de datos de SQL Server usando código de Visual Basic para punto NET. 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 Tipo int Comentario Clave principal auto-numérica (identidad)

nvarchar 50 caracteres nvarchar 128 caracteres datetime -

Comentario

nvarchar 2048 caracteres

El formulario para acceder a la base de datos
La aplicación de ejemplo tiene un formulario con el siguiente aspecto:

El formulario de la aplicación 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, tendrás que crear tu propio diseño del formulario. En el código he intentado separar el código que depende de los campos, de forma que te resulte fácil 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 cómo averiguar las instancias de SQL Server que hay en el equipo usando código de Visual Basic. 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 cómo averiguar las bases de datos que contiene una

instancia de SQL Server usando código de Visual Basic. El botón 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 autenticación de Windows. 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. Por tanto será en el código de ese botón donde tendrás que escribir todo lo necesario para realizar la conexión, cargar los datos en la tabla (DataTable) y empezar a mostrar los datos. Al pulsar en el botón de conectar, el código 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 navegación (o movimiento) nos servirán para ir a los distintos registros: Primero, anterior, siguiente y último. El botón de Actualizar lo usaremos para actualizar los datos del registro actual. El botón Nuevo lo usaremos para añadir un nuevo registro. Cuando pulsamos en ese botón, se usarán los datos que actualmente tengamos en las cajas de textos, salvo el ID, ya que en la tabla de ejemplo es autonumérico, y por tanto se crea solo. El botón 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 botón 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 automáticamente.

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 código
A lo largo de la aplicación 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 Integer, será el índice de la fila actual, con idea de saber cual será la siguiente, la anterior o la fila que queremos actualizar.
PrivatedtAsDataTable

Private da AsOleDbDataAdapter Private fila AsInteger

Form_Load: Deshabilitar los controles y asignar el path de la base de datos
Al empezar la aplicación, en el evento Form_Load, deshabilitaremos los controles que están en el GroupBox, además, averiguaremos las instancias de SQL Server que hay actualmente en el equipo y las asignaremos en el combo correspondiente, también añadiremos 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 función llamada instanciasInstaladas, 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. En este mismo evento y en el correspondiente al cambio de selección del combo de las instancias, también usamos una función (basesDeDatos), que recibe como parámetro el nombre de la instancia seleccionada, para saber las bases de datos que tiene la instancia de SQL Server que hemos seleccionado, el código de esa función lo puedes ver siguiendo este link.
PrivateSub Form1_Load( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesMyBase.Load

Me.Text = "Ejemplo acceso SQL Server VB" ' ' Limpiar los controles del GroupBox y ' deshabilitarlos hasta que se conecte a la base de datos ForEach c As Control InMe.GroupBox1.Controls ' Limpiar los textbox IfTypeOf c IsTextBoxThen c.Text = "" EndIf ' Deshabilitarlos c.Enabled = False Next

Me.GroupBox1.Enabled = False Me.GroupBox1.Text = "Debes conectar antes de usar los datos" ' ' Las instancias de SQL Server que hay instaladas Diminstancias() AsString instancias = instanciasInstaladas() ForEach s AsStringIninstancias If s = "MSSQLSERVER"Then cboInstancias.Items.Add("(local)") Else cboInstancias.Items.Add("(local)\"& s) EndIf Next cboInstancias.Text = "(local)"

' Los nombres de las bases de datos Dim bases() AsString = basesDeDatos("(local)") IfNot bases IsNothingThen Me.cboBases.Items.AddRange(bases) EndIf ' Seleccionamos la primera base IfMe.cboBases.Items.Count> 0 Then cboBases.SelectedIndex = 0 EndIf EndSub

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 código del evento SelectedIndexChanged es el siguiente, en el que comprobamos si hay alguna base de datos (la función que comprueba las bases que hay en la instancia indicada, devuelve Nothing si solo están las bases del propio SQL Server), las agregamos al combo y seleccionamos el primer elemento.
PrivateSubcboInstancias_SelectedIndexChanged( _ ByVal sender AsObject, _

ByVal e AsEventArgs) _ HandlescboInstancias.SelectedIndexChanged

Dim bases() AsString = basesDeDatos(cboInstancias.Text) Me.cboBases.Items.Clear() IfNot bases IsNothingThen Me.cboBases.Items.AddRange(bases) ' Seleccionamos la primera base IfMe.cboBases.Items.Count> 0 Then cboBases.SelectedIndex = 0 EndIf EndIf EndSub

En Visual Basic 2005 puedes usar este código para saber si el array bases no contiene Nothing:
If bases IsNotNothingThen

Conectar a la base de datos
Para conectar con la base de datos y obtener los datos, necesitamos una cadena de conexión al servidor de SQL Server que indique que base de datos vamos a usar. Los datos los obtendremos mediante una cadena de selección (SELECT). En el siguiente código comprobamos también si la tabla que usaremos existe en la base de datos seleccionada, 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, 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 conexión creada y que sabemos que la tabla existe, crearemos los objetos que nos permitirán 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 selección. 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 tipoSqlCommandBuilder que aunque no es la forma más efectiva, al menos es la más fácil de usar, y como de lo que en este artículo se trata es que sea fácil, 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 añadir 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 guión, pero podría ser una vocal acentuada, una eñe o contener espacios, 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, esa indicación la hacemos mediante las propiedades QuotePrefix y QuoteSufix. Por último creamos el nuevo objeto del tipo DataTable, que será el que usemos con el método Fill del adaptador, al usar ese método, será cuando se conecte con la base de datos y asigne a la tabla los datos indicados en la cadena de selección (SELECT). En este ejemplo, le indico que traiga todos los datos, pero también podría haber seleccionado con una cláusula WHERE otros diferentes.

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 * ), 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 válidos y existan en la tabla) dará error.

Finalmente habilitamos nuevamente los controles que están en el GroupBox para que podamos navegar, añadir, eliminar, actualizar y escribir en las cajas de texto, y mostraremos el primer registro, para ello llamamos al código del evento del botón para mostrar el primer registro. Si no hay datos, (es decir, si la tabla no contiene alguna fila), deshabilitamos el botón de actualizar y el de eliminar, para permitir solo añadir nuevos datos.
PrivateSubbtnConectar_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _

HandlesbtnConectar.Click ' Conectar y mostrar los datos ' ' La cadena de conexión DimsCnnAsString = "Server="&cboInstancias.Text&"; "& _ "database="&cboBases.Text&"; integrated security=yes"

DimcnnAsNewSqlConnection(sCnn) IfexisteTabla(cnn, "Prueba") = FalseThen IfMessageBox.Show("NO existe la tabla Prueba, que es la usada para este ejemplo."&vbCrLf& _ "¿Quieres crearla?", "No existe la tabla", _ MessageBoxButtons.YesNo) = DialogResult.YesThen IfcrearTablaPrueba() = FalseThen ExitSub EndIf Else ExitSub EndIf EndIf

' La cadena de selección DimsSelAsString = "SELECT * FROM Prueba ORDER BY ID" ' ' Comprobar si hay algún error Try ' Crear un nuevo objeto del tipo DataAdapter da = NewSqlDataAdapter(sSel, sCnn) ' Crear los comandos de insertar, actualizar y eliminar DimcbAsNewSqlCommandBuilder(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 automáticamente, pero...) da.UpdateCommand = cb.GetUpdateCommand da.InsertCommand = cb.GetInsertCommand da.DeleteCommand = cb.GetDeleteCommand '

' Esta base de datos usa el ID con valores automáticos da.MissingSchemaAction = MissingSchemaAction.AddWithKey ' dt = NewDataTable ' Llenar la tabla con los datos indicados da.Fill(dt) ' Me.GroupBox1.Enabled = True Me.GroupBox1.Text = "Conexión realizada" ' Habilitar los controles ForEach c As Control InMe.GroupBox1.Controls c.Enabled = True Next

' Y mostrar el primer registro Ifdt.Rows.Count> 0 Then btnFirst_Click(Nothing, Nothing) Else fila = -1 btnActualizar.Enabled = False btnEliminar.Enabled = False EndIf Catch ex As Exception MessageBox.Show("ERROR al conectar o recuperar los datos:"&vbCrLf& _ ex.Message, "Conectar con la base", _ MessageBoxButtons.OK, MessageBoxIcon.Error) EndTry EndSub

La función para saber si existe la tabla indicada
PrivateFunctionexisteTabla( _ ByValcnnAsSqlConnection, _ OptionalByValnombreTablaAsString = "Prueba") AsBoolean ' Devuelve True si la tabla indicada está en la base usada con la conexión DimdtAsNewDataTable

DimexisteAsBoolean = False ' Try Dim da AsNewSqlDataAdapter( _ "SELECT * FROM INFORMATION_SCHEMA.TABLES "& _ "WHERE TABLE_TYPE = 'BASE TABLE' "& _ "ORDER BY TABLE_TYPE", _ cnn) ' da.Fill(dt) ForEachdrAsDataRowIndt.Rows Ifdr("TABLE_NAME").ToString() = nombreTablaThen ReturnTrue EndIf Next ' Returnexiste

Catch ex As Exception MessageBox.Show("ERROR: "&ex.Message, "Comprobartabla") ReturnFalse EndTry EndFunction

El método para crear la tabla de ejemplo (Prueba)
PrivateFunctioncrearTablaPrueba() AsBoolean ' Crear la tabla de prueba en la base e instancias seleccionadas ' Devuelve True si todo fue bien DimcreadaAsBoolean = False DimsCnnAsString = "Server="&cboInstancias.Text&"; "& _ "database="&cboBases.Text&"; integrated security=yes" DimsCmdAsString = "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]" DimcnnAsSqlConnection Try cnn = NewSqlConnection(sCnn) cnn.Open() DimcmdAsNewSqlCommand(sCmd, cnn)

cmd.ExecuteNonQuery() creada = True Catch ex As Exception MessageBox.Show("Error al crear la tabla:"&vbCrLf&ex.Message) Finally IfNotcnnIsNothingThen Ifcnn.State = ConnectionState.OpenThen cnn.Close() EndIf EndIf EndTry

Returncreada EndFunction

Añadir nuevos registros
Para añadir nuevos registros, lo primero que tenemos que hacer es crear una nueva fila. Para ello utilizamos el método NewRow del objeto DataTable. Al usar ese método, 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), de forma que podamos asignar los campos, etc. La asignación de los campos la hacemos mediante el método asignarDatos, aunque podríamos haberlo hecho directamente.

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, ya que en ese método haríamos todas las asignaciones que debamos hacer, salvo la del campo ID ya que al ser autonumérico no podemos asignarle un valor, porque ese valor lo asignará automáticamente ADO.NET. Una vez que la fila tiene asignados los valores de los campos, la añadimos a las fila de la tabla. Esto es necesario, ya que el método NewRow solo crea una fila, pero no la "relaciona" (o añade) a la tabla actual. Finalmente actualizamos los datos mediante el método Update del adaptador. En realidad no hace falta hacer esa actualización en este preciso momento, pero si no lo hacemos, debemos añadir otro botón para que los datos se asignen a la base de datos, ya que al añadir 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 ocurría, 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 podrían producir errores.

Es importante que sepamos que cuando llamamos al método Update del adaptador, se realizan todas las actualizaciones, es decir, no solo añadir nuevos datos, como "se supone" que es lo que hace este método, sino que si hubiésemos eliminado filas, o modificado algunas, esas modificaciones también se reflejarían en la base de datos.

Debido a cómo funcionan los campos autincrementales, para asegurarnos de que en realidad el valor de ese ID se actualiza correctamente, si es el primer registro que añadimos (o vale cero, como es la comprobación que hacemos aquí), 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. Esto no es necesario en los siguientes datos que vayamos añadiendo, ya que en otros casos el valor del ID se asignará correctamente. Como ves, también controlamos los errores que se puedan producir... ¡nunca está de más!
PrivateSubbtnNuevo_Click( _ ByValsenderAsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnNuevo.Click ' Crear un nuevo registro DimdrAsDataRow = dt.NewRow() ' Asignar los datos de los textbox a la fila

asignarDatos(dr)

' Añadir la nueva fila a la tabla dt.Rows.Add(dr) ' Guardar físicamente 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 IfCInt("0"&dr("ID").ToString) = 0 Then dt = NewDataTable da.Fill(dt) EndIf ' Posicionarlo en la última fila btnLast_Click(Nothing, Nothing) Catch ex AsDBConcurrencyException MessageBox.Show("Error de concurrencia:"&vbCrLf&ex.Message) Catch ex As Exception MessageBox.Show(ex.Message) EndTry EndSub

Si la caja de textos para la fecha no tiene nada, usamos un valor "nulo" para asignar a ese campo. De todas formas, deberíamos usar un Try/Catch para comprobar que la fecha asignada es válida.
PrivateSubasignarDatos(ByValdrAsDataRow) ' Usar los datos que hay en los textbox dr("Nombre") = txtNombre.Text dr("e-mail") = txtEmail.Text IftxtFechaAlta.Text = ""Then dr("FechaAlta") = DBNull.Value Else dr("FechaAlta") = txtFechaAlta.Text EndIf dr("Comentario") = txtComentario.Text EndSub

Actualizar los registros modificados
La actualización de los datos, es decir, cuando modificamos un registro (o fila) y queremos que esos datos se guarden, es muy simple. En el código del método de actualizar, primero comprobamos que el valor de la variable fila sea válido, 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 cuestión y posteriormente llamamos al método 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 método Update del adaptador, como comenté antes, esta llamada al método 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. También encerramos esa actualización dentro de un Try/Catch para detectar los errores que se puedan producir.
PrivateSubbtnActualizar_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnActualizar.Click ' Actualizar los datos en la fila actual Iffila< 0 OrElsefila>dt.Rows.Count - 1 ThenExitSub

DimdrAsDataRow = dt.Rows(fila) ' Asignar los datos de los textbox a la fila asignarDatos(dr)

Try da.Update(dt) dt.AcceptChanges() Catch ex AsDBConcurrencyException MessageBox.Show("Error de concurrencia:"&vbCrLf&ex.Message) Catch ex As Exception MessageBox.Show(ex.Message) EndTry EndSub

Eliminar el registro actual
Una vez que tenemos un registro mostrado, podemos pulsar en el botón Eliminar, 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, con idea de que esa fila que hemos eliminado, la elimine también 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.
PrivateSubbtnEliminar_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnEliminar.Click ' Eliminar la fila actual Iffila< 0 OrElsefila>dt.Rows.Count - 1 ThenExitSub

Try ' Eliminar la fila de la tabla dt.Rows(fila).Delete() ' Actualizar físicamente la base de datos da.Update(dt) ' Aceptar los cambios en la copia local dt.AcceptChanges() Catch ex AsDBConcurrencyException MessageBox.Show("Error de concurrencia:"&vbCrLf&ex.Message) Catch ex As Exception MessageBox.Show(ex.Message) EndTry

EndSub

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 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, sino que puedes hacerlo, por ejemplo, cuando el usuario "realmente" quiera que todos esos cambios se hagan físicamente 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
Para movernos entre los registros usaremos cuatro métodos, uno para ir al principio, otro para ir al final, otro para ir al registro anterior y otro para el siguiente. 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. Al igual que antes con el método asignarDatos, lo he puesto por separado, entre otras cosas para facilitar la modificación del código para otras tablas. 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. Ese rango debe estar entre cero para el primer registro y uno menos del número total de filas para el último, por tanto, si el valor del número de la fila indicado no es correcto, no hacemos nada, simplemente salimos del método. En caso de que sigamos, quiere decir que es un valor de fila correcto, por tanto leemos esa fila (asignándola 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 botón de actualizar y eliminar, ya que se supone que hay datos.
PrivateSubmostrarDatos(ByVal f AsInteger) DimufAsInteger = dt.Rows.Count - 1 If f < 0 OrElseuf< 0 ThenExitSub ' DimdrAsDataRow = 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 EndSub

Los cuatro métodos para movernos son los siguientes, veamos que es lo que hacemos en cada uno de ellos, aunque creo que viendo el código queda clara la intención.

Nota: Como veremos en el código, en realidad no hace falta pasarle ningún parámetro al método mostrarDatos, ya que al tener la variable fila disponible en todo el formulario, pues podríamos usar esa variable, 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 método de mostrar los datos.
PrivateSubbtnFirst_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnFirst.Click ' Posicionarse en la primera fila fila = 0 ' Mostrar los datos de la fila indicada mostrarDatos(fila) EndSub

Para ir al último, averiguamos cual es la última fila, que como vemos es el valor devuelto por la propiedad Count de la colección de filas (Rows), menos uno, ya que como sabemos todos los arrays y colecciones de .NET siempre empiezan con el índice cero.

PrivateSubbtnLast_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnLast.Click ' Posicionarse en la última fila fila = dt.Rows.Count - 1 ' Mostrar los datos de la fila indicada mostrarDatos(fila) EndSub

Para ir al anterior simplemente le restamos uno al valor de la fila actual, pero debemos hacer una comprobación de que no sea menor de cero, ya que es posible que estemos en el primer registro y pulsemos en el botón de ir al anterior. En caso de que estemos en el primero, seguiremos en ese mismo registro.
PrivateSubbtnPrev_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnPrev.Click ' Posicionarse en la fila anterior fila = fila - 1 Iffila< 0 Thenfila = 0 ' Mostrar los datos de la fila indicada mostrarDatos(fila) EndSub

Por último, para ir al siguiente, hacemos lo mismo que antes, pero en lugar de restar uno, lo que hacemos es añadir 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.
PrivateSubbtnNext_Click( _ ByVal sender AsSystem.Object, _ ByVal e AsSystem.EventArgs) _ HandlesbtnNext.Click ' Posicionarse en la fila siguiente DimufAsInteger = dt.Rows.Count - 1 fila = fila + 1 Iffila>ufThenfila = uf ' Mostrar los datos de la fila indicada mostrarDatos(fila)

EndSub

Link al código de ejemplo
Aquí tienes los links al código de ejemplo para Visual Basic. El proyecto está creado con Visual Studio 2003, pero funcionará igualmente en la versión 2005 y con cambios menores, también en la versión 2002. El código para Visual Basic: ejemploDatosSQLVB.zip - 10.20 KB (MD5 checksum: B184E46FAFC162C523BCA7D5986630CF)

Sponsor Documents

Or use your account on DocShare.tips

Hide

Forgot your password?

Or register your new account on DocShare.tips

Hide

Lost your password? Please enter your email address. You will receive a link to create a new password.

Back to log-in

Close