none
Error al guardar datos en access desde vb2005 RRS feed

  • 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)
    miércoles, 28 de abril de 2010 1:47

Todas las respuestas

  • hola

    podrias editar el codigo del mensaje y ponerlo con algo mas de identacion, esta algo complejo de analizar asi como esta

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 28 de abril de 2010 1:49
  • 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
    miércoles, 28 de abril de 2010 1:51
  • 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

     

    Typed DataSets (ADO.NET)

    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
    miércoles, 28 de abril de 2010 2:56
  • 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
    miércoles, 28 de abril de 2010 9:46

  • ahh no habia notado esa linea importantisima que remarca Josue

     dt.rows.Add(dr)

    sino agregas la neuva fila al DataTable es como que nunca se agrego

    sin olvidad de quitar la linea:  dt = Nothing

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 28 de abril de 2010 12:05
  • ¡Hola!

    ¿Las informaciones fueran utiles para solucionar su problema?

    ¡Gracias!
    Rafael Fagundes - Marque la respuesta como correcta si te ha sido de utilidad!
    lunes, 3 de mayo de 2010 13:25