martes, 19 de enero de 2010

[ADO.NET] – Parte 5 – Operaciones CRUD

 

Introducción


El objetivo de este articulo será el de demostrar con un ejemplo simple como hacer uso de ado.net para trabajar de forma simple con los datos, realizando operación de CRUD (Create, Read, Update and Delete) .

Si bien esta aplicación de ejemplo hace uso del código desarrollado directamente en el propio formulario, se vera que el uso de funciones en la estructurada ordena el código dejándolo mas legible, permitiendo además mover la funcionalidad de lugar si en el futuro hiciera falta sin afectar el funcionamiento.

La aplicación de ejemplo solo cuenta con un formularios, que observaran en esta imagen

pantalla aplicacion

 

1 – Obtener información


Si se analiza el código se vera que es por medio de ingreso de un id valido en el campo que corresponde y mediante la acción de la tecla Enter se realiza la búsqueda.

[C#]

private void txtId_KeyPress(object sender, KeyPressEventArgs e)
{
    if((int)e.KeyChar == (int)Keys.Enter)
    {
        //
        // Validaciones
        //
        errProvider.SetError(txtId, "");

        int Id = 0;
        if (!int.TryParse(txtId.Text, out Id))
        {
            errProvider.SetError(txtId, "El Id debe ser un valor numerico");
            return;
        }

        if (!Exists(Id))
        {
            errProvider.SetError(txtId,"El Id ingresado no existe.");
            return;
        }

        Obtener(Id);
    }

}

private void Obtener(int Id)
{
    string sql = @"SELECT Id
                          ,NombreCompleto
                          ,Direccion
                          ,FechaNacimiento
                      FROM Contactos
                      WHERE Id = @Id";


    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {

        SqlCommand command = new SqlCommand(sql, conn);
        command.Parameters.AddWithValue("Id", Id);

        conn.Open();

        SqlDataReader reader = command.ExecuteReader();

        if (reader.Read())
        {
            txtNombre.Text = Convert.ToString(reader["NombreCompleto"]);
            txtDireccion.Text = Convert.ToString(reader["Direccion"]);
            dtpFechaNanimiento.Value = Convert.ToDateTime(reader["FechaNacimiento"]);
        }

    }
}

private bool Exists(int Id)
{
    string sql = @"SELECT COUNT(*)
                      FROM Contactos
                      WHERE Id = @Id";


    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {

        SqlCommand command = new SqlCommand(sql, conn);
        command.Parameters.AddWithValue("Id", Id);

        conn.Open();

        int count = Convert.ToInt32(command.ExecuteScalar());

        if (count == 0)
            return false;
        else
            return true;

    }
}

[VB.NET]

   Private Sub txtId_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)

       If AscW(e.KeyChar) = CInt(Keys.Enter) Then
           '
           ' Validaciones
           '
           errProvider.SetError(txtId, "")

           Dim Id As Integer = 0
           If Not Integer.TryParse(txtId.Text, Id) Then
               errProvider.SetError(txtId, "El Id debe ser un valor numerico")
               Return
           End If

           If Not Exists(Id) Then
               errProvider.SetError(txtId, "El Id ingresado no existe.")
               Return
           End If

           Obtener(Id)
       End If

   End Sub

Private Sub Obtener(Id As Integer)
       Dim sql As String = "SELECT Id" & _
                               ",NombreCompleto" & _
                               ",Direccion" & _
                               ",FechaNacimiento " & _
                           "FROM Contactos " & _
                           "WHERE Id = @Id"


	Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

		Dim command As New SqlCommand(sql, conn)
		command.Parameters.AddWithValue("Id", Id)

		conn.Open()

		Dim reader As SqlDataReader = command.ExecuteReader()

		If reader.Read() Then
			txtNombre.Text = Convert.ToString(reader("NombreCompleto"))
			txtDireccion.Text = Convert.ToString(reader("Direccion"))
			dtpFechaNanimiento.Value = Convert.ToDateTime(reader("FechaNacimiento"))

		End If
	End Using
End Sub

Private Function Exists(Id As Integer) As Boolean
       Dim sql As String = "SELECT COUNT(*) " & _
                           "FROM Contactos " & _
                           "WHERE Id = @Id"


	Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

		Dim command As New SqlCommand(sql, conn)
		command.Parameters.AddWithValue("Id", Id)

		conn.Open()

		Dim count As Integer = Convert.ToInt32(command.ExecuteScalar())

		If count = 0 Then
			Return False
		Else
			Return True

		End If
	End Using
End Function	

En esta sección de código se observara la recuperación de una entidad en base al id ingresado por el usuario.

En el evento KeyPress del textbox que presenta al Id se detecta la presión de la tecla Enter como medio para indicar la búsqueda de un contacto.

Entre las validaciones a realizar se verifica que el id ingresado sea numérico, también se valida que el registro exista en la base de datos, para ello es que se realiza la primer consulta que esta encapsulada en la función Exists(), esta tomara el id ingresado y ejecutara una consulta que devolverá el numero de registros que coincidan en este caso con el id ingresado, si el valor es cero entonces el registro no existe.

El método ExecuteScalar() del objeto SqlCommand es ideal para estos casos ya que devolver el valor del primer registro y la primer columna, como en este caso solo hay un valor pues se hizo uso de la función SQL Count() devolverá dato simple.

Una vez validada la existencia se procede a recuperar el registro, para ello la función de Obtener() cumplirá la misión, requiriendo que se le pase como parámetro el id del registro a obtener

Como se observa este tiene una estructura similar a la Exists() solo que no usa el ExcecuteScalar(), sino que obtiene un SqlReader, usando ExecuteReader() del objeto SqlCommand.

En este caso se sabe con anticipación que solo será devuelto un registro no hace falta hacer un loop por cada registro, por lo general se utiliza la sentencia “while”, en este caso el if cumple la función perfectamente para posicionar el cursor del reader a la primer posición, y poder realizar la lectura, entonces el if cumple básicamente dos funciones:

- permite validad que hay registros que leer, si por algún fallo no hubiera registro al llegar al if pasaría por false.

- al ejecutar el Read() del objeto SqlReader, posiciona el cursos para su lectura

Por ultimo se iguala el valor de cada campo de la consulta, realizando la conversión de tipos y asignadla a los respectivos controles.

Como se habrá observado hasta aquí y también se notaran en los ejemplos siguientes, los pasos para usar los objetos de ado.net son bastante repetitivos:

1- Se crea un objeto SqlConnection para establecer la conexión hacia la base de datos

2- Se crea el objeto SqlCommand, para establecer la consulta que se realizara, y se le asignan a este los parámetros si es que hacen falta

3- en este punto existirá un bifurcación

3a- Si se usa un DataReader, se podrá ejecutar directamente mediante el ExecuteReader()

3b- Si se usa un DataSet o DataTable, será necesario utilizar un SqlDataAdapter, para realizar el Fill() del objeto a cargar con los datos provenientes de la consulta.

 

2 - Insertar nuevo registro


La operación de insertar registro tiene algunas particularidades que necesitas ser detalladas.

Tanto la operación de insertar o actualizar será ejecutada mediante el mismo botón a nivel de interfaz del usuario, para ello es que se identifica si el id que se define existe o no (usando la función Exists(), antes comentada), esto podrá ser visto en el evento Click del botón Guardar.

El primer punto que hay que aclarar es que en este primer ejemplo no se hace uso de un campo autonumérico (o Identity) para el id de la tabla. Es por ello que se deberá obtener por medio de código cual será el próximo numero identificador a utilizar.

Para esta operación es que existe la función MaxId(), la cual hace uso de otra función SQL, en este caso MAX() que retornada el valor máximo existente en la tabla para un determinado campo que indiquemos. En este caso por tratarse de un valor simple, nuevamente se usa el ExecuteScalar() del SqlCommand.

[C#]

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            //
            // Validaciones
            //
            int Id = 0;
            if (!string.IsNullOrEmpty(txtId.Text))
            {
                if (!int.TryParse(txtId.Text, out Id))
                {
                    MessageBox.Show("El Id debe ser un valor numerico");
                    return;
                }
            }

            if (Exists(Id))
            {
                bool result = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value);

                if (result)
                    MessageBox.Show("El registro se ha actualizado correctamente.");
            }
            else
            {
                bool result = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value);
                
                if (result)
                    MessageBox.Show("El registro se ha insertado correctamente.");
            }
        }

        private bool Insert(string nombre, string direccion, DateTime fechaNacimiento)
        {
            string sql = @"INSERT INTO Contactos (Id
                                  ,NombreCompleto
                                  ,Direccion
                                  ,FechaNacimiento)
                              VALUES (@Id, 
                                    @Nombre, 
                                    @Direccion, 
                                    @FechaNacimiento)";


            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                int NextId = MaxId() + 1;

                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddWithValue("Id", NextId);
                command.Parameters.AddWithValue("Nombre", nombre);
                command.Parameters.AddWithValue("Direccion", direccion);
                command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento);

                conn.Open();

                int rowsAffected = command.ExecuteNonQuery();

                if (rowsAffected > 0)
                    return true;
                else
                    return false;

            }
        }
		

        private static int MaxId()
        {
            string sql = @"SELECT MAX(Id)
                              FROM Contactos";


            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {

                SqlCommand command = new SqlCommand(sql, conn);

                conn.Open();

                return Convert.ToInt32(command.ExecuteScalar());

            }
        }

 

