29 de febrero de 2012

Enviar Correo VB-C#

En esta parte se muestra como enviar un correo en VB sobre VS2010, al final están los códigos para VB y C#,  si bien es cierto son lenguajes diferentes, el mismo formulario y razonamiento de partes del código aplica para ambos lenguajes.

Enviando Correo con VB
Para enviar un correo en VB se deben importar los siguientes espacios de nombres:

Imports System.Net.Mail
Imports System.Net

a continuación crearemos un formulario como el que se muestra en la figura, donde en el GroupBox con texto Correo Remitente se pondrá la información del SMTP, dirección de correo electrónico y respectiva contraseña de la persona que envía el correo, mientras en el GroupBox con texto Correo destinatario va la información de la persona(s) que recibirá(n) el correo y la información que se mandará :


Mandar un correo en breve es hacer dos cosas, preparar el correo con las direcciones remitente, destino, CC, BCC, archivos adjuntos, asunto, tipo de codifcacion, etc y por otro lado preparar el SMTPClient por eso se especifican las variables correo y Servidor, correo toma los valores de Usuario y A, como ambos son direcciones de correo se especifican como New MailAddress:

Dim Usuario As String = TxtUsuario.Text
Dim A As String = txtA.Text
Dim Remitente As MailAddress = New MailAddress(Usuario)
Dim Destinatario As MailAddress = New MailAddress(A)

Dim correo As New Mail.MailMessage(Remitente, Destinatario)
Dim Servidor As New Mail.SmtpClient

Ahora, en este ejemplo para no andar especificando el puerto ni el protocolo de mensajería(SMTP), lo que se creo en el formulario fue un ComboBox con las opciones de correo a los que la aplicación puede mandar mensajes, tal como se muestra a continuación con el respectivo código en el evento Load del formulario:



TxtCorreo.Items.Add("Direccion correo Hotmail")
TxtCorreo.Items.Add("Direccion correo Gmail")
TxtCorreo.Items.Add("Direccion correo Yahoo")
TxtCorreo.Items.Add("Direccion Correo Empresarial")
TxtCorreo.DropDownStyle = ComboBoxStyle.DropDownList

Ahora, el puerto que usaremos para mandar mensajes a cualquier servidor de correo será el mismo, por lo que una variable definirá el puerto a utilizar que será el 25:
Dim Puerto As Integer = 25
Lo que si cambiará será al SMTP utilizado y el valor para EnableSsl, esto porque para los SmtpClients Hotmail y Gmail no hay problema en utilizar Secure Sockets Layer para encriptar la conexión, pero Yahoo no lo acepta, así que debemos especificar en código utilizando una variable tipo string que llamaré sec si se activa o desactiva el SSL, dejando a SMTP y sec en string tal como se muestra:

Dim SMTP As String
Dim Puerto As Integer = 25
Dim sec As String


TxtCorreo es el ComboBox que da la opción de escoger a que SMTPClient se mandará el correo, lo que haré para tomar estos valores y saber asignar correctamente los valores a SMTP y sec será capturar el valor del ComboBox(TxtCorreo) y utilizar un IF para ir comparando con valores que pueda tomar el ComboBox:

Dim tipo As String = Convert.ToString(TxtCorreo.Text)

        If tipo = "Direccion correo Hotmail" Then
            SMTP = "SMTP.live.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Gmail" Then
            SMTP = "SMTP.gmail.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Yahoo" Then
            SMTP = "smtp.mail.yahoo.com"
            sec = "false"
        ElseIf tipo = "Direccion Correo Empresarial" Then
            SMTP = "127.0.0.1"
            sec = "true"
        End If

Listo, otra indicación seria el como adjuntar un archivo, esta es la parte del formulario que se encarga de eso:


Para adjuntar hago uso de esta variable:
Dim attachment As OpenFileDialog = New OpenFileDialog()
le especifico un filtro y un textbox que mostrará la ruta del archivo adjunto
attachment.Filter = "All Files(*.*)|*.*"
TxtAdjunto.ReadOnly = True

en el evento click del botón se tendría este código: 


Private Sub BExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BExaminar.Click
        If attachment.ShowDialog = Windows.Forms.DialogResult.OK Then
            TxtAdjunto.Text = attachment.FileName
        End If
    End Sub


