Programación visual básica, almacenamiento de rutas de imágenes en la base de datos mdb
Actualización de la base de datos mediante procedimientos almacenados Varios de los ejemplos anteriores utilizaron procedimientos almacenados para obtener información de la base de datos. En algunas aplicaciones complejas, los procedimientos almacenados se utilizan a menudo para actualizar, insertar y eliminar registros. Veamos cómo hacer esto con ADO.NET. Como primer ejemplo, permitiremos que los asistentes de Visual Studio® .NET escriban un conjunto de procedimientos almacenados para nosotros y creen el código para utilizar esos procedimientos. Aunque solo necesitamos escribir una cantidad mínima de código para este ejemplo, una mirada más cercana al código creado por el asistente puede ayudarnos a comprender los procedimientos para interactuar con los procedimientos almacenados para que podamos hacer más que solo obtener datos. Para este ejemplo, usaremos la tabla Clientes de la base de datos de muestra Northwind. Cuando instala la base de datos Northwind, no incluye procedimientos almacenados para actualizar, insertar o eliminar clientes, pero el Asistente de configuración de DataAdapter en Visual Studio .NET facilita la escritura de algunos. Inicie un nuevo proyecto de aplicación de Windows. En un Form1 en blanco, coloque un DataGrid y dos botones. Como antes, cambie la propiedad Ancla del DataGrid para anclarla a los cuatro bordes. Nombra los botones btnFill y btnUpdate, y cambia sus propiedades de Texto a Rellenar y Actualizar respectivamente. Vaya a la pestaña Datos de la Caja de herramientas, arrastre un control SqlDataAdapter al formulario y suéltelo. Esto abrirá un asistente de configuración de DataAdapter. Haga clic en el botón Siguiente para comenzar a ingresar información en el asistente. Primero, debe seleccionar una conexión a la base de datos Northwind o, si no hay ninguna conexión disponible en la lista, hacer clic en el botón Nueva conexión para crear una conexión. Luego haga clic en el botón Siguiente. La siguiente pantalla contiene tres opciones para acceder a los datos. Esta pantalla se muestra en la Figura 2.
Figura 2. Selección del tipo de acceso a datos para DataAdapter Aquí, la mayoría de los ejemplos de software de demostración utilizarán la primera opción para utilizar declaraciones SQL. Sin embargo, usaremos la segunda opción y dejaremos que el asistente cree algunos procedimientos almacenados por nosotros. Seleccione la opción Crear nuevos procedimientos almacenados y haga clic en el botón Siguiente. La siguiente pantalla requiere una declaración SQL para indicar los datos iniciales que se recuperarán de la base de datos. Sin embargo, esta declaración SQL no se utiliza directamente. La información de esta declaración SQL se utilizará para crear el procedimiento almacenado que realiza el acceso a los datos reales. Para que este ejemplo sea simple y directo, ingrese la declaración SQL SELECT * FROM Customers y presione el botón Siguiente. Aquí, el asistente solicita el nombre del procedimiento almacenado que se creará. Hay cuatro procedimientos almacenados: operaciones de selección, actualización, inserción y eliminación. Nómbrelos de la siguiente manera: Seleccionar: MSDNSelectCustomers Actualizar: MSDNUpdateCustomer Insertar: MSDNInsertCustomer Eliminar: MSDNDeleteCustomer Mantenga seleccionada la opción Crearlos en la base de datos para mí. En este punto, la pantalla del asistente debería verse como la Figura 3.
Figura 3. Asigne un nombre al procedimiento almacenado que creará el asistente DataAdapter y haga clic en el botón Siguiente. El asistente crea estos procedimientos almacenados y muestra su progreso en la pantalla de estado.
Una vez completado, puede hacer clic en el botón Finalizar para salir del asistente. El asistente crea un DataAdapter completamente configurado pero no crea un DataSet para contener los datos. Lo haremos a continuación. Desde la pestaña Datos de la Caja de herramientas, arrastre sobre un control DataSet. Cuando se muestre su pantalla de configuración, seleccione Conjunto de datos sin tipo. El DataAdapter ahora se puede utilizar para completar el conjunto de datos. En el evento Click de btnFill, agregue las siguientes dos líneas de código: SqlDataAdapter1.Fill(DataSet1, "Customers") DataGrid1.DataSource = DataSet1.Tables("Customers") En el evento Click de btnUpdate, agregue la siguiente línea: SqlDataAdapter1 .Update( DataSet1, "Clientes") Ahora tenemos un software de demostración funcional que utiliza procedimientos almacenados para el acceso a datos. Puede ejecutar el programa y hacer clic en el botón Llenar para obtener una lista de usuarios en una cuadrícula. Luego puede editar los datos del usuario en la cuadrícula y seleccionar el botón Actualizar para devolver esos cambios a la base de datos. Nota Si edita la primera columna, CustomerID, se producirá una excepción porque no puede actualizar la clave principal en un registro de base de datos en SQL Server. Es instructivo echar un vistazo al código generado por el asistente, todo el cual está inicialmente oculto en el área de código generado por Windows Form Designer. Haga clic en el signo más correspondiente en esta área para expandir el código. Tenga en cuenta el siguiente código, que crea una instancia de SQLDataAdapter y los cuatro objetos de comando que requiere: Me.SqlDataAdapter1 = New System.Data.SqlClient.SqlDataAdapter() Me.SqlSelectCommand1 = New System.Data.SqlClient.SqlCommand() Me.SqlInsertCommand1 = New. System.Data.SqlClient.SqlCommand() Me.SqlUpdateCommand1 = Nuevo System.Data.SqlClient.SqlCommand() Me.SqlDeleteCommand1 = Nuevo System.Data.SqlClient.SqlCommand() Más abajo verás el Código que configura cada objeto de comando y crea una colección de parámetros para ello. Este código es similar al código del ejemplo anterior que utiliza un procedimiento almacenado con parámetros. Sin embargo, el código generado por el asistente utiliza atributos de parámetros adicionales para permitir su uso con varios procedimientos almacenados que cambian datos. Por ejemplo, el código que crea el parámetro CompanyName para SQLInsertCommand1: Me.SqlInsertCommand1.Parameters.Add(New _ System.Data.SqlClient.SqlParameter("@CompanyName", _ System.Data.SqlDbType.NVarChar, 40, "CompanyName" ) ) En el ejemplo anterior, solo configuramos propiedades para el nombre del parámetro, el tipo de datos y la longitud. Este código también establece la propiedad SourceColumn del parámetro en el valor CompanyName.
Esta propiedad indica el campo en CustomersDataTable de este conjunto de datos que corresponde a este parámetro. Esto permite que los valores de DataTable se inserten automáticamente en la propiedad Valor del parámetro durante una operación de inserción. Analicemos esto con más detalle. Cuando se llama al método Update de SQLDataAdapter, actualiza una única DataTable en el DataSet. Examine la tabla de datos fila por fila, buscando filas que deban actualizarse, insertarse o eliminarse. Cuando encuentra una nueva fila para insertar en la base de datos, SQLDataAdapter utiliza el objeto Command establecido por su propiedad InsertCommand. Aquí, el objeto Command accede al procedimiento almacenado MSDNInsertCustomer. Antes de que se pueda ejecutar el procedimiento almacenado, la propiedad Valor de cada parámetro debe completarse a partir de la fila que se inserta. El código utilizado para configurar SQLDataAdapter1 asocia cada parámetro del procedimiento almacenado con el campo correspondiente en DataTable. Esto permite que los datos de las nuevas filas de DataTable se pasen automáticamente a los parámetros del procedimiento almacenado. Los parámetros para otros procedimientos almacenados se pueden configurar de manera similar. Hay una diferencia que vale la pena señalar. Otros procedimientos almacenados se pasan en valores iniciales para los datos en DataTable, que se utilizan para verificar que los datos no hayan cambiado sin su conocimiento. Es decir, si recupera algunos datos y alguien más los cambió antes de intentar actualizarlos, obtendrá una excepción de simultaneidad. Puede ver que esto sucede iniciando el programa anterior, obteniendo la información del cliente y luego usando una herramienta como SQL Enterprise Manager para cambiar algo en el registro. Si cambia el mismo registro en el programa de muestra e intenta actualizarlo, obtendrá una excepción de simultaneidad.