[VB.NET]

Private Sub btnGuardar_Click(sender As Object, e As EventArgs)
	'
	' Validaciones
	'
	Dim Id As Integer = 0
	If Not String.IsNullOrEmpty(txtId.Text) Then
		If Not Integer.TryParse(txtId.Text, Id) Then
			MessageBox.Show("El Id debe ser un valor numerico")
			Return
		End If
	End If

	If Exists(Id) Then
		Dim result As Boolean = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value)

		If result Then
			MessageBox.Show("El registro se ha actualizado correctamente.")
		End If
	Else
		Dim result As Boolean = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value)

		If result Then
			MessageBox.Show("El registro se ha insertado correctamente.")
		End If
	End If
End Sub

Private Function Insert(nombre As String, direccion As String, fechaNacimiento As DateTime) As Boolean
	If Not ValidateForm() Then
		Return False
	End If

       Dim sql As String = "INSERT INTO Contactos (Id" & _
                                       ",NombreCompleto" & _
                                       ",Direccion" & _
                                       ",FechaNacimiento)" & _
                                   "VALUES (@Id, " & _
                                       "@Nombre, " & _
                                       "@Direccion, " & _
                                       "@FechaNacimiento)"


	Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
		Dim NextId As Integer = MaxId() + 1

		Dim command As New SqlCommand(sql, conn)
		command.Parameters.AddWithValue("Id", NextId)
		command.Parameters.AddWithValue("Nombre", nombre)
		command.Parameters.AddWithValue("Direccion", direccion)
		command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento)

		conn.Open()

		Dim rowsAffected As Integer = command.ExecuteNonQuery()

		If rowsAffected > 0 Then
			ClearControls()
			Return True
		Else
			Return False

		End If
       End Using

End Function

Private Function MaxId() As Integer
       Dim sql As String = "SELECT MAX(Id)" & _
                           "FROM Contactos"


	Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

		Dim command As New SqlCommand(sql, conn)

		conn.Open()


		Return Convert.ToInt32(command.ExecuteScalar())
	End Using
End Function

En el método Insert() se observara que la consulta hace uso de parámetros para asignar los valores, es por ello que el objeto SqlCommand posee la propiedad Parameters, y en esta se hace uso de la forma rápida por medio de método AddWithValue(), definiendo el nombre del parámetro y el valor.

Además se hace uso de otra del las funciones del SqlCommand el ExecuteNonQuery(), este es útil ante consultas SQL de actualización, o sea no retornan un conjunto de datos. Este método si devolver un valor entero que indicara la cantidad de registros afectados, si este devuelve cero quiere decir que no se actualizaron registro, en este ejemplo esto indicaría un fallo en la aplicación ya que siempre al menos un registro debe ser insertado de forma correcta.

 

3 – Actualizar registro existente


La operación de actualización es bastante similar a la operación anterior de insert, salvando la diferencia que cambia completamente la sentencia sql utilizada.

Al igual que con el insert, se hacen uso de parámetros para asignar los valores a la consulta, salvo que este necesita contar con el id del registro que se quiere actualizar y será utilizado en la sección del WHERE que permitirá identificar que registro afectar con los cambios.

[C#]

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            //
            // Validaciones
            //
            int Id = 0;
            if (!string.IsNullOrEmpty(txtId.Text))
            {
                if (!int.TryParse(txtId.Text, out Id))
                {
                    MessageBox.Show("El Id debe ser un valor numerico");
                    return;
                }
            }

            if (Exists(Id))
            {
                bool result = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value);

                if (result)
                    MessageBox.Show("El registro se ha actualizado correctamente.");
            }
            else
            {
                bool result = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value);
                
                if (result)
                    MessageBox.Show("El registro se ha insertado correctamente.");
            }
        }
		
		
        private static bool Update(int id, string nombre, string direccion, DateTime fechaNacimiento)
        {

            string sql = @"UPDATE Contactos SET 
                                  NombreCompleto = @Nombre
                                  ,Direccion = @Direccion
                                  ,[FechaNacimiento] = @FechaNacimiento
                            WHERE Id = @Id";


            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {

                SqlCommand command = new SqlCommand(sql, conn);
                command.Parameters.AddWithValue("Id", id);
                command.Parameters.AddWithValue("Nombre", nombre);
                command.Parameters.AddWithValue("Direccion", direccion);
                command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento);

                conn.Open();

                int rowsAffected = command.ExecuteNonQuery();

                if (rowsAffected > 0)
                    return true;
                else
                    return false;

            }
        }

 

[VB.NET]

Private Sub btnGuardar_Click(sender As Object, e As EventArgs)
	'
	' Validaciones
	'
	Dim Id As Integer = 0
	If Not String.IsNullOrEmpty(txtId.Text) Then
		If Not Integer.TryParse(txtId.Text, Id) Then
			MessageBox.Show("El Id debe ser un valor numerico")
			Return
		End If
	End If

	If Exists(Id) Then
		Dim result As Boolean = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value)

		If result Then
			MessageBox.Show("El registro se ha actualizado correctamente.")
		End If
	Else
		Dim result As Boolean = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value)

		If result Then
			MessageBox.Show("El registro se ha insertado correctamente.")
		End If
	End If
End Sub

Private Function Update(id As Integer, nombre As String, direccion As String, fechaNacimiento As DateTime) As Boolean

       If Not ValidateForm() Then
           Return False
       End If

       Dim sql As String = "UPDATE Contactos SET " & _
                               "NombreCompleto = @Nombre" & _
                               ",Direccion = @Direccion" & _
                               ",[FechaNacimiento] = @FechaNacimiento " & _
                           "WHERE Id = @Id"


	Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

		Dim command As New SqlCommand(sql, conn)
		command.Parameters.AddWithValue("Id", id)
		command.Parameters.AddWithValue("Nombre", nombre)
		command.Parameters.AddWithValue("Direccion", direccion)
		command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento)

		conn.Open()

		Dim rowsAffected As Integer = command.ExecuteNonQuery()

		If rowsAffected > 0 Then
			Return True
		Else
			Return False

		End If
	End Using
End Function

4 – Eliminar registro


Eliminar un registro es una operación bastante simple, con solo proporcionar el identificador para definir la sección del WHERE en la sintaxis de eliminación es suficiente.

En el ejemplo se realiza una operación previa que valida que id exista, pero también se podría haber obviado esta validación utilizando el valor proporcionado por el usuario.

[C#]

private void btnEliminar_Click(object sender, EventArgs e)
{
    //
    // Validaciones
    //
    errProvider.SetError(txtId, "");

    int Id = 0;
    if (!int.TryParse(txtId.Text, out Id))
    {
        errProvider.SetError(txtId, "El Id debe ser un valor numerico");
        return;
    }

    if (!Exists(Id))
    {
        errProvider.SetError(txtId, "El Id ingresado no existe.");
        return;
    }

    //
    // Elimino contacto
    //
    bool result = Delete(Id);

    if (result)
    {
        MessageBox.Show("El registro se ha eliminado correctamente.");
        ClearControls();
    }
    
}

public bool Delete(int Id)
{
    string sql = @"DELETE FROM Contactos 
                   WHERE Id = @Id";


    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {

        SqlCommand command = new SqlCommand(sql, conn);
        command.Parameters.AddWithValue("Id", Id);

        conn.Open();

        int rowsAffected = command.ExecuteNonQuery();

        if (rowsAffected > 0)
            return true;
        else
            return false;

    }
}

[VB.NET]

Private Sub btnEliminar_Click(sender As Object, e As EventArgs)
	'
	' Validaciones
	'
	errProvider.SetError(txtId, "")

	Dim Id As Integer = 0
	If Not Integer.TryParse(txtId.Text, Id) Then
		errProvider.SetError(txtId, "El Id debe ser un valor numerico")
		Return
	End If

	If Not Exists(Id) Then
		errProvider.SetError(txtId, "El Id ingresado no existe.")
		Return
	End If

	'
	' Elimino contacto
	'
	Dim result As Boolean = Delete(Id)

	If result Then
		MessageBox.Show("El registro se ha eliminado correctamente.")
		ClearControls()
	End If

End Sub


Public Function Delete(Id As Integer) As Boolean
       Dim sql As String = "DELETE FROM Contactos " & _
                           "WHERE Id = @Id"


	Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())

		Dim command As New SqlCommand(sql, conn)
		command.Parameters.AddWithValue("Id", Id)

		conn.Open()

		Dim rowsAffected As Integer = command.ExecuteNonQuery()

		If rowsAffected > 0 Then
			Return True
		Else
			Return False

		End If
	End Using
End Function

Acerca de los ejemplos


Para poder ejecutar correctamente los ejemplo necesitar Visual Studio 2008 y Sql Server Express instalado y corriendo localmente.

 

[C#]
[VB.NET]

98 comentarios:

  1. Hola leandro, te felicito excelente ejemplo.

    ResponderEliminar
  2. Excelente Ejemplo Leandro!!!!!!!!
    Me sirvió mucho para aclarar dudas.
    Muchas Gracias.

    ResponderEliminar
  3. Saludos Leandro... Gracias por el ejemplo... Me podrias ayudar sino es mucha molestia con el codigo del ejemplo??? Un link para descargarlo??? Muchas gracias de antemano...

    ResponderEliminar
  4. hola Julio

    te refieres al ejemplo del articulo ? si es asi alli mismo al final del mismo estan las carpetas (de color amarillo) que te llevaran a la pagina de descarga

    saludos

    ResponderEliminar
  5. Muchas gracias, abri la pagina en otro navegador y pude ver las carpetitas... Gracias..

    ResponderEliminar
  6. Hola Leandro, disculpa nuevamente la molestia, tengo .NET 2010 no pasa lo que guardo a la base de SQL, me podrias ayudar con eso??? Me sale una advertencia: Warning 1 function 'Update' shadows an overloadable member declared in the base class 'Control'. If you want to overload the base method, this method must be declared 'Overloads'. C:\Users\Julio\Desktop\[vb.net] WinAdoNET\WinAdoNET\Contactos.vb 277 19 WinAdoNET
    Gracias y perdon por la molestia...

    ResponderEliminar
  7. hola julitocristiano

    disculpa la tardanza en la respuesta

    Te comento, no es grave el problema, pero no lo habia visto antes.

    Resulta que si sigues el arbol de herencia de un formularios ,este hereda de la clase Forms que a su vez hereda de ContainerControl, el cual lo hace de ScrollableControl y por ultimo este de Control.

    Resulta que este ultimo, o sea "Control" define el metodo Update(), usado para realizar un repintado, por lo tanto seria bueno si cambias el nombre de este metodo, para que no colisione con el existente.

    Por ahi usar un UpdateContacto(), con eso deberia alcanzar.


    saludos

    ResponderEliminar
  8. donde se declararon los parametros que esta utilizando @nombre por ejemplo

    ResponderEliminar
  9. donde se declaran los parametros @nombre, etc

    ResponderEliminar
  10. hola K-loca

    como veras en la query se declara algo como esto

    string sql = @"INSERT INTO Contactos (Id
    ,NombreCompleto
    ,Direccion
    ,FechaNacimiento)
    VALUES (@Id,
    @Nombre,
    @Direccion,
    @FechaNacimiento)";


    y el parametro luego esta debajo
    en el command cuando se haces

    command.Parameters.AddWithValue("Nombre", nombre);

    por ahi no queda claro pero si usas

    command.Parameters.AddWithValue("@Nombre", nombre);

    o sea poniendo el @ tambien es valido, poner o no el @ es opcional


    saludos

    ResponderEliminar
  11. lo que pasa es que modifique este metodo para una aplicacion
    mia
    Private Function Insert(nombre As String, direccion As String, fechaNacimiento As DateTime) As Boolean
    29.
    If Not ValidateForm() Then
    30.
    Return False
    31.
    End If
    32.

    33.
    Dim sql As String = "INSERT INTO Contactos (Id" & _
    34.
    ",NombreCompleto" & _
    35.
    ",Direccion" & _
    36.
    ",FechaNacimiento)" & _
    37.
    "VALUES (@Id, " & _
    38.
    "@Nombre, " & _
    39.
    "@Direccion, " & _
    40.
    "@FechaNacimiento)"
    41.

    42.

    43.
    Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
    44.
    Dim NextId As Integer = MaxId() + 1
    45.

    46.
    Dim command As New SqlCommand(sql, conn)
    47.
    command.Parameters.AddWithValue("Id", NextId)
    48.
    command.Parameters.AddWithValue("Nombre", nombre)
    49.
    command.Parameters.AddWithValue("Direccion", direccion)
    50.
    command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento)
    51.

    52.
    conn.Open()
    53.

    54.
    Dim rowsAffected As Integer = command.ExecuteNonQuery()
    55.

    56.
    If rowsAffected > 0 Then
    57.
    ClearControls()
    58.
    Return True
    59.
    Else
    60.
    Return False
    61.

    62.
    End If
    pero me dice que la variable escalar @RPIndirecto no ha sido declarada aunque yo deje su metodo igual colo cambie las variables de su ejemplo por las mias

    63.
    End Using
    64.

    65.
    End Function

    ResponderEliminar
  12. hola

    pero si has dejado el codigo tan cual lo pones aqui, no veo ningun campo o parametro de nombre: RPIndirecto

    es mas no veo escrito RPIndirecto por ninguna lado en ese codigo

    estas segura que es en ese codigo donde falla, no sera en otro sitio ?

    realiza una busqueda en el codigo para localizar donde usar la palabra "RPIndirecto" y ver si codigo pasa por alli cuando falla

    saludos

    ResponderEliminar
  13. Hola buenas tardes Leandro le escribo por que tengo un problema estoy trabajando con un datatagridView1 con comboboxcell.

    puede hacer que guardara lo que esta contenido en las columnas del datagrid a mi tabla en la BD , asi mismo segui un consejo que le dio a mi compañero de mandar a guardar las filas cada vez que se que se realiza un loop y lo hago de esta forma
    For Each row As DataGridViewRow In DataGridView1.Rows




    For Each col As DataGridViewColumn In DataGridView1.Columns

    Dim comboboxCell As DataGridViewComboBoxCell = TryCast(row.Cells(col.Index), DataGridViewComboBoxCell)
    ' Dim renglon As DataGridViewComboBoxCell = TryCast(row.Cells(row.Index), DataGridViewComboBoxCell)












    If comboboxCell.Selected Then





















    'For fila As Integer = row.Index To DataGridView1.SelectedRows.Count - 1


    ' For j = 0 To DataGridVie w1.Rows.GetLastRow(DataGridViewElementStates.Displayed)













    'result = Insertar_plan_Tratamiento(Me.TextBox2.Text, Me.TextBox1.Text, Me.TextBox3.Text, row.Cells(0).Value.ToString(), row.Cells(1).Value.ToString(), row.Cells(2).Value.ToString(), row.Cells(3).Value.ToString(), row.Cells(4).Value.ToString(), row.Cells(5).Value.ToString(), row.Cells(6).Value.ToString(), row.Cells(7).Value.ToString(), row.Cells(8).Value.ToString(), row.Cells(9).Value.ToString(), row.Cells(10).Value.ToString(), row.Cells(11).Value.ToString())
    result = Insertar_plan_Tratamiento(Me.TextBox2.Text, Me.TextBox1.Text, Me.TextBox3.Text, DataGridView1.Rows(0).Cells(0).Value.ToString(), DataGridView1.Rows(0).Cells(1).Value.ToString, DataGridView1.Rows(0).Cells(2).Value.ToString, DataGridView1.Rows(0).Cells(3).Value.ToString(), DataGridView1.Rows(0).Cells(4).Value.ToString, DataGridView1.Rows(0).Cells(5).Value.ToString, DataGridView1.Rows(0).Cells(6).Value.ToString, DataGridView1.Rows(0).Cells(7).Value.ToString, DataGridView1.Rows(0).Cells(8).Value.ToString, DataGridView1.Rows(0).Cells(9).Value.ToString, DataGridView1.Rows(0).Cells(10).Value.ToString, DataGridView1.Rows(0).Cells(11).Value.ToString())
    result = Insertar_plan_Tratamiento(Me.TextBox2.Text, Me.TextBox1.Text, Me.TextBox3.Text, DataGridView1.Rows(1).Cells(0).Value.ToString(), DataGridView1.Rows(1).Cells(1).Value.ToString, DataGridView1.Rows(1).Cells(2).Value.ToString, DataGridView1.Rows(0).Cells(3).Value.ToString(), DataGridView1.Rows(1).Cells(4).Value.ToString, DataGridView1.Rows(0).Cells(5).Value.ToString, DataGridView1.Rows(1).Cells(6).Value.ToString, DataGridView1.Rows(1).Cells(7).Value.ToString, DataGridView1.Rows(1).Cells(8).Value.ToString, DataGridView1.Rows(1).Cells(9).Value.ToString, DataGridView1.Rows(1).Cells(10).Value.ToString, DataGridView1.Rows(1).Cells(11).Value.ToString())
    el problema ahora es que algunas corridas result toma el valor de falso (y portanto no puedo guardar) aunque yo haya elejido esas filas y le mande a la bd su cadena de inserción se salta la operación y me manda al siguiente paso ¿Cual puede ser mi error? de antemano gracias











    If result1 Then
    If result Then



    MsgBox("Se ha registrado correctamente", MsgBoxStyle.Information, "RENDO")

    End If
    Else



    End If
    'Next

    End If



    Next


    Next
    'Next


    ' End If









    Catch

    End Try

    ResponderEliminar
  14. hola K-loca

    algo que noto no estar correcto es que haces un loop por las columans cuando no lo necesitas, solo deberias recorrer las filas y tomar de forma fija las columnas, como bien lo haces cuando usas
    Cells(0), Cells(1), etc, si haces esto porque usar un for de las columnas, justamente no lo necesitas

    ademas usas esto
    DataGridView1.Rows(0)
    o sea accedes simpre a la primer fila para tomar la info, cuando deberias usar

    row.Cells(0).Value.ToString(),
    row.Cells(1).Value.ToString(),
    etc

    de esta forma si cambias de fila por cada ciclo del for

    saludos

    ResponderEliminar
  15. Estimado Leandro,

    Antes que nada quería agradecer tu esfuerzo por compartir tus habilidades y experiencias con otros.

    Te quería consultar algo, a todas luces elemental, que sin embargo me tiene lleno de dudas. De tal manera que no solo se trata de "Copy & Paste" sin que hay que entender de que se trata.

    En la Función "Exists" en la sentencia de SQL se usa "Select Count(*) From Contactos WHERE Id = @Id" Mi pregunta es: ¿Porqué se usa el "Count"? Yo probé la función solo con el * y me funciona perfectamente.

    Sin duda su razón tendrá pero yo no lo he comprendido.

    Gracias de antemano

    ResponderEliminar
  16. Antes que nada, quisera expresarte mi agradecimiento por el notable esfuerzo que haces al compartir tus habilidades y experiencias con otros.

    Mi consulta, a todas luces elemental, es que en la función "Exists" usás la sentecia: ""SELECT COUNT(*) FROM Contactos WHERE Id = @Id" Pregunto: ¿Porqué se usa el "Count(*)"? Yo la usé "SELECT * FROM Contactos WHERE Id = @Id" e igual me funcionó sin problemas. Gracias de antemano por todo.

    ResponderEliminar
  17. hola rvaldez

    En el metoso Exist() uso el COUNT porque necesito que me devuelva la cantidad de coincidencia que hay con respecto al filtro definodo en el WHERE

    habras notado que esa funcion hace uso del ExecuteScalar() para recuperar el valor, bien esta lo que hace es tomar el valor del primer registro y la primer columna de la consulta

    Si en ti caso da la casualidad que justo en la primer fila y primer columna se devuelve un valor numerico entonces tomara ese como resultado

    quizas me equivoque pero la priemr columna de tu tabla no sera un id o codigo ? porque si es asi puede que funcione porque esta tomando ese valor numerico, pero no esta correcto, funciono pero de casualidad, no porque lo hace de forma correcta

    recuerda que el Existe no siempre tiene que devolver un cero o uno, podrias el filtro devolver 0 o un valor distinto como ser 3 o mas, por dar un numero, en este caso no se usa pero se podria necesitar devolver la cantidad de coincidencias

    saludos

    ResponderEliminar
  18. ola amigo solo una cosa lo que pasa que yo tengo una base de datos de rentas de carros es una tarea y el profe me dijo que para no meter la informacio directo en la bd tengo que hacer un programa en c# y yo no se no me podrias ayudar que dices si quieres te mando la bd que tengo y la checas para que veas como funciona

    ResponderEliminar
  19. hola eliut

    pero si tu profesor te asigno la tarea de realizar un desarrollo en c#, la idea, no es que aprendas a programar en este lenguaje ?

    se que recien te inicias y parace todo complejo, pero digo el profesor no aporto material o alguna explicacion del tema, solo te dio la orden de desarollarlo y eso es todos

    desde mi lugar puedo darte consejos y material, pero no es mi ideologia realizar la tarea o desarrollo de otras personas, me gusta que aprendan el lenguaje que yo mismo uso todos los dias, y si hace falta proporcionar algun tip o camino a seguir

    quizas deberias plantearle la situacion al profesor y que te recomiende material para empezar a aprender, o que se ponga las pilas y enseñe a programar

    saludos

    ResponderEliminar
  20. si mira lo que pasa que el profesor si nos dijo como utilizar el workbens mas o menos y nos dijo que que hicieramos un proyecto de hacer una base de datos en ese programa pero despues nos dijo que hicieramos aplicacion en cualquier otro lenguaje como ya te dije c# algo asi entonces el detalle es que yo casi en c# casi no lo del programa en worbens ya lo tengo mi base pero las alicaciones no las tengo y no se como hacerlo pero nos dijo que la clase es baase de datos y el no los va a ensenar a programar y ahy es donde patino

    ResponderEliminar
  21. hola eliut

    hay algunas partes que no quedaron claras

    - que es workbens? es la base que usas o es el administador de la db
    algo como ser
    MySQL Workbench

    menciona que base estas usando


    - cuando mencionas "nos dijo que la clase es baase de datos" a que clases haces referencias ?
    seran las de ado.net para conectarte a la db y recuperar la informacion

    saludos

    saludos

    ResponderEliminar
  22. si mira yo tengo un manejador que se llama workbench de mysql en tonces yo ya tengo la informacion en workbench si ahora el profesor me dijo que hay que hacer las aplicaciones para que? bueno paara meter informacion capturar o hace una consultas como en c# u otro lenguaje de programaciony no se mucho de la programada claro con un poco de ayuda termino el proyecto y ademas aprendo eso ya con una sola ves que me digan lo pongo en practica y despues ya no se me dificulta mucho no se si me puedas ayudar que dices si no te quedo claro pos preguntame yo casi de esto no le se mucho pero aprendo rapido

    ResponderEliminar
  23. Hola leandro...necesito de tu ayuda...quiero que el usuario meta el id...pero si introduce un id que ya esta en uso que mande un mensaje...tengo una idea no muy concreta como lo hace con el metodo Exists en los ejemplos...me puedes poner como seria? gracias ;)

    ResponderEliminar
  24. hola lfmluis

    el tema es que como detectarias si es un insert o un update ?

    la tecnica usada en el Exists() te es util tambien para validar

    pero deberas buscarle una vuelta a la forma de conocer si estas en un insert o update

    saludos

    ResponderEliminar
  25. Gracias por responder, estaria usando un INSERT...como lo hago??

    ResponderEliminar
  26. hola lfmluis

    no veo que tienes que ver el uso del INSERT con la validacion de la existencia del id ingresado por el usuario

    o es que usa un id autonumerico ?

    saludos

    ResponderEliminar
  27. Hola Leandro quisiera que me ayudes con esto. Necesito crear unos botones de forma dinamica al monento que el formulario esta en ejecucion y cuando otro usuario levante este formulario pueda visualizar el boton creado en la misma posicion, el lenguaje de programacion es .Net 2008. gracias por la respuesta

    ResponderEliminar
  28. hola Cleider

    podrias guardar en uan base de datos la posocion del control en el formulario, o sea guardarias los puntos X e Y de la propiedad Location del control

    entonces cuando se ejecuta el forma recuperas esta info de la tabla de la db y al crear el control puede asignar la localizacion del mismo mediante esta coordenada


    saludos

    ResponderEliminar
  29. gracias por los ejemplos.. pero tengo un problema hice 2 tablas en la base de datos en la primera configure todo altas, bajas y modificaciones pero en la segunda solo puedo dar de alta y a la hora de dar de baja me da error en la función obtener() cuando busco por id me da un error en esta linea
    Dim reader As SqlDataReader = command.ExecuteReader()

    el error dice esto
    System.Data.SqlClient.SqlException was unhandled
    Class=16
    ErrorCode=-2146232060
    LineNumber=1
    Message=Invalid column name 'IDUsuario'..........

    ResponderEliminar
  30. hola Makaveli

    no se que query estaras ejecutando pero el error esta mas que claro

    el campo IDUsuario no existe en la tabla que estas consultando

    valida que este campo exista en la tabla

    saludos

    ResponderEliminar
  31. Gracias!! ya lo solucione el IDUsuario si existe
    lo unico que cambie fue el codigo este
    Dim sql As String = "SELECT IDUsuario,NombreUsuario,ApellidosUsuario FROM Users WHERE IDUsuarios = '" & IDUsuariotxt.Text & "'"
    todo lo demas lo deje igual, no se porque en esta tabla no me funciono la otra linea de select.
    pero muchas gracias por tu ayudaaa!!!

    ResponderEliminar
  32. Hola Leandro

    Tengo un problema el cual es el siguiente:
    Quisiera insertar datos a una bd acces pero tomando como filtro o referencia el valor que contenga un TexBox. Es decir algo asi; "INSERT.. VALUES.. WHERE idpagos = '" & TextBox1 & "'" entiendo que una instrucción asi no funcionaria pero la pongo asi para referirme a lo que quiero lograr. El valor que tiene el TextBox es el id al que quiero que se inserten los datos. Como prodria resolver este problema?
    Espero que puedas ayudarme de antemano muchas gracias

    ResponderEliminar
  33. hola

    podria ser algo como

    DataTable dt = new DataTable();

    using (SqlConnection cnn = new SqlConnection("connection string")) {

    string query = "SELECT * FROM NombreTabla WHERE campo = @param";
    SqlCommand cmd = new SqlCommand(query, cnn);
    cmd.Parameters.AddWithValue("@param", TextBox1.Text);

    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);

    }

    la idea es que uses parametros y el resultado en este caso se vuelva a un datatable
    saludos

    ResponderEliminar
  34. Hola

    Este es el codigo del boton con el inserto los datos:

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    If dgvSeleccion.Rows.Count > 0 Then
    Dim SqlString As String = "" ' variable a la que asignaremos la sentencia
    Dim ListSqlStrings As New ArrayList 'arregla donde ingresaremos las sentencias
    'recorremos el datagrid como ya sabemos siempre se toma desde cero

    For i As Integer = 0 To dgvSeleccion.Rows.Count - 1
    'creamos la sentencia el row siempre tendra el valor de i para ir pasando de row en row

    SqlString = "INSERT INTO pagos VALUES ('" + dgvSeleccion.Rows(i).Cells(1).Value.ToString() + "','" + dgvSeleccion.Rows(i).Cells(2).Value.ToString() + "')"
    'agregamos la sentencia a la lista
    ListSqlStrings.Add(SqlString)
    Next
    If EjecutarTransaccion(ListSqlStrings) Then
    MessageBox.Show("Info. guardada correctamente")
    'Close()
    Else
    MessageBox.Show("La Info. no se guardo")
    End If
    Else
    MessageBox.Show("No hay informacion para guardar")
    End If

    ResponderEliminar
  35. Olvide mencionar que el valor que tiene el TextBox lo filtro de otro formulario (Form1), nose si esto afectara con respecto a lo que quiero lograr.

    Lo filtro con este codigo

    Private Sub Form2_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

    Dim value As Object = m_row.Cells(0).Value
    If (value IsNot DBNull.Value) Then
    TextBox1.Text = CStr(value)
    End If

    End Sub

    ResponderEliminar
  36. hola radx

    me pregunto, de casualidad este articulo lo has analizado o visto el codigo, porque la verdad no puedo creer que analizando al menos este post plantees usar un codigo concatenendo el string para armar el INSERT, en lugar de usar parametros

    el que el valor provenga de otro formulario puede influir y mucho si es que no se accede a la instancia correcta del formulario, pro es raro porque en el codigo que proporcionas no se nota la referencia a ningun otro form

    saludos

    ResponderEliminar
  37. Hola que tal Leandro.

    Soy nuevo en C# y traer leer tus ejemplos hay muchas cosas que no logro entender. Mira tengo un form en el cual tengo varios textbox y un boton que quiero que al picarle guarde en la base de datos de SQL lo que contengan esos Textbox por lo que tomando tu codigo lo modifique para que "funcionara" con mi base de datos :D pero me manda varios errores espero puedas revisarlo, ya realice la conexion con el Visual Studio a la Base de datos.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
    public partial class Form2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

    bool result = Insert(txtrazon.Text, txtcontacto.Text, txtdireccion.Text, txtciudad.Text, txtrfc.Text, txtcorreo.Text, txttelefono.Text, txtnotas.Text);

    if (result)
    MessageBox.Show("El registro se ha insertado correctamente.");


    private bool Insert(string razon, string contacto, string direccion, string ciudad, string rfc, string correo, string telefono, string notas);
    {
    string sql = @"INSERT INTO DatosCliente (razonsocial,contacto,direccion,ciudad,frc,correo,telefono,notas) VALUES (@razon,@contacto,@direccion,@ciudad,@rfc,@correo,@telefono,@notas)";

    using (SqlConnection conn = newSqlConnection(ConfigurationManager.ConnectionStrings["BasedeDatosConnectionString"].ToString()))

    private void txtrazon_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtcontacto_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtdireccion_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtciudad_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtrfc_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtcorreo_TextChanged(object sender, EventArgs e)
    {

    }

    private void txttelefono_TextChanged(object sender, EventArgs e)
    {

    }

    private void txtnotas_TextChanged(object sender, EventArgs e)
    {

    }
    }


    }
    }
    }

    ResponderEliminar
  38. hola Ivan

    pero donde defines los parametros ? es mas donde ejecutas el codigo

    quizas no se pego de forma correcta el codigo, es que en los blog es dificil poner codigo

    porque no haces la pregunta en el foro

    Msdn Foro C#

    alli si se puede poner codigo de forma correcta

    saludos

    ResponderEliminar
  39. hola quisiera saber como hacer una conexión de mi base de datos que esta en sql 2008 con mi interfaz que esta en visual basic 2010, ayuda porfavor.. :D

    ResponderEliminar
  40. hola helca

    no entendi de que tipo de interfaz hablas ?

    porque no usas como se plantea en el articulo las clases de ado.net?

    saludos

    ResponderEliminar
  41. Buenas,en primer lugar darte las gracias por tu pedazo de trabajo. Estoy haciendo un programa de gestión en el que tengo el apartado Clientes y Presupuestos. En el apartado Clientes tiene columnas llamadas Nombre, dirección... Mi duda es: ¿Tengo que "buscar" siempre? Es decir, yo lo que quiero es que al pulsar el botón añadir se abra una ventana y los textbox que tengo ahí, se pasen a una columna de la base de datos. Resumidamente, que en la ventana de añadir, lo que escriba en Nombre, dirección... se pase a la Base de datos y me cree un nuevo cliente. Cómo tendría que hacerlo, solo mirando la parte de "Añadir registro"? Estoy haciendo esto como favor personal, nunca trabajé en VB.net así que tengo un lio mental importante... jaja Gracias, espero tu respuesta.

    ResponderEliminar
  42. hola Dylan

    no necesitas realizar una busqueda de algo existente, si escribes solamente los datos sin ingresdar un id lo que hara es que ingresara por el INSERT para crear el registro

    solo buscas cuando quieres actualizar algo existente, sino solo completas los otros campos y eso creara el registro, por eso esta el metod Exists() para comprobar que operacion debe realizar

    saludos

    ResponderEliminar
  43. Hola Leandro he leido bastante aportes tuyos y me han servido mucho y te lo agradesco, ahora tengo una duda tengo una BD de 42 tablas app. lo que quiero hacer es cuando exista un codigo de un producto este me lo actualice (la cantidad solamente, es decir si ya tenia 100 productos en la BD y ahora me llegaron 40 mas del mismo que me los sume es decir 140 ahora), si no esta el producto (código)que me agregue un nuevo producto a la BD.
    no se si me explique bien saludos...

    ResponderEliminar
  44. hola

    quieres actualizar el stock del producto, o sea hacer un update como ser

    UPDATE nombretabla SET stock = stock + @cantidad WHERE id = @idproducto

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/f3e4b4cd-b099-4a14-bc54-dcdf08864f2f

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/13de9741-5456-412d-8a44-e8c5d6650bf9

    lo ejecutas como en los links, solo que en tu caso sumas

    saludos

    ResponderEliminar
  45. Buen dia Leandro, estoy haciendo una consulta a una bd en sql, donde necesito saber si existe un id, pero el id de la tabla lo tengo como varchar, es un numero de 12 caracteres, entonces estado tratando de convertir a un string como lo haces en tu ejemplo, pero tu lo haces con ID que es de tipo entero, me marca errores en la conversion por que le mando un string como parametro y me marca error en el COUNT(*) por que el ID que requiere es un valor escalar. Es en una pagina web de asp, talvez me puedas ayudar en eso, o si debo de cambiar mi id a otro tipo de valor, pero es de un numero de 12 caracteres. Saludos!!

    ResponderEliminar
  46. hola

    el Count() no aplaica sobre ningun campo en particular, por eso es count(*) este solo cuenta registros

    si el campo id es varchar solo definelo en el WHERE como filtro de busqueda pasandole un string al parametro

    pero el count() va a seguir devolviendo un valor numerico que representa el nro de filas que retornar la query

    saludos

    ResponderEliminar
  47. protected void Button1_Click(object sender, EventArgs e)
    {

    string var = BOX1.Text;

    Msg.Text = var;


    if (!Exists(var))
    {
    Msg.Text = var + " : " + " El RPU no existe. ";
    return;
    }

    Obtener(var);

    }

    private void Obtener(string var)
    {
    string sql = @"SELECT ID_RPU, RPU FROM RPU WHERE ID_RPU = @var";

    using (SqlConnection conn= new SqlConnection(ConfigurationManager.ConnectionStrings["contratosConnectionString"].ToString()))
    {
    SqlCommand command = new SqlCommand(sql, conn);
    command.Parameters.AddWithValue("ID_RPU", var);

    conn.Open();
    SqlDataReader reader = command.ExecuteReader();

    if (reader.Read())
    {
    BOXAREA.Text = Convert.ToString(reader["RPU"]);

    }

    }

    }


    private bool Exists(string var)
    {
    string sql= @"SELECT COUNT(*) FROM RPU WHERE ID_RPU= @var";

    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["contratosConnectionString"].ToString()))
    {
    SqlCommand command = new SqlCommand(sql, conn);
    command.Parameters.AddWithValue("ID_RPU", var);

    conn.Open();

    int count = Convert.ToInt32(command.ExecuteScalar());

    if (count == 0)
    return false;

    else
    return true;
    }
    }



    y cuando le doy clik al boton me manda el siguiente error;

    Debe declarar la variable escalar "@ var".

    ResponderEliminar
  48. hola Anonymous

    claro porque aqui
    string sql= @"SELECT COUNT(*) FROM RPU WHERE ID_RPU= @var";

    defines el parametro como @var

    entonces lo correcto seria

    command.Parameters.AddWithValue("@var", var);

    defines el mismo nombre en ambos sitios

    saludos

    ResponderEliminar
  49. Ya funciono como me dijiste que lo corrigiera, muchas gracias Leandro, estan muy bien hechos tus tutoriales, me han servido de mucho, ojala sigas aportando mas de tus conocimientos, y tambien me quede con una duda, por que tiene que ser del mismo nombre la variable que se declara con el nombre de la columna de la tabla??? Saludos desde mexico.

    ResponderEliminar
  50. hola Anonymous

    te refieres al 2var con el var ?

    no es necesario que sean iguales puedes cambiarlo, puedes poner

    string sql= @"SELECT COUNT(*) FROM RPU WHERE ID_RPU= @idrpu";

    y luego

    command.Parameters.AddWithValue("@idrpu", var);

    saludos

    ResponderEliminar
  51. Hola estoy empezando a desarrollar en C# y kisiera saber si alguin pudiera pasarme un ejemplo de conexion a sql por medio de la ip del servidor

    ResponderEliminar
  52. hola Luis

    en este articulo

    http://www.connectionstrings.com/sql-server-2008

    se encuentran ejemplo de como armar una connection string usando el ip de la pc remota

    saludos

    ResponderEliminar
  53. Hola Leandro
    Tengo un problema de conexion de base de datos access 2010 a Visual Basic Express 2010 al momento de agregar registros nuevos me indica que no es posible debido a falla de conexion !ESPERO ME PUEDAS AYUDAR
    GRACIAS POR TU ATENCION¡¡¡¡¡

    ResponderEliminar
  54. hola FRANKDIVANE

    de casualidad estas utilizando una pc de 64bits ? lo pregunto porque se que hay problemas con ms access y las pc con 64bits

    cual es el mensaje de error que recibes ? podrias poner un try..catch para capturarlo

    saludos

    ResponderEliminar
  55. ola leandro lo que pasa es q queria saber si me podrias audar con una duda en visual basic 2008 es sobre como hago para que en un formulario cuando en un textbox escriba y despues le de guardar lo guarde en una base de datos y ala ves que si lo quiero imprimir el formulario pueda imprimirlo

    ResponderEliminar
  56. hola Andrea

    responder lo que planteas seria muy largo, lo que me pregunto es conoces sobre ado.net ? porque si sabes de este podrias guardar el registro
    ademas ni siquiera mencionaste de que base estas usando

    para imprimirlo podrias crear un reporte en crystal reports o reporting service

    saludos

    ResponderEliminar
  57. ola leandro mira estoy utilisando access 2010 y visual basic 2008 pero se poco sobre programacion lo que quiero hacer es una aplicacion para mi consultorio que este en dos pc una en rececion y otro en mi consultorio lo que quiero es que cuando llegue un paciente y receciion tomen los datos hay mismo cuando valla entrar a mi consultosio se actualise la base de datos y yo abra la aplicacion y despues el formulario y ya este actualizado con los datos solo faltaria llenar los espacion de la consulta y despues guardarlos y cerrarlo y despues cuando quiera abrirlo yo pueda abrirlo con ell nombre del paciente o algo asi y me abra la historia de elquiero saver como hacerlo
    pues yo ya ise una aplicacion que guarda datos pero muy baasicos y para solo un pc y nose como abrilos dactos ni como conectar dos pc ala misma base de datos me podrias ayudar leandro te lo agardeceriade todo corazon

    ResponderEliminar
  58. hola Andrea

    si la idea es tener una db centralizada con Access te equivocaste, si bien se puede poner la db en una carpeta comparida de una de las PCs no es un camino muy bueno

    lo idea es que uses una db como ser sql server el cual si esta pensado para este tipo de escenarios

    saludos

    ResponderEliminar
  59. sii tengo sql server leandro pero quisiera que si me podrias explicar mas como podria crear el programa que te dije ya como te abia dicho no tengo mucho conocimiento aver si me podrias ayudar a crearla dandome un poco de ayuda quiero saver que proyectos debo utilizar en visual basic ala hora de aser mi aplicacion como hago para hacer el formulario cuando lo llene con la historia del paciente se guarde y ala vez cuando quiera abrirlo lo busque con su numero de documento de identida y me abra el formulario del pasiente ya contodo lo que lo abia guardado y como hago para conectar los dos PCs porfa leandro me podrias ayudar te agradeceriaa mucho leandro

    ResponderEliminar
  60. hola Andrea

    podrias hacer algo como esto

    [WinForms] Edición Empleados – Grabar imagen en base de datos

    como veras alli se hace uso de ado.net para recuperar los datos
    lo que no mencionas es cuanto conoces sobre ado.net porque deberias estudiar sobre este para poder acceder a sql server y trabajar con los datos

    en el ejemplo se hace uso de un mdf local, pero solo es cuestion de cambiar el connection string que esta en el app.config para apuntar a un sql server que instales en otra pc

    http://www.connectionstrings.com/sql-server-2008

    saludos

    ResponderEliminar
  61. muchas gracias leandro una pregunta que proyectos devo utlisar en visual basic 2008 y sera que puedo aser una base mde datos en access y pasarla a sql server

    ResponderEliminar
  62. mira que pena molestarte tanto disculpame pero quisera saver cual proyectos utlizo o cuales windows form la verda lamaplicacion es muy sencilla ya q me consultorio consta solo de dos personas yo y mi asistente porfa me podrias ayudar

    ResponderEliminar
  63. hola Andrea

    el proyecto que usarias sera un windows Application y si quieres seguir el ejemplo del link tambien un class library

    aunque quizas como recomendacion diria que le dediques un poco a la lectura de programacion sino va a ser dificil seguir, sino sera como querer aprender a tocar el piano si saber que es una nota, aqui es lo mismo

    http://social.msdn.microsoft.com/Forums/en-US/vbes/thread/c0c910c7-316f-4c4f-9d02-09ecc3b36d9b

    en el link menciono un ebook online que podria ser util

    saludos

    ResponderEliminar
  64. leandro muchas gracias por responderme todas mis dudas leandro una ultima tengo esque como estoy creando mi formulario para consultorio en una parte me toca crear un odontograma es este loque pasa es que me toca crearlo porque es parte de mi trabajo va asosiado con el odontograma y no e podido crearlo lo que pasa es que el representa el diente de una persona y cada diente tiene varios caras como esta en la imagen lo que quiero es poner esa imagen y en mi formulario y cada cara avenes toca ponerle un color (rojo,naranja,negro,amarillo )
    quisiera saber si me podrias ayudar a crearlo de programacion estoy aprendiendo poco a poco pero es que ese odontograma lo nesecito urgente porfa leandro ayudame plisss te lo agradeceriaa muchooo

    ResponderEliminar
  65. este es el link del odontograma http://190.242.36.221/helponline/manuales_robohelp/manual_de_usuario_hc_odontologica_v1.0/Odontograma.htm me ayudaria mucho que pudieras ayudar a crear un odontograma asi para colorear cada cara de un diente

    ResponderEliminar
  66. hola andrea

    no se si visualmente vas a poder obtener lo mismo que la imagen, pero usando controles picturebox podrias ubicarlos para lograr algo como esto

    http://www.odontosys.com/ayuda/imagenes/odontograma.png

    podrias tambien poner un solo picturebox y despues tener imagen basica a la cual dinamicamente le pintas una seccion desde codigo usando GDI

    pero vas a tener que estudiar algo de GDI para poder trabjar con al imagen


    GDI+ Regions and Clipping in VB.NET


    como veras con gdi puede tomar una imagen y pintarla donde encesites segun las opcioens que te marcaron para es diente

    saludos

    ResponderEliminar
  67. ola leandrom lo que pasa mira ya encontre algo y lo descargue para acomo darlo ami modo pero como tu me dices GDI+ ya intente por ese medio pero yo tengo visual basic 2008 express edition ya intente con pinturebox pero quiero saver como poder introducir un solo color en varias zonas de la imagen como descojer la el color que quiero ya tengo algo pero solo meda dos colores y me muestra solo catro dientes lo intente modificar fue un aporte que me isieron pero no pude no me deja nesecito ayuda urgente leandro quisiera que me ayudaras aver como hago para descgargar o agregar GDI+ a visual basic 2008 exprees edtion ya que no esta inculido ahi

    ResponderEliminar
  68. ademas leandro es que loque que pasa es que es para mi consultorio yo no quiero ponerme a crear programas basicamente quiero solo crear mi programa para no tener que estar atendiendo pacientes con hojas de papel ya que al archivar es un problema ayudame porfa

    ResponderEliminar
  69. hola Andrea

    en realidad no creo que el camino sea pintar una zona de una imagen sino que debes dibujar la imagen

    CAPÍTULO II: Creando objetos Graphics, Pen y Font, y manejando las estructuras Pens y Color.

    CAPÍTULO III: FORMAS BÁSICAS GDI+

    o sea una imagen de base con al forma del diente puedes teenrla, pero depsues abres esa imagen y creas una copia para poder dibujar en ella quizas un rectangulo de un determinado color y lo ubicas en tal posicion y esa imagen representa una determinada opcion

    tendris una imagen base donde por gdi le dibujas el resto segun la opcion que este definida para ese diente

    intenta dibujar formas simples, como ser rectangulos o circulos y le aplcias color

    saludos

    ResponderEliminar
  70. ola leandro ya pude crear un poligono y dos label, los label para rojo y azul y el poligono es como el q me mostraste en la imagen quisiera saber si me podrias aser el grandet favor de ayudarme con el codigo para cuando de clic en cada cada cara del diente me de opciones de pintarlo es q cuando le doy clic ala cara del diente se le doy ala cara del centro me aparese esto "middle polygon" o al lado derecho left polygon al lado izquierdo right polygon la cara de abajo bottom polygon y la de arriba top polygon dime cuales herramientas implementar y que codigo utlizar para poder que cuando le de clic me salga la opcion de pintar el diente bien sea sano cariado o dañado

    ResponderEliminar
  71. hola Andrea

    esta parte que quieres implementar no es simple porque en si un picturebox no define zonas sensibles donde puedas interactuar, quizas usando la posicion del mouse donde hace un click o mejor un MouseDown podrias

    quizas lo mas directo seria que selecciones un picturebox (el cual representa el diente), luego con botones definir la posicion y estado de esa parte del diente para armar la imagen que corresponde a esa opcion seleccionada

    saludos

    ResponderEliminar
  72. ola leandro me podrias explicarmas muchas gracias

    ResponderEliminar
  73. Hola leandro, he creado una pregunta en el foro de msdn a mi consulta pero aun no la soluciono, he seguido tus pasos definiendo mi cadena de conexion en el app.config y la llamo siguiendo tu ejemplo pero me arroja el error Referencia a objeto no establecida como instancia de un objeto.

    y si hago el insert de esta manera

    Dim connectionString As String = "Data Source=ALVARO-PC\SQL2008ALVARO;Initial Catalog=database1;User ID=sa;Password=asdf1234;"
    Using conn As New SqlConnection(connectionString)

    en la funcion insertar, me inserta sin problemas, en que estare fallando?
    saludos

    ResponderEliminar
  74. hola descargas

    este problrema se presenta cuando eejcutas desde el VS o es cuando llevas la aplicaicon a la pc del cliente?

    porque deberias validar que este el .config junto al .exe

    el error que obtienes es porque no puede recuperar la key que defines en la config, valida que tenga el mismo nombre, recuerda que es keysensitive

    saludos

    ResponderEliminar
  75. Hola buenas noches leandro un placer saludar estoy agradecidopor este codigo y tutorial que has brindado me ha tocado leer bastante por las funciones que usas y la manera de progrmar que tienes es demasiado linda, mira te tengo una consulta, por que no puedo usar using end using
    para permitir la conexion a la base de datos siempre me dice que hay un error y apunta en la variable conn.open
    me ha tocado crear un modulo de conexion y estas haciendo
    If con.State = ConnectionState.Open Then
    con.Close()

    End If
    con.Open()
    no se si es que hay algo en espesifico que hacer , asi lo hago yo:
    using conn as new sqlconeccion("la cadenas")

    conn.open

    y por ultimo el
    end using.
    ha y tambien algo no entiendo lo del validate form. De antemano te agradesco por todo y espero me puedas ayudar si no hes molestia.

    ResponderEliminar
  76. hola Josue

    pero cual es el error que recibes ? porque no lo has mencionado
    quizas sea un tema con el connectionstring

    en el evento Validating que seria lo que no se entiende?

    saludos

    ResponderEliminar
  77. Leandro lo que no entiendo que es lo que en si hace el validate form. osea ahi dice que retorna false pero para que sirve ese falta, para que es que lo utilizas.

    ResponderEliminar
  78. hola Josue

    analizaste el codigo del metodo Insert() ? es alli donde se utiliza

    basicamente une en una sola funciona las validaciones de nombre y direccion, asi no se invoca una y liuego la otra, si ambas pasan entonces ValidateForm() pasa como valido y se puede continuar con el INSERT

    Validation in Windows Forms

    tambien se podria haber implementado algo como en el articulo, o sea invocar al ValidateChildren() para que este ejecutetodos los evento Validating() y los aplique dejando continuar o no

    saludos

    ResponderEliminar
  79. Como puedo evitar que me guarde datos duplicados, no entendi bien esa parte. Que código debo de utilizar para evitar ese tipo de problemas.
    Estoy trabajando en VS 2010 csharp con Entity Framework.
    Gracias.

    ResponderEliminar
  80. hola Omar

    pero en este articulo no estos usando Entity Framework, estos usando ado.net simple, por eso me suena raro que uses este ejemplo de base

    la tecnica es similar deberias validar usando una query de linq si el campo id o alguno que no quieras que se duplique existe o no en la tabla

    cas a usar el Count() de linq para saber si existe algun registro para el filtro que definas, si existe entonces no deberias realizar la operacion de SaveChanges()

    saludos

    ResponderEliminar
  81. Hola Leandro, primeramente muchas gracias por compartir tus conocimientos son de gran ayuda, y segundo tengo un problema seguí tu ejemplo para insertar un nuevo registro en la base de datos, me funciona mientras la aplicación siga en funcionamiento los datos nuevos me aparecen pero al cerrar la aplicación y volverla a abrir ya no están los nuevos datos.

    Esta es la parte de mi codigo:
    int cero = 0;
    String consulta = "INSERT INTO T_Productos (Codigo, Descripcion, Costo, Precio, Existencia_Bodega, Existencia_Piso) VALUES(?, ?, ?, ?, ?, ?)";
    OleDbCommand sql = new OleDbCommand(consulta, conexion);
    sql.Parameters.AddWithValue("Codigo", cod);
    sql.Parameters.AddWithValue("Descripcion", descripcion);
    sql.Parameters.AddWithValue("Costo", costo);
    sql.Parameters.AddWithValue("Precio", precio);
    sql.Parameters.AddWithValue("Existencia_Bodega", cero);
    sql.Parameters.AddWithValue("Existencia_Piso", cero);
    conexion.Open();
    int ColumnaAfectada = sql.ExecuteNonQuery();
    conexion.Close();

    ResponderEliminar
  82. Se me paso comentarte que uso una base de datos en access

    ResponderEliminar
  83. Muchas gracias Leandro me funciono, saludos

    ResponderEliminar
  84. Saludos a todos .... porque no puedo descargar la aplicacion osea que no se le puede dar clic agradeciera y me la subiera o enviar a mi correo josuecybershop@yahoo.coom

    ResponderEliminar
  85. hola Josue

    ya edite el post y subi el ejemplo de codigo para que puedas descargarlo

    saludos

    ResponderEliminar
  86. Hola Leandro buenas noches, quisiera que me regalaras un claro ejemplo de como puedo hacer un programa que necesito para cobrar un servicio publico(es que no se ni por donde empezar y tu que eres un experto en el tema se que me guiara correctamente.

    saludos,

    Demecio Gómez Fuentes

    ResponderEliminar
  87. hola Demecio

    la verdad no se que tipo de ejemplo claro podria darte con tan poca especificacion

    ademas tampoco comentas que tanta experiencia tienes en desarrollo, quizas deberias antes capacitarte un poco

    tampoco queda claro si la aplicaicon va a ser desktop o web, si vas a usar ado.net o un orm, etc

    saludos

    ResponderEliminar
  88. Hola Leandro, y si quiero hacer eso con una base de datos de access, ¿Como seria?

    ResponderEliminar
  89. hola y dime si es que lo pongo en un procedimiento como lo llamaria
    Public Sub INSERTAR(ByVal CNN As SqlClient.SqlConnection, ByVal bandera As Boolean)
    Dim comando As SqlClient.SqlCommand
    Dim parametro As SqlClient.SqlParameter
    comando = New SqlClient.SqlCommand
    comando.Connection = CNN
    comando.CommandType = CommandType.StoredProcedure
    If bandera = True Then
    comando.CommandText = "sp_Cargo_insertar"
    Else
    comando.CommandText = "sp_Cargo_actualizar"
    End If
    parametro = comando.Parameters.Add("@Id_Cargo", SqlDbType.VarChar, 8)
    parametro.Value = Me.Id_Cargo
    parametro = comando.Parameters.Add("@DescCargo", SqlDbType.VarChar, 50)
    parametro.Value = Me.DescCargo
    comando.ExecuteNonQuery()
    End Sub

    ResponderEliminar
  90. hola jauregui

    el codigo que defines para invocar al procedure esta correcto

    aunque no definiria un metodo de nombre INSERT() cuando dentro este realiza un insert o update, crea dos metodos diferentes, porque al insertar seguramente el parametro del id sea un output (o sea no asignas ninguna valor, sino que esperas la respuesta) y en el update sea un input, la direccion del parametro cambia en cada operacion

    saludos

    ResponderEliminar
  91. hola necesito ayuda es una base de datos el cual quiero que reconosca cuando se petita un usuario me marca error en mi n = cmd.ExecuteNonQuery()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If TextBox1.Text = "" Then
    MsgBox("Todos los campos tienen que estar llenos")
    ElseIf TextBox2.Text = "" Then
    MsgBox("Todos los campos tienen que estar llenos")
    ElseIf TextBox3.Text = "" Then
    MsgBox("Todos los campos tienen que estar llenos")
    ElseIf TextBox4.Text = "" Then
    MsgBox("Todos los campos tienen que estar llenos")

    Else
    Dim n As Integer
    Dim c As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Maquinas.accdb")
    Dim cmd As New OleDb.OleDbCommand("INSERT INTO Usuario VALUES('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "')", conex)

    cmd.Connection = c
    cmd.Parameters.AddWithValue("@Usuario", TextBox1.Text)
    cmd.Parameters.AddWithValue("@Nombre", TextBox2.Text)
    cmd.Parameters.AddWithValue("@Contraseña", TextBox3.Text)
    cmd.Parameters.AddWithValue("@Repetir contraseña", TextBox4.Text)
    c.Open()



    Dim cmdo As New OleDb.OleDbCommand("SELECT Usuario FROM Usuario= " & (TextBox1.Text) & "'", conex)

    n = cmd.ExecuteNonQuery()
    MessageBox.Show("Guardando Datos..!! ", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    If n = 1 Then
    Else
    MsgBox("El Usuario ya existe", MsgBoxStyle.Critical, "Advertencia")
    Return
    c.Close()

    End If
    End If

    End Sub

    ResponderEliminar
    Respuestas
    1. hola

      tu codigo deberia ser como el siguiente

      Using c As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Maquinas.accdb")
      c.Open()

      Dim cmdo As New OleDb.OleDbCommand("SELECT COUNT(*) FROM Usuario= @Usuario", conex)
      cmdo.Parameters.AddWithValue("@Usuario", TextBox1.Text)
      Dim n As Integer = Convert.ToInt32(cmdo.ExecuteScalar())
      If n > 0 Then
      MsgBox("El Usuario ya existe", MsgBoxStyle.Critical, "Advertencia")
      Return
      End If

      Dim query As String = "INSERT INTO Usuario (usuario, nombre, contraseña, repetircontraseña) " &_
      "VALUES(@Usuario, @Nombre, @Contraseña, @RepetirContraseña)"
      Dim cmd As New OleDb.OleDbCommand(query, c)

      cmd.Parameters.AddWithValue("@Usuario", TextBox1.Text)
      cmd.Parameters.AddWithValue("@Nombre", TextBox2.Text)
      cmd.Parameters.AddWithValue("@Contraseña", TextBox3.Text)
      cmd.Parameters.AddWithValue("@RepetirContraseña", TextBox4.Text)

      cmd.ExecuteNonQuery()

      MessageBox.Show("Guardando Datos..!! ", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Warning)

      End Using


      no definas parametros con espacio en su nombre, como el de repetir contraseña

      saludos

      Eliminar
  92. Hola leandro! Podrias ayudarme... necesito que mi boton guardar... modifique si encuentra registros en la base de datos... y si no encuentra inserte... tengo una tabla Meta_Sucursal... con las columnas Sucursal...Anio...Mes...Crec_Cartera...Crec_Cliente...Porc_Mora...PorcPAR1.... los Crec_ y Porc_ son textbox... y sucursal anio y mes... son combobox.... TE DEJO EL CODIGO... ya modifica,,, PD. las consultas las hago con los combobox y un gridview


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.OleDb;
    using System.Configuration;

    namespace Meta_Sucursal_Pantalla
    {
    public partial class Meta_Sucursal_Pantalla_11_08_15 : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {



    }

    protected void CmBxSucursal_SelectedIndexChanged(object sender, EventArgs e)
    {



    }

    protected void CmBxCiclo_SelectedIndexChanged(object sender, EventArgs e)
    {





    }

    protected void CmBxMes_SelectedIndexChanged(object sender, EventArgs e)
    {



    }

    protected void BtnGuardar_Click(object sender, EventArgs e)
    {

    var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ADWH"].ConnectionString);

    sqlConnection.Open();


    string Modificar = "UPDATE [Meta_Sucursal] SET [Crec_Cartera] = @CrecCartera, [Crec_Cliente] = @CrecCliente, [Porc_Mora] = @PorcMora, [Porc_PAR1] = @PorcPAR1 WHERE Sucursal=@CmBxSucursal AND Año=@CmBxCiclo AND Mes=@CmBxMes";


    SqlCommand cmd = new SqlCommand(Modificar, sqlConnection);


    ////asignamos el valor de los textbox a los parametros

    cmd.Parameters.AddWithValue("@CmBxSucursal", CmBxSucursal.SelectedValue);
    cmd.Parameters.AddWithValue("@CmBxCiclo", CmBxCiclo.SelectedValue);
    cmd.Parameters.AddWithValue("@CmBxMes", CmBxMes.SelectedValue);
    cmd.Parameters.AddWithValue("@CrecCartera", CrecCartera.Text);
    cmd.Parameters.AddWithValue("@CrecCliente", CrecCliente.Text);
    cmd.Parameters.AddWithValue("@PorcMora", PorcMora.Text);
    cmd.Parameters.AddWithValue("@PorcPAR1", PorcPAR1.Text);

    string script = "alert('La modificacion se realizo correctamente');";

    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, true);

    cmd.ExecuteNonQuery();


    sqlConnection.Close();


    }


    }
    }

    ResponderEliminar
    Respuestas
    1. hola
      lo que recomendaria es que el codigo lo estructures en capas
      [WinForms] Edición Empleados
      de esta forma podrias implementar un metodo que valide si el id existe usando el SELECT COUNT(*) y el ExecuteScalar()
      Pero no definas el codigo dierecto en el form porque se hara una ensalada de codigo
      saludos

      Eliminar
  93. Gracias Leandro me sirvió mucho tu ejemplo!.

    ResponderEliminar
  94. Hola Leandro, mi nombre es Boris y he visto muchas respuestas tuyas en los foros de MSDN sobre visual y quisiera hacerte una consulta... estoy haciendo un programa de registro de asistencia, cuando ingreso el código del docente y registro la entrada, esta guarda todos los datos en una base de datos y luego cuando digito nuevamente el código y presiono salida, la idea es que en la misma fila de la bd donde se ingresó la entrada me guarde la hora de la salida, pero no lo he podido realizar... te dejo el código para que lo veas:

    Private Sub btnSalida_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalida.Click
    Label14.Text = TimeOfDay
    If txtCod2.Text = "" Then
    MsgBox("Debe ingresar Código", MsgBoxStyle.Critical, "Error de Código")
    Me.txtCod2.Focus()
    Else
    Try
    con.ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0; Data Source=" & Application.StartupPath & "\RegistroDocente.accdb"
    Catch ex As Exception
    MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
    Exit Sub
    End Try
    con.Open()
    tblgdr2 = New Data.DataSet
    Dim adapt3 As New OleDb.OleDbDataAdapter("Update IngrAsis Set HoraSal = #" & Me.Label14.Text & "# where Codigo like #" & Me.txtCod2.Text & "#;", con)
    adapt3.Fill(tblgdr2, "guardar")
    MsgBox("Salida ingresada con éxito", MsgBoxStyle.Information)
    con.Close()
    End If
    End Sub

    Cuando lo ejecuto me aparece el siguiente error: "Error de sintaxis en la fecha en la expresión de consulta 'Codigo like #D47'."

    Si me pudieras ayudar te lo agradecería mucho, ya que este proyecto es para mi examen de título.

    De antemano muchas gracias.

    ResponderEliminar