Tambien notar que algunos correos pueden tener o no CC, BCC y archivos adjuntos por lo que se debe indicar al momento de mandar el correo, esta parte del codigo es así:
1. Tomar los valores en los textbox correspondientes a CC y BCC y verifico no esten vacios.
2. en caso de no estarlo creo la nueva direccion de correo
3. para el archivo adjunto en caso de existir un Filename es que se ha escogido un archivo, entonces lo adjunto al correo

Dim CopiaCarbon As String = TxtCC.Text
Dim BCopiaCarbon As String = TxtBCC.Text

If Not CopiaCarbon Is Nothing And CopiaCarbon <> vbNullString Then
                    correo.Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If Not CopiaCarbon Is Nothing And BCopiaCarbon <> vbNullString Then
                    correo.Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If attachment.FileName.Length > 0 Then
                    correo.Attachments.Add(New Attachment(attachment.FileName))
                End If
            End With



por ultimo el nombre de cada textbox y el código para mandar el correo desde VB...el ComboBox se llama TxtCorreo y el de adjuntar archivos es TxtAdjunto, ambos no admiten se escriba sobre ellos.



Imports System.Net.Mail
Imports System.Net
Imports System.IO

Public Class Form1
    Dim SMTP As String
    Dim Puerto As Integer = 25
    Dim sec As String
    Dim attachment As OpenFileDialog = New OpenFileDialog()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TxtCorreo.Items.Add("Direccion correo Hotmail")
        TxtCorreo.Items.Add("Direccion correo Gmail")
        TxtCorreo.Items.Add("Direccion correo Yahoo")
        TxtCorreo.Items.Add("Direccion Correo Empresarial")
        TxtCorreo.DropDownStyle = ComboBoxStyle.DropDownList
        attachment.Filter = "All Files(*.*)|*.*"
        TxtAdjunto.ReadOnly = True
    End Sub

    Private Sub BExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BExaminar.Click
        If attachment.ShowDialog = Windows.Forms.DialogResult.OK Then
            TxtAdjunto.Text = attachment.FileName
        End If
    End Sub

    Private Sub BCorreo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCorreo.Click

        Dim Usuario As String = TxtUsuario.Text
        Dim Contraseña As String = TxtContraseña.Text
        Dim A As String = txtA.Text
        Dim Contenido As String = txtContenido.Text.Trim() & vbCrLf
        Dim Asunto As String = txtAsunto.Text
        Dim Remitente As MailAddress = New MailAddress(Usuario)
        Dim Destinatario As MailAddress = New MailAddress(A)
        Dim CopiaCarbon As String = TxtCC.Text
        Dim BCopiaCarbon As String = TxtBCC.Text
        Dim tipo As String = Convert.ToString(TxtCorreo.Text)

        If tipo = "Direccion correo Hotmail" Then
            SMTP = "SMTP.live.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Gmail" Then
            SMTP = "SMTP.gmail.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Yahoo" Then
            SMTP = "smtp.mail.yahoo.com"
            sec = "false"
        ElseIf tipo = "Direccion Correo Empresarial" Then
            SMTP = "127.0.0.1"
            sec = "true"
        End If

        Try
            Dim correo As New Mail.MailMessage(Remitente, Destinatario)
            Dim Servidor As New Mail.SmtpClient

            With correo
                'aqui puedo agregar mas destinatarios, se debe borrar Remitente y destinatario y modificar
                ' la declaracion de correo y ademas dejar codigo asi: Dim correo As New Mail.MailMessage()
                '.From = New Mail.MailAddress(Usuario)
                '.To.Add(New MailAddress(A))
                '.To = New Mail.MailAddress(A)  aqui solo especifica un destinatario con Add se agregan mas.
                'por ejemplo
                '.To.Add(New MailAddress(A1))
                '.To.Add(New MailAddress(A2))
                '.To.Add(New MailAddress(A3))
                .Subject = Asunto
                .Body = Contenido
                .BodyEncoding = System.Text.Encoding.UTF8
                .IsBodyHtml = False
                .Priority = MailPriority.Normal


                If Not CopiaCarbon Is Nothing And CopiaCarbon <> vbNullString Then
                    .Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If Not CopiaCarbon Is Nothing And BCopiaCarbon <> vbNullString Then
                    .Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If attachment.FileName.Length > 0 Then
                    .Attachments.Add(New Attachment(attachment.FileName))
                End If
            End With

            With Servidor
                .Host = SMTP
                .Port = Puerto
                .EnableSsl = sec
                .Credentials = New System.Net.NetworkCredential(Usuario, Contraseña)
                .Send(correo)
            End With

            MessageBox.Show("Correo enviado!", "Correo", MessageBoxButtons.OK)
        Catch
            MessageBox.Show("Correo no se envio !", "Correo", MessageBoxButtons.OK)
        End Try
    End Sub
