En esta entrega trataré de manera simple una forma de actualizar datos de una tabla en una Base de Datos SQL Server 2005, es que muchas veces resulta tedioso tener que realizar estos pasos cuando solamente se trata de cambiar los datos de ciertas columnas desde un DataGridView.
El ejemplo se plantea de la siguiente manera:
Creamos un proyecto nuevo, con un formulario Prueba puede asignarle el nombre que mejor le parece al ejemplo y añadiremos los controles siguientes:
- Una etiqueta: lblTitulo
- Una caja de texto : TxtPedido
- Un botón: btnMostrar
- Un DataGridView: DataGridView1
- 4 botones: btnInicio, btnAnterior, btnSiguiente, btnFinal
- Un botón: btnGuardar
- Un botón: btnSalir
El formulario debería quedar como la imágen de muestra.
En el formulario pedimos la entrada del Número de Pedido a consultar y modificar, si no existe le mostrará un mensaje de advertencia, si el Pedido existe en la tabla PedidosDetalles entonces llenará el DataGridView para su modificación de la columna que desee a excepción de las columnas que son llaves, han como requisito para este tipo de UPDATE es que la tabla debe tener una llave primaria, hechos los cambios Click en el botón guardar y listo.
Lo demás es programar un poco pero que es bastante didáctico y que con pequeñas modificaciones pueden adaptarlo a sus requerimientos.
A continuación el código completo, espero sea de utilidad.
Hasta pronto.
Option Explicit On
Option Strict On
'
'''''''''''''''''''''''''''''''''''''''''
Imports
System.Data.SqlClient
Public Class Prueba
Private WithEvents bs
As New
BindingSource
Private
SqlDataAdapter As SqlDataAdapter
' conexión
Private Const cs As String = "Data Source=.\sqlexpress;" & _
"Initial Catalog=database;" & _
"Integrated Security=true"
' flag para
activar la edición en el DGV
Private bEdit As
Boolean
' También actualiza
al cerrar el formulario
Private Sub Prueba_FormClosing(ByVal sender As Object, _
ByVal e As
System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing
If bEdit Then
If
(MsgBox( _
"Guardar
cambios ?", _
MsgBoxStyle.YesNo, _
"guardar"))
= MsgBoxResult.Yes Then
Actualizar(False)
End If
End If
End Sub
Private Sub Prueba_Load(ByVal sender As
System.Object, _
ByVal e As
System.EventArgs) Handles MyBase.Load
With DataGridView1
.DataSource
= bs
End With
TxtPedido.Text
= ""
End Sub
Private Sub
cargar_registros(ByVal sql As String, _
ByVal dv As
DataGridView)
Try
SqlDataAdapter = New SqlDataAdapter(sql,
cs)
Dim
SqlCommandBuilder As New
SqlCommandBuilder(SqlDataAdapter)
' carga el DataTable
Dim dt As New DataTable()
SqlDataAdapter.Fill(dt)
bs.DataSource = dt
With dv
.Refresh()
.FirstDisplayedScrollingRowIndex = bs.Position
End With
bEdit = False
Catch exSql As
SqlException
MsgBox(exSql.Message.ToString)
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub
' botón para
guardar los cambios y llenar la grilla
Private Sub btnGuardar_Click(ByVal sender As
System.Object, _
ByVal e As
System.EventArgs) Handles btn_update.Click
Actualizar()
End Sub
Private Sub
Actualizar(Optional ByVal
bCargar As Boolean
= True)
If Not bs.DataSource Is Nothing Then
Me.SqlDataAdapter.Update(CType(bs.DataSource,
DataTable))
If bCargar Then
cargar_registros("Select PedidoID,ProductoID,”_
“Cantidad,usuario,d_completa as Unidad”_
“From
PedidosDetalles Where PedidoId="
& _ Me.TxtPedido.Text, DataGridView1)
End If
End If
End Sub
Private Sub btnInicio_Click(ByVal sender As
System.Object, _
ByVal e As
System.EventArgs) _
Handles btnInicio.Click, btnAnterior.Click, _ btnSiguinte.Click, btnFinal.Click
' Botones de
movimientos
If sender Is btnAnterior
Then
bs.MovePrevious()
ElseIf sender Is btnInicio
Then
bs.MoveFirst()
ElseIf sender Is btnSiguiente
Then
bs.MoveNext()
ElseIf sender Is btnFinal
Then
bs.MoveLast()
End If
End Sub
Private Sub
DataGridView1_CellEndEdit( _
ByVal sender As Object, _
ByVal e As
System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellEndEdit
bEdit = True
End Sub
Private Sub btnMostrar_Click(ByVal sender As
System.Object, ByVal e As
System.EventArgs) Handles btnMostrar.Click
Try
If Me.TxtPedido.Text
= "" Then
MsgBox("Debe ingresar un
Número de Pedido...!",_ MsgBoxStyle.Critical, "Atención")
Else
cargar_registros("Select
PedidoID,ProductoID,_ Cantidad,usuario,fecha as Unidad From _ PedidosDetallesA
Where PedidoId=" & _ Me.TxtPedido.Text,
DataGridView1)
End If
Catch exSql As
SqlException
MsgBox(exSql.Message.ToString)
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub
Private Sub
btnSalir_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSalir.Click
Me.Close()
End Sub
End Class
si tienes 2 tablas y una guardas el codigo de otra , pero para efectos de mostrar la descripcion de la segunda tabla como se hace para indicarle al SqlDataAdapter.Updateç(CType(bs.DataSource, DataTable)) que no tome en cuenta el campo de mas que indica la descripcion del codigo del a segunda tabla ?
ResponderEliminarGracias por publicar este código me ha sido de mucha utilidad
ResponderEliminarRubén
Buen dia
ResponderEliminarEL codigo me arroja el siguiente error de tipo SQEXCEPTION
La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave.
En la consulta estoy llamando al campo id de mi tabla, y mi tabla is tiene una pk definida, cual es el error entonces ?
Gracias por la atencin