Usuario
Error al guardar datos en access desde vb2005

Pregunta
-
hola:
les agradesco por la ayuda brindada hasta ahora con este asunto del error al guardar en base de datos access, pero sigo con el problema, no me esta guardando en la base y ya le he hecho varios cambios pero sigue igual, adunjunto codigo completo para ver si alguien me puede indicar que debo hacer.
Option
Strict On
Imports Microsoft.VisualBasic
Imports
System
Imports
System.Windows.Forms
Imports
System.Drawing
Imports
System.Data
Imports
System.Data.OleDb
Public
Class Clientes
' Las variables que usaremos para el proyecto son estas
Public dt As DataTable = Nothing ' representa una tabla de datos en memoria
Private da As OleDbDataAdapter ' representa un conjunto de bases de datos y una conexion a base de datos que se utiliza para rellenar y actualizar los datos
Private fila As Integer
Private Sub BtnModificarC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnModificarC.Click
If (BtnModificarC.Text = "Buscar") Then
modificarC()
Else
'modificar
buscarC()
End If
End Sub
Public Sub buscarC()
BtnModificarC.Text =
"Buscar"
Me.TXTCodigoC.Clear()
Me.TextNombreC.Clear()
Me.TexttelefonoC.Clear()
Me.TextEmailC.Clear()
Me.TextDirC.Clear()
Me.TXTCodigoC.ReadOnly = False
Me.TextNombreC.ReadOnly = True
Me.TexttelefonoC.ReadOnly = True
Me.TextEmailC.ReadOnly = True
Me.TextDirC.ReadOnly = True
End Sub
Public Sub modificarC()
BtnModificarC.Text =
"Modificar"
Me.TXTCodigoC.ReadOnly = True
Me.TextNombreC.ReadOnly = False
Me.TexttelefonoC.ReadOnly = False
Me.TextEmailC.ReadOnly = False
Me.TextDirC.ReadOnly = False
End Sub
Private Sub asignarDatos(ByVal dr As DataRow)
' Usar los datos que hay en los textbox
dr(
"Nombre") = (TextNombreC.Text).ToString
dr(
"Telefono") = (TexttelefonoC.Text).ToString
dr(
"Email") = (TextEmailC.Text).ToString
dr(
"Direccion") = (TextDirC.Text).ToString
End Sub
Private Sub mostrarDatos(ByVal f As Integer)
Dim uf As Integer = dt.Rows.Count - 1
If f < 0 OrElse uf < 0 Then Exit Sub
'
Dim dr As DataRow = dt.Rows(f)
TXTCodigoC.Text = dr(
"Codigo").ToString
TextNombreC.Text = dr(
"Nombre").ToString
TexttelefonoC.Text = dr(
"Telefono").ToString
TextEmailC.Text = dr(
"Email").ToString
TextDirC.Text = dr(
"Direccion").ToString
'
End Sub
Private Sub BtnInsertarC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnInsertarC.Click
' Actualizar los datos en la fila actual
' fila =
'If fila < 0 OrElse fila > dt.Rows.Count - 1 Then Exit Sub
' Dim dr As DataRow = dt.Rows(fila)
' Asignar los datos de los textbox a la fila
'asignarDatos(dr)
'dr("Nombre") = TextNombreC.Text
'dr("Telefono") = TexttelefonoC.Text
'dr("Email") = TextEmailC.Text
'dr("Direccion") = TextDirC.Text
'Guardar físicamente los datos en la base
'Try
'da.Update(dt)
'dt.AcceptChanges()
'MessageBox.Show("sus datos an sido guardados")
'Catch ex As DBConcurrencyException
'MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message)
'Catch ex As Exception
'MessageBox.Show(ex.Message)
'End Try
' Actualizar los datos en la fila actual
dt =
Nothing
' If dt.Rows.Count = 0 Then Exit Sub
Dim dr As DataRow = dt.NewRow
asignarDatos(dr)
Try
da.Update(dt)
dt.AcceptChanges()
MessageBox.Show(
"sus datos an sido guardados")
Catch ex As DBConcurrencyException
MessageBox.Show(
"Error de concurrencia:" & vbCrLf & ex.Message)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Public Sub ConectarBaseCliente()
' La cadena de conexión
Dim sCnn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=bdClientes.mdb"
' La cadena de selección
Dim sSel As String = "SELECT * FROM Clientes ORDER BY Codigo"
' Para traer solo los registros entre dos fechas
' sSel = "SELECT * FROM Prueba WHERE (FechaAlta >= #2006/01/05# AND FechaAlta <= #2006/01/06#)"
'
' Comprobar si hay algún error
Try
' Crear un nuevo objeto del tipo DataAdapter
'Dim cnn As New OleDbConnection(sCnn)
da =
New OleDbDataAdapter(sSel, sCnn)
' Crear los comandos de insertar, actualizar y eliminar
Dim cb As New OleDbCommandBuilder(da)
' Como hay campos con caracteres especiales,
' al usarlos incluirlos entre corchetes.
cb.QuotePrefix =
"["
cb.QuoteSuffix =
"]"
' Asignar los comandos al DataAdapter
' (se supone que lo hace automáticamente, pero...)
da.UpdateCommand = cb.GetUpdateCommand
da.InsertCommand = cb.GetInsertCommand
da.DeleteCommand = cb.GetDeleteCommand
'
' Esta base de datos usa el ID con valores automáticos
da.MissingSchemaAction = MissingSchemaAction.AddWithKey
'
dt =
New DataTable
' Llenar la tabla con los datos indicados
da.Fill(dt)
'
' Habilitar los controles
' Y mostrar el primer registro
'If dt.Rows.Count > 0 Then
'Else
'fila = -1
'End If
Catch ex As Exception
MessageBox.Show(
"ERROR al conectar o recuperar los datos:" & vbCrLf & _
ex.Message,
"Conectar con la base", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub Clientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End
Class
les aclaro que lo que se quiere hacer es guardar datos de un formulario con textbox y que los guarde en la base de dtos.
les agradecere la ayuda brindada
saludos
- Cambiado Enrique M. Montejo lunes, 25 de julio de 2011 18:34 acceso a datos (De:Lenguaje VB.NET)
Todas las respuestas
-
-
adjunto codigo:
Option Strict On Imports Microsoft.VisualBasic Imports System Imports System.Windows.Forms Imports System.Drawing Imports System.Data Imports System.Data.OleDb Public Class Clientes ' Las variables que usaremos para el proyecto son estas Public dt As DataTable = Nothing ' representa una tabla de datos en memoria Private da As OleDbDataAdapter ' representa un conjunto de bases de datos y una conexion a base de datos que se utiliza para rellenar y actualizar los datos Private fila As Integer Private Sub BtnModificarC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnModificarC.Click If (BtnModificarC.Text = "Buscar") Then modificarC() Else 'modificar buscarC() End If End Sub Public Sub buscarC() BtnModificarC.Text = "Buscar" Me.TXTCodigoC.Clear() Me.TextNombreC.Clear() Me.TexttelefonoC.Clear() Me.TextEmailC.Clear() Me.TextDirC.Clear() Me.TXTCodigoC.ReadOnly = False Me.TextNombreC.ReadOnly = True Me.TexttelefonoC.ReadOnly = True Me.TextEmailC.ReadOnly = True Me.TextDirC.ReadOnly = True End Sub Public Sub modificarC() BtnModificarC.Text = "Modificar" Me.TXTCodigoC.ReadOnly = True Me.TextNombreC.ReadOnly = False Me.TexttelefonoC.ReadOnly = False Me.TextEmailC.ReadOnly = False Me.TextDirC.ReadOnly = False End Sub Private Sub asignarDatos(ByVal dr As DataRow) ' Usar los datos que hay en los textbox dr("Nombre") = (TextNombreC.Text).ToString dr("Telefono") = (TexttelefonoC.Text).ToString dr("Email") = (TextEmailC.Text).ToString dr("Direccion") = (TextDirC.Text).ToString End Sub Private Sub mostrarDatos(ByVal f As Integer) Dim uf As Integer = dt.Rows.Count - 1 If f < 0 OrElse uf < 0 Then Exit Sub ' Dim dr As DataRow = dt.Rows(f) TXTCodigoC.Text = dr("Codigo").ToString TextNombreC.Text = dr("Nombre").ToString TexttelefonoC.Text = dr("Telefono").ToString TextEmailC.Text = dr("Email").ToString TextDirC.Text = dr("Direccion").ToString ' End Sub Private Sub BtnInsertarC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnInsertarC.Click ' Actualizar los datos en la fila actual ' fila = 'If fila < 0 OrElse fila > dt.Rows.Count - 1 Then Exit Sub ' Dim dr As DataRow = dt.Rows(fila) ' Asignar los datos de los textbox a la fila 'asignarDatos(dr) 'dr("Nombre") = TextNombreC.Text 'dr("Telefono") = TexttelefonoC.Text 'dr("Email") = TextEmailC.Text 'dr("Direccion") = TextDirC.Text 'Guardar físicamente los datos en la base 'Try 'da.Update(dt) 'dt.AcceptChanges() 'MessageBox.Show("sus datos an sido guardados") 'Catch ex As DBConcurrencyException 'MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message) 'Catch ex As Exception 'MessageBox.Show(ex.Message) 'End Try ' Actualizar los datos en la fila actual dt = Nothing ' If dt.Rows.Count = 0 Then Exit Sub Dim dr As DataRow = dt.NewRow asignarDatos(dr) Try da.Update(dt) dt.AcceptChanges() MessageBox.Show("sus datos an sido guardados") Catch ex As DBConcurrencyException MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Public Sub ConectarBaseCliente() ' La cadena de conexión Dim sCnn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=bdClientes.mdb" ' La cadena de selección Dim sSel As String = "SELECT * FROM Clientes ORDER BY Codigo" ' Para traer solo los registros entre dos fechas ' sSel = "SELECT * FROM Prueba WHERE (FechaAlta >= #2006/01/05# AND FechaAlta <= #2006/01/06#)" ' ' Comprobar si hay algún error Try ' Crear un nuevo objeto del tipo DataAdapter 'Dim cnn As New OleDbConnection(sCnn) da = New OleDbDataAdapter(sSel, sCnn) ' Crear los comandos de insertar, actualizar y eliminar Dim cb As New OleDbCommandBuilder(da) ' Como hay campos con caracteres especiales, ' al usarlos incluirlos entre corchetes. cb.QuotePrefix = "[" cb.QuoteSuffix = "]" ' Asignar los comandos al DataAdapter ' (se supone que lo hace automáticamente, pero...) da.UpdateCommand = cb.GetUpdateCommand da.InsertCommand = cb.GetInsertCommand da.DeleteCommand = cb.GetDeleteCommand ' ' Esta base de datos usa el ID con valores automáticos da.MissingSchemaAction = MissingSchemaAction.AddWithKey ' dt = New DataTable ' Llenar la tabla con los datos indicados da.Fill(dt) ' ' Habilitar los controles ' Y mostrar el primer registro 'If dt.Rows.Count > 0 Then 'Else 'fila = -1 'End If Catch ex As Exception MessageBox.Show("ERROR al conectar o recuperar los datos:" & vbCrLf & _ ex.Message, "Conectar con la base", _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Private Sub Clientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub End Class
-
hola
pero no obtienes un error cuando ejecutas ese codigo, lo pregunto porque veo que haces
dt = Nothing
' If dt.Rows.Count = 0 Then Exit Sub
Dim dr As DataRow = dt.NewRow
asignarDatos(dr)pero al igualar el datatable a Nothing y luego hacer un NewRow has perdido la estructura de la tabla, o sea la definciona de los campos
un consejo, no te conviene usar DataSet tipados, mira que simple extiene la funcionalidad aqui
Building a DAL using Strongly Typed TableAdapters and DataTables in VS 2005 and ASP.NET 2.0
te conectas a la db y arrastras tus tablas al xsd, luego operas con el tableadapter para inserta o actualziar y usas el Fill durecto para obtener la info
DataSets con establecimiento de tipos (ADO.NET)
C ó mo: Crear un conjunto de datos con tipo
creo que de todas als copciones automaticas que provee ado.net el dataset tipado es una de las mejorcitas, o al menos es mejor que el codigo y las queries generadas en runtime
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Hola
prueba a dejar el código de grabar así:
' Actualizar los datos en la fila actual ' Creamos un nuevo objeto en vez de asignarlo a nothing. dt = new DataTable ' If dt.Rows.Count = 0 Then Exit Sub Dim dr As DataRow = dt.NewRow asignarDatos(dr) 'Añadimos la row con los datos a la tabla. dt.rows.Add(dr) Try da.Update(dt) dt.AcceptChanges() MessageBox.Show("sus datos an sido guardados") Catch ex As DBConcurrencyException MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message) Catch ex As Exception MessageBox.Show(ex.Message) End Try
Antes de hacer el update, tienes que añadir la nueva row a la datatable, y si antes de eso has establecido dt a nothing, te fallará, mejor recreas la variable dt a una nueva instancia de DataTable.
Espero que te funcione, un gran saludo.!
MCTS .NET Framework 3.5 Windows Forms Application Development
Visita mi Blog
Sigueme en Twitter -
-