End Class




y el mismo formulario solo que esta vez con C#


using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Net.Mail;
using System.Net;
using System.IO;
using System.Windows.Forms;

public class Form1
{
    string SMTP;
    int Puerto = 25;
    string sec;

    OpenFileDialog attachment = new OpenFileDialog();
    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        TxtCorreo.Items.Add("Direccion correo Hotmail");
        TxtCorreo.Items.Add("Direccion correo Gmail");
        TxtCorreo.Items.Add("Direccion correo Yahoo");
        TxtCorreo.Items.Add("Direccion Correo Empresarial");
        TxtCorreo.DropDownStyle = ComboBoxStyle.DropDownList;
        attachment.Filter = "All Files(*.*)|*.*";
        TxtAdjunto.ReadOnly = true;
    }

    private void BExaminar_Click(System.Object sender, System.EventArgs e)
    {
        if (attachment.ShowDialog == System.Windows.Forms.DialogResult.OK)
        {
            TxtAdjunto.Text = attachment.FileName;
        }
    }


    private void BCorreo_Click(System.Object sender, System.EventArgs e)
    {
        string Usuario = TxtUsuario.Text;
        string Contraseña = TxtContraseña.Text;
        string A = txtA.Text;
        string Contenido = txtContenido.Text.Trim() + Constants.vbCrLf;
        string Asunto = txtAsunto.Text;
        MailAddress Remitente = new MailAddress(Usuario);
        MailAddress Destinatario = new MailAddress(A);
        string CopiaCarbon = TxtCC.Text;
        string BCopiaCarbon = TxtBCC.Text;
        string tipo = Convert.ToString(TxtCorreo.Text);

        if (tipo == "Direccion correo Hotmail")
        {
            SMTP = "SMTP.live.com";
            sec = "true";
        }
        else if (tipo == "Direccion correo Gmail")
        {
            SMTP = "SMTP.gmail.com";
            sec = "true";
        }
        else if (tipo == "Direccion correo Yahoo")
        {
            SMTP = "smtp.mail.yahoo.com";
            sec = "false";
        }
        else if (tipo == "Direccion Correo Empresarial")
        {
            SMTP = "127.0.0.1";
            sec = "true";
        }

        try
        {
            System.Net.Mail.MailMessage correo = new System.Net.Mail.MailMessage(Remitente, Destinatario);
            System.Net.Mail.SmtpClient Servidor = new System.Net.Mail.SmtpClient();

            var _with1 = correo;
            //aqui puedo agregar mas destinatarios, se debe borrar Remitente y destinatario y modificar
            // la declaracion de correo y ademas dejar codigo asi: Dim correo As New Mail.MailMessage()
            //.From = New Mail.MailAddress(Usuario)
            //.To.Add(New MailAddress(A))
            //.To = New Mail.MailAddress(A)  aqui solo especifica un destinatario con Add se agregan mas.
            //por ejemplo
            //.To.Add(New MailAddress(A1))
            //.To.Add(New MailAddress(A2))
            //.To.Add(New MailAddress(A3))
            _with1.Subject = Asunto;
            _with1.Body = Contenido;
            _with1.BodyEncoding = System.Text.Encoding.UTF8;
            _with1.IsBodyHtml = false;
            _with1.Priority = MailPriority.Normal;


            if ((CopiaCarbon != null) & CopiaCarbon != Constants.vbNullString)
            {
                _with1.Bcc.Add(new MailAddress(BCopiaCarbon));
            }

            if ((CopiaCarbon != null) & BCopiaCarbon != Constants.vbNullString)
            {
                _with1.Bcc.Add(new MailAddress(BCopiaCarbon));
            }

            if (attachment.FileName.Length > 0)
            {
                _with1.Attachments.Add(new Attachment(attachment.FileName));
            }

            var _with2 = Servidor;
            _with2.Host = SMTP;
            _with2.Port = Puerto;
            _with2.EnableSsl = sec;
            _with2.Credentials = new System.Net.NetworkCredential(Usuario, Contraseña);
            _with2.Send(correo);

            MessageBox.Show("Correo enviado!", "Correo", MessageBoxButtons.OK);
        }
        catch
        {
            MessageBox.Show("Correo no se envio !", "Correo", MessageBoxButtons.OK);
        }
    }
    public Form1()
    {
        Load += Form1_Load;
    }
}





