lunes, 10 de enero de 2011

ADO.NET con Visual Basic 2010 parte 1

ADO.NET se caracteriza por su arquitectura desconectada, lo que significa que las aplicaciones se conectan a la base de datos para buscar y recuperar una carga de datos y almacenarlo en memoria. Luego estas aplicaciones podrán manipular la información almacenada en la memoria . El principal almacén de datos es el DataSet, el cual con tiene a su vez otros almacenes de datos en memoria como los objetos DataTable, DataColum y DataRow.
El núcleo de las clases de ADO.NET están en el namespace System.Data, el cual contiene otros namespaces como System.Data.SqlClient y System.Data.OleDb. En este caso solo usaremos System.Data.SqlClient para conectarnos al SQL Server. 
para poder conectarse al SQL Server tenemos que importarlo al proyecto asi:
Imports System.Data.SqlClient
'al inicio de todo
Public Class Form1

End Class
A continuacion veremos las clases de ADO.NET del namespace System.Data.SqlClient.
Clase SqlConnection
Provee la conexión con la BD en este caso al SQL Server. Aquí puedes especificar la cadena de Conexión, el cual tiene lo necesario para abrir una conexión a la BD. El SqlConnection tiene los siguientes parámetros básicos para la conexión:
  • Server: el nombre del SqlServer al que se quiere accerder. Usualmente el nombre de la computadora donde se esta ejecutando el SQL Server. Si el SQL Server esta en la misma maquina donde trabajas se puede usar solo (local) o localhost.
  • Database: el nombre de la BD a la cual se quiere conectar.
  • User ID: el nombre de usuario para acceder a la BD
  • Password: la contraseña para del usuario(User ID)
también se pude usar la seguridad integrada (se llama así por que el SQL Server esta integrado con el sistema de seguridad de Windows NT, dando la mejor coneccion segura, ya que los parametros User Id y Password no necesitan ser especificados en el codigo), con la cual no será necesario especificar un usuario y un password a la cadena de conexión. Solo se tiene que hacer mención en la cadena usando el parametro Integrated Security, el cual se le da el valor true
En el proyecto el código iría así
'
Dim objConnection As SqlConnection = New SqlConnection("server=(local); database=pruebaBD; Integrated Security=true")
'


Este caso usaremos Integrated Security. La otra opción sería asi:
'
Dim objConnection As SqlConnection = New SqlConnection("server=(local); database=pruebaBD; User ID=sa; Password=tuclave")
'
Ahora que se tiene una conexión,  se puede abrirla o cerrarla de esta forma:
'Se usan los métodos del objeto SqlConnection: Open para abrir
objConnection.Open()

'y Close para cerrar
objConnection.Close()
Clase SqlCommand
representa un comando SQL que se ejecuta en el alancen de datos. Los comando suelen ser un select, insert, update o delete query , el cual puede ser un SQL String o llamar a un stored procedure. La forma más facil es inicializar un objeto SqlCommand sin parametros y después de inicializado se establecen las propiedades. Se inicializa un objeto SqlCommand de la siguiente manera.
'
Dim objCommand As SqlCommand = New SqlCommand()
'
ahora se tendrá que configurarse ciertas propiedades en el objeto SqlCommand:
  • Connection: aquí se asigna un objeto SqlConnection para establecer la conección con la BD. Para que funcione, la conexión tiene que ser abierta en tiempo de ejecución.
'
objCommand.Connection = objConnection
'
  • CommandText: aquí se espedifica el SQL string o el stored procedure a ser ejecurado entre comillas dobles.
'
objCommand.CommandText = "INSERT INTO persona (pe_codigo,pe_nombre,pe_edad) VALUES (1,'MarioBros',50)"
'
en este ejemplo, al CommandText le asignamos un SQL query básico, en el cual solo se hace un INSERT para agregar datos a la tabla persona, el cual tienen las columnas pe_codigo, pe_nombre, pe_edad y luego le agregamos los valores (1, "MarioBros", 50) para cada columna respectivamente.


ya que generalmente los valores que se asignan son desconocidos, es mejor usar placeholders, que son variables que llevan un arroba adelante (@). No necesitan llamarse necesariamente como las columnas de la tabla, pero ayuda a tener un código mas claro. En este caso el código sería así:
'
objCommand.CommandText = "INSERT INTO persona (pe_codigo,pe_nombre,pe_edad) VALUES (@pe_codigo,@pe_nombre,@pe_edad)"
'
luego se tiene que crear los parámetros necesarios para insertar los valores a los placeholders cuando la sentencia SQL sea ejecutada. Se le crea y agrega parametros a la colección parameters del objeto SqlCommand. Los parámetros se refieren a los parámetros que se necesitan para enviar datos al SQL query o al stored procedure.  La forma más facil de agregar parametros es la suguiente:
'
objCommand.Parameters.AddWithValue("@pe_codigo", txtCodigo.Text)
objCommand.Parameters.AddWithValue("@pe_nombre", txtNombre.Text)
objCommand.Parameters.AddWithValue("@pe_edad", txtEdad.Text)
'
Con el método AddWithValue se indica el nombre de la variable y el valor que se le asignará. En este caso los valores se obtienen de un TextBox. También se puede usar el método Add, aunque ya está obsoleto, pero ayuda a declarar con mejor exactitud los tipos de las variables, ya que con AddWithValue los hace automáticamente y a veces puede que cree algunos errores al tratar de convertir tipos.
  • El Método ExecuteNonQuery: Con este método se ejecuta el SQL query. Para hacerlo se debe primero abrir la conección a la BD. Este método retorna el número de filas que fueron afectadas por el query. En codigo sería así:
'
objCommand.Connection.Open()
objCommand.ExecuteNonQuery()
objCommand.Connection.Close()
'


PRACTICA
Ahora ya tenemos lo suficiente para agregar datos, en este caso usando el SQL Server 2008.
Abrimos el Visual studio 2010, creamos un nuevo proyecto y elegimos crear una aplicación de Windows Forms. Le ponemos de nombre "Prueba_ADO". Usaremos el nombre por defecto del Form que es "Form1.vb". Agregamos los controles que se ven en la imagen:
para los Textboxs le agregaremos los sigtes. nombres correspondientemente: txtCodigo, txtNombre, txtEdad. Para los botones los sigtes. nombres btnAgregar, btnLimpiar, btnSalir


para la parte del SQL Server, creamos una nueva BD llamada "pruebaBD" y luego ejecutamos el siguiente script para crear la tabla persona
USE [pruebaBD]
GO
CREATE TABLE persona(
 pe_codigo int Primary Key NOT NULL,
 pe_nombre nvarchar(10) NULL,
 pe_edad int NULL,
) 
GO
ahora le damos doble click a los 3 botones y los llenamos con los códigos que están aquí
'no te olvides de importar
Imports System.Data.SqlClient

Public Class Form1

     'creamos una coneccion a la BD 
      Dim objConnection As SqlConnection = New SqlConnection("server=(local); database=pruebaBD; Integrated Security=true")

    Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
        Try

            'creamos un objeto SqlCommand para enviar una consulta SQL a la BD
            Dim objCommand As SqlCommand = New SqlCommand()

            'le asignamos la coneccion al objeto SqlCommand
            objCommand.Connection = objConnection

            'le asignamos al obj SqlCommand el Query o el stored procedure / con @ se crea una variable
            objCommand.CommandText = "INSERT INTO persona (pe_codigo,pe_nombre,pe_edad) VALUES (@pe_codigo,@pe_nombre,@pe_edad)"

            'con la propiedad Parameters del objeto SqlCommand asignamos los valores a los parametros pre establecidos
            objCommand.Parameters.AddWithValue("@pe_codigo", txtCodigo.Text)
            objCommand.Parameters.AddWithValue("@pe_nombre", txtNombre.Text)
            objCommand.Parameters.AddWithValue("@pe_edad", txtEdad.Text)

            'antes de ejecutar el Query necesitamos abrir la coneccion
            objCommand.Connection.Open()
            'ahora que esta abierta la coneccion podemos ejecutar el query
            objCommand.ExecuteNonQuery()
            'y finalmente cerramos la coneccion
            objCommand.Connection.Close()
        Catch ex As Exception
            MsgBox(ex.Message.ToString, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
        End Try
    End Sub

    Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click
        'para limpiar el contenido del los Textboxs
        txtCodigo.Clear()
        txtEdad.Clear()
        txtNombre.Clear()
    End Sub

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        'cerrar aplicacion
        Close()
    End Sub
End Class
Dentro del botón agregar se le ha puesto un try-catch para manejar las excepciones. Ahora, después de verificar que no hay ningún error de sintaxis ejecutamos la aplicación y podremos ingresar los 3 datos de código, nombre y edad. Recuerda que no hay validación en los Textbox así que mira donde van solo números y solo texto. Para Comprobar que se ha ingresado  los datos puedes ir al SQL Server y verificar si allí están.

Presentacion

Este es un blog creado por principiantes para principiantes (con cierto conocimiento previo). Se iniciarán algunos temas básicos los cuales se irán extendiendo en profundidad poco a poco. Si tienes conocimiento de algún tema también puedes aportar aquí. Correcciones y sugerencias serán bienvenidas para mejorar el blog.