martes, 30 de julio de 2013

Conectar una aplicación .NET a una base de datos SQL Server

Vamos a conectar una aplicación de Visual Basic.NET a una Base de Datos SQL SERVER 2005 a través del Wizard que proporciona Visual Studio 2005 para conectarla con un DataSourceTambién daré nociones de otra forma de hacerlo que no desarrollaré. Finalmente haremos la misma operación pero por código

A través de DataSource

Continuando con nuestro  programa de ejemplo, sobre nuestro proyecto de Visual Studio 2005 (Visual Basic), añadimos un combo al formulario y procedemos del siguiente modo para enlazarlo a una tabla de nuestra base de Datos:

1.Añadimos los controles del componente Microsoft  remoteData Control 6.0



2. En la barra de herramientas aparece:


Elegimos BindingSource y colocamos sobre el formulario.


3. Para conectarla a la base de datos
Elegimos dataSource en el cuadro de propiedades del BindingSource y seguimos el Wizard.




Elegimos los parámetros de conexión que se corresponden con nuestra Base de Datos.




Ahora en la barra de herramientas aparecerán nuevas herramientas de Base de datos


4. En las propiedades del Combo añado la herramienta deseada (asociada a la tabla de la que deseamos leer los datos)





5. En ValueMember elegimos el campo a mostrar.


6. Para poder acceder al campo código de la tabla desde el código de Visual Basic podemos definir el campo deseado en las propiedades del combo.



7. Y después leerlo en el código de VB en el evento _SelectedIndexChanged

Private Sub CboHospitales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
CboHospitales.SelectedIndexChanged


 Dim CodigoHosp As String
 CodigoHosp = CboHospitales.SelectedItem.Row.ItemArray(1)

También podemos ver su valor en tiempo de ejecución en la ventana watch



8. Finalmente ejecutamos la aplicación para ver que ha enlazado el campo de la tabla correctamente.


Podemos proceder del mismo modo con una caja de texto corriente.


Elegimos el objeto para la tabla y el campo deseados


Ahora al ejecutar el proyecto, cada vez que elegimos un hospital, aparece en la caja su dirección.


Para establecer el teléfono,  Colocamos sobre el formulario un objeto tbHospTelBindingSource y lo definimos


Colocamos una caja de lista y ponemos esto en sus propiedades:

Otra forma de conectarse: con SQL Datasbase

En proyecto, Add New Item



Se elige SQL Database


Conectar una aplicación Visual Basic.Net a una Base de Datos SQL Server 2005 mediante código

Para hacer lo mismo que se acaba de realizar pero por código, se procede del siguiente modo:
Creamos un módulo de conexión llamado conexion.vb e incluimos las siguientes líneas:

Módulo genérico de conexión

Imports System.Data.SqlClient
Imports System.Data
Module Conexion

    Public cnDB As SqlClient.SqlConnection
    Dim cmDB As SqlClient.SqlCommand
    Dim dsDB As DataSet
   
    Public Sub conectar(ByVal CadConectarSql As String)
        cnDB = New SqlClient.SqlConnection
        cnDB.ConnectionString = CadConectarSql
        Try
            cnDB.Open()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Sub desconectar()
        cnDB.Close()
    End Sub

    Public Function conSelect(ByVal cadConsul As String) As DataTable
        Dim dtTabla As New DataTable
        Try
            cmDB = New SqlClient.SqlCommand(cadConsul, cnDB)
            dtTabla = New DataTable()

        Catch
            ' // MessageBox.Show(ex.Message);
        End Try
        Return dtTabla
    End Function

    Public Function conInsert(ByVal cadInsert As String) As DataTable
        Dim dtTabla As New DataTable
        Try
            cmDB = New SqlClient.SqlCommand(cadInsert, cnDB)
            cmDB.ExecuteNonQuery()
        Catch
            ' // MessageBox.Show(ex.Message);
        End Try
        Return dtTabla
    End Function
End Module

Para hacer uso de la conexión, en la clase form1 en el form1_load, hacemos uso del método conInsert para hacer un insert sobre la base de datos.

Para hacer un insert o un delete

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String
       
      CadConexion = "User ID=sa;Initial Catalog=model;Data Source=SRV-      SERVIDOR\INSTANCIASQL2005;Password=xxxxxxx"
      Conexion.conectar(CadConexion)
      Conexion.conInsert("INSERT INTO dbo.tbHospital VALUES      ('HOS99','Prueba','Borrar 34')")