28 de febrero de 2012

ComboBox

para agregar valores a un ComboBox solo debe hacerse esto


ComboBox.Items.Add("Direccion correo Hotmail")
ComboBox.Items.Add("Direccion correo Gmail")
ComboBox.Items.Add("Direccion correo Yahoo")
ComboBox.Items.Add("Direccion Correo Empresarial")

y para evitar que escriban sobre el solo debe agregarse esta linea de código

ComboBox.DropDownStyle = ComboBoxStyle.DropDownList

21 de febrero de 2012

Archivo de base de datos local

Hooooola a los sabios de la UCA, como me di cuenta que "no se acordaban" de estas cosas por mas sencillas que ellos mismos gritan que son, les dejo esta entrada para "ayudarles a recordar"

Por lo general las bases de datos pequeñas se entregan junto con el proyecto en una carpeta de este, específicamente en Proyecto/bin/Debug y luego se hace referencia a esta con la siguiente cadena de conexión que se puede conseguir desde settings en las propiedades del proyecto, la base para mi caso se llama fotografías:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\bin\Debug\fotografias.accdb

esto es cuando simplemente se copia el archivo de datos en nuestro proyecto, pero Visual Studio también da la opción de crearlo dando click derecho a nuestro proyecto desde el Solution Explorer



luego agregamos según las necesidades de la aplicación, por ejemplo con esta opción la base de datos a crear será una BD de SQL Server Compact que utiliza un archivo de datos SDF.

Que se guarda en donde este la carpeta del proyecto, solo se necesitara el driver para acceder a ella y claro la debida cadena de conexión, este tipo de base es útil cuando solo un usuario se conectara a la base en un momento dado.

No hay necesidad de instalar un servidor para acceder a una base de datos SDF. Sólo tiene que distribuir los archivos DLL que constituyen SSCE junto con su aplicación y acceder a los archivos de datos directamente. 




Una base de datos basada en los servicios es una base de datos que sólo se accede a través de un servidor. Utiliza el formato de SQL Server para los archivos de datos MDF y LDF adjuntados al servidor, es por esto que para poder conectarse a una base de datos SQL Server, el servicio de SQL Server debe estar ejecutándose, porque es que la que procesa sus solicitudes y acceder al archivo de datos.




y por otro lado las imágenes se guardan en la carpeta resources, se pueden guardar desde references en las propiedades del proyecto o buscar la carpeta directamente.




eso es todo.

20 de febrero de 2012

Uso del CommandBuilder

 En este ejemplo además utilizaré otros objetos, tales como BindingSource y BindingNavigator, asi que les dejo una explicación de cada uno con el código de ejemplo al final


CommandBuilder


Para utilizar un CommandBuilder deberan ejecutar la consulta de selección de registros con un DataAdapter ya que el comando SELECT es necesario para que el CommandBuilder sepa cómo debe crear los comandos tal como determina la ayuda de MSDN:

El requisito mínimo para que la generación automática de comandos funcione correctamente consiste en establecer la propiedad SelectCommand. El esquema de tabla que recupera la propiedad SelectCommand determina la sintaxis de las instrucciones INSERT, UPDATE y DELETE generadas automáticamente.

Para generar instrucciones SQL automáticamente para un DataAdapter, defina en primer lugar la propiedadSelectCommand del DataAdapter y, a continuación, cree un objeto CommandBuilder y especifique como argumento el DataAdapter para el que CommandBuilder generará automáticamente las instrucciones SQL.


Aquí dejo unos ejemplos de código de la misma página de MSDN

VB
' Assumes that connection is a valid SqlConnection object
' inside of a Using block.
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
  "SELECT * FROM dbo.Customers", connection)
Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter)
builder.QuotePrefix = "["
builder.QuoteSuffix = "]"

C#
// Assumes that connection is a valid SqlConnection object
// inside of a using block.
SqlDataAdapter adapter = new SqlDataAdapter(
  "SELECT * FROM dbo.Customers", connection);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";