End Sub

O para una select

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String     
Dim dt As New DataTable
Dim Valor As String

      CadConexion = "User ID=sa;Initial Catalog=model;DataSource=SRV-SERVIDOR\INSTANCIASQL2005;Password=xxxxxxx"

      Conexion.conectar(CadConexion)

Dim daDB As New SqlClient.SqlDataAdapter("SELECT * FROM dbo.tbHospital", Conexion.cnDB)

        daDB.Fill(dt)
        Valor = dt.Rows(2).Item(2)
        MessageBox.Show(Valor)
        Conexion.desconectar()
End Sub

O bien para conectar un Data grid a los resultados

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim CadConexion As String
Dim ds As New DataSet()

      CadConexion = "User ID=sa;Initial Catalog=model;Data       Source= SRV-SERVIDOR\INSTANCIASQL2005;Password= xxxxxxx"
      Conexion.conectar(CadConexion)

Dim daDB As New SqlClient.SqlDataAdapter("Select * From dbo.tbHospital", Conexion.cnDB)

      daDB.MissingSchemaAction = MissingSchemaAction.AddWithKey
      daDB.FillSchema(ds, SchemaType.Source, "Cust")
      daDB.Fill(ds, "Cust")

      DataGridView1.DataSource = ds
      DataGridView1.DataMember = "Cust"
       
End Sub

Explicación de la cadena de Conexión:

User ID=sa;  Usuario sa del SQL SERVER 2005
Initial Catalog=model;  Nombre de la Base de Datos
Data Source= SRV-SERVIDOR\INSTANCIASQL2005;  nombre de la instancia de SQL SERVER 2005
Password=xxxxxxx;  Password del sa del SQL SERVER 2005

En este enlace está la clase completa para conexión a base de datos.





8 comentarios:

  1. muy bueno pero como harias un update

    ResponderEliminar
  2. Exactamente igual que un insert, a lo mejor despista que haya llamado a la función conInsert() debería haberla llamado conMantenimiento() o similar, basta con sustituir el INSERT por un UPDATE pues esa función lo que hace que al final que es lo que realmente importa es el cmDB.ExecuteNonQuery()

    ResponderEliminar
  3. Lo siento, pero lo más moderno de que dispongo en Visual Studio 2005.

    ResponderEliminar
  4. No entiendo lo del select:

    Dim daDB As New SqlClient.SqlDataAdapter("SELECT * FROM dbo.tbHospital", Conexion.cnDB)

    daDB.Fill(dt)
    Valor = dt.Rows(2).Item(2)
    MessageBox.Show(Valor)
    Conexion.desconectar()
    End Sub

    para que sirve esa parte? por que no es simplemente igual a lo que se hace en el insert?

    ResponderEliminar
  5. No, el insert, el update y el delete ejecutan operaciones sobre la base de datos y
    sólo necesitamos saber si todo ha sido correcto o no.

    Con la select debemos capturar los valores devueltos que pueden ser muchos miles de registros
    con decenas de campos cada uno.

    En este caso los valores devueltos por la select se cargan en el adaptador de base de datos:

    daDB.Fill(dt)

    Y luego para manejarlos creamos un datatable que cargamos con los resultados de este adatador
    según nuestra demanda.

    Valor = dt.Rows(2).Item(2)

    En este caso particular hemos recogido el valor de la fila 2 y la columna 2 y luego lo
    mostramos en un mensaje.

    Si queremos la fila n y la columna m simplemente hacemos Valor = dt.Rows(n).Item(m)

    ResponderEliminar
  6. Pero se supone que el select busca, como voy a selecccionar el valor de la fila y de la columna si no se donde esta lo que estoy buscando?

    ResponderEliminar
  7. Eso ya depende de las circunstancias de cada programa. La select busca si sabes que buscar.
    Cuanto más fino sea el filtrado de la select menos registros devolverá. Incluso si sabes bien qué buscar, puede devolver sólo un registro.

    En el caso de que como dices, estés buscando. Lo mejor es volcar los resultados en un data grid para que sea el usuario de la aplicación el que busque el registro o registros deseados.

    ResponderEliminar