La consulta de selección se realiza porque el CommandBuilder funciona sobre un objeto DataAdapter para crear los comandos de Transact SQL (TSQL) que son necesarios para actualizar y para insertar registros en el origen de datos, los cuales son cuatro objetos Command. Uno para selección de registros, el SelectCommand(SC), uno para cuando se ingresó un registro en un DataTable saber que hacer en la base de datos, el InsertCommand (IC), uno para cuando se modificó un registro en el DataTable, el UpdateCommand (UC) y uno para cuando el registro fue eliminado del DataTable, el DeleteCommand (DC).


Además, el DataAdapter tiene otros objetos llamados los TableMapping y ColumnMapping. Estos objetos te mapean los datos de los esquemas de las bases de datos a los datos de los esquemas de los DataSets.

El DataAdapter debe tener para funcionar por lo menos el SC, este te genera los TableMappings y los ColumnMappings y te permite relacionar la consulta del SC con los datos de los DataTables. Pero cuando haces acciones sobre los DataTables y vas a actualizar la base de datos debes tener los otros tres objetos Command establecidos. El problema es que en este caso las sentencias se complican un poco por que debe saber exáctamente como iba el registro originalmente y como está actualmente. Es decir, debes por así decirlo, crear un mapeo hacia atrás con las sentencias IC, UC y DC.

El CommandBuilder permite que una vez tengas una sentencia SC, que se haga sobre una sola tabla y tenga dentro de los campos selecionados los campos de llave primaria y los campos que no tienen admiten null, puedas generar automáticamente las demás sentencias IC, UC y DC.


El código es más o menos así:

[C#]
SqlConnection cn = new SqlConnection("");
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Tabla", cn);
// Crear CommandBuilder. Al pasar como parámetro el
// DataAdapter toma el SC y genera los demás comandos
SqlCommandBuilder cb = new SqlCommandBuilder(da);
da.InsertCommand = cb.GetInsertCommand();
da.UpdateCommand = cb.GetUpdateCommand();
da.DeleteCommand = cb.GetDeleteCommand();
// Crear el DataSet y llenarlo
DataSet ds = new DataSet();
da.Fill(ds);
.
.
.
// Después de trabajar desconectado se actualizan los datos.
// El DataAdapter ya sabe como actualizarlos por que tiene los comandos IC,
UC y DC
da.Update(ds);

[VB]
' Crear conexión y DataAdapter
Dim cn As New SqlConnection("")
Dim da As New SqlDataAdapter("SELECT * FROM Tabla", cn)
' Crear CommandBuilder. Al pasar como parámetro el
' DataAdapter toma el SC y genera los demás comandos
Dim cb As New SqlCommandBuilder(da)
da.InsertCommand = cb.GetInsertCommand()
da.UpdateCommand = cb.GetUpdateCommand()
da.DeleteCommand = cb.GetDeleteCommand()
' Crear el DataSet y llenarlo
Dim ds As New DataSet()
da.Fill(ds)
.
.
.
' Después de trabajar desconectado se actualizan los datos.
' El DataAdapter ya sabe como actualizarlos por que tiene los comandos IC,
UC y DC
da.Update(ds)


Cosas sobre CommandBuilder:
  • El CommandBuilder solo es útil cuando trabajas con una sola tabla y además la tabla debe tener definida una llave primaria.
  • SelectCommand también debe devolver como mínimo una clave principal o una columna única. Si no hay ninguna, se genera una excepción InvalidOperation y no se genera ningún comando.
  • Cuando se asocia con un objeto DataAdapter, el CommandBuilder genera automáticamente las propiedadesInsertCommand, UpdateCommand y DeleteCommand del objeto DataAdapter si son referencias nulas. Si ya existe algún objeto Command para una propiedad, se utilizará el objeto Command existente.



BindingSource

Es un objeto que hace de intermediario entre el control y el conjunto de datos. Simplifica la conexión facilitando la actualización del contenido, la notificación de cambios, etc. Se incluye la navegación, ordenación, filtrado y actualización. El origen de datos subyacente se fija a través de uno de los siguientes mecanismos:         
  •        Usar el método Add para añadir un elemento al componente BindingSource
  •        Asignar a su propiedad DataSource una lista, objeto o un tipo.
Su funcionamiento permite enlazar universalmente todos los controles de formularios Windows a orígenes de datos muy diversos.

Podemos imaginarnos al objeto BindingSource como el objeto que nos permite movernos dentro de los registros existentes en el origen de datos al cual se encuentra enlazado. Tal y como se indica en la ayuda de Visual Studio, el objeto BindingSource está encapsulando el origen de datos que se ha asignado a su propiedad DataSource, normalmente se tratará de un objeto DataTable, que es el verdadero objeto que contiene los datos que han sido recuperados de la base de datos fisica.


BindingNavigator

A partir de la versión 2005, Microsoft incorporó un nuevo objeto llamado BindingNavigator el cual es un control basado en un  objeto ToolStrip,  que permite realizar funciones de navegación por el conjunto de datos. Estas funciones son: Primer registro,último, siguiente, anterior, número de registros totales en el conjunto de datos y posición actual.



MissingSchemaAction.AddWithKey de DataAdapter


El objeto DataAdapter está optimizado para los escenarios de sólo lectura de forma predeterminada. El método Fill sólo recupera la parte del esquema necesaria para llenar un objeto DataSet. Para obtener el esquema adicional necesario para actualizar o validar los objetos DataSet se debe utilizar la enumeración AddWithKey de la propiedad MissingSchemaAction del DataAdapter.

Establecer la propiedad MissingSchemaAction del DataAdapter en AddWithKey es agregar información al esquema acerca de las claves principales, los campos AutoIncrement, los campos que aceptan valores NULL y los índices únicos.



El programa


Se presentarán los datos de la tabla img en la base de datos imagenes, para esto se creara un archivo app.config para guardar información de la conexión, los datos a presentar son tres: nombre, comentarios y ruta.


<connectionStrings>
        <add name="conexion" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=imagenes;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    connectionStrings>


Esta será la aplicación, con su interfaz y el código, como ven se usa el Bindingnavigator para movilizarse entre los datos obtenidos por la consulta select, pero también se logra con los botones abajo de los TextBox, lo dejé así para que ustedes seleccionen el que prefieran porque obvio que es redundante utilizar los botones teniendo el Bindingnavigator, asi que fíjense en los comentarios del evento click de cada botón aparece la manera de moverse entre registros utilizando el BindingSource o el BindingContext (ambos necesitan el bs !!!)



Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class Form1
    Dim sql As SqlConnection
    Dim da As SqlDataAdapter
    Dim ds As New DataSet
    Dim bs As New BindingSource
    Dim dt As New DataTable
     Dim s As String = ConfigurationManager.ConnectionStrings("conexion").ConnectionString.ToString

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

    Public Sub Cargardatos()

        sql = New SqlConnection(s)
        ConfigurarAdaptadorDatos()
        da.Fill(dt)
        bs.DataSource = dt

        DataGridView1.DataSource = bs
        BindingNavigator1.BindingSource = bs
        TextBox1.DataBindings.Clear()

        TextBox3.DataBindings.Clear()
        TextBox4.DataBindings.Clear()
        TextBox1.DataBindings.Add("text", bs, "nombre")
        TextBox3.DataBindings.Add("text", bs, "comentarios")
        TextBox4.DataBindings.Add("text", bs, "ruta")

    End Sub

    Private Sub ConfigurarAdaptadorDatos()

        Try
            da = New SqlDataAdapter("select * from img", sql)
            da.MissingSchemaAction = MissingSchemaAction.AddWithKey
            Dim cb As New SqlCommandBuilder(da)

            cb.QuotePrefix = "["
            cb.QuoteSuffix = "]"

            da.InsertCommand = cb.GetInsertCommand()
            da.UpdateCommand = cb.GetUpdateCommand()
            da.DeleteCommand = cb.GetDeleteCommand()

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        bs.MoveLast()
        'Me.BindingContext(bs).Position = Me.BindingContext(bs).Count - 1    aqui no se necesita el bs
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        If bs.Position + 1 < bs.Count Then
            bs.MoveNext()
        End If
        'Me.BindingContext(ds).Position += 1            aqui no se necesita el bs
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        ' Me.BindingContext(ds).Position -= 1           aqui no se necesita el bs
        bs.MovePrevious()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        bs.MoveFirst()
        'Me.BindingContext(ds).Position = 0              aqui no se necesita el bs
    End Sub

    Private Sub BNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BNuevo.Click
        bs.AddNew()
        DataGridView1.Focus()
    End Sub

    Private Sub BGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BGuardar.Click
        Try
            Me.Validate()
            Me.bs.EndEdit()
            Dim n As Integer = Me.da.Update(Me.dt)

            MessageBox.Show("Nº de registros afectados: " & CStr(n))
            Cargardatos()
        Catch ex As Exception
            MessageBox.Show("Update failed")

        End Try
    End Sub
End Class




lunes, febrero 20, 2012