CLR: .Net / Mono / Boo / Otros CLR > VB .NET

 error: "Expresion demasiado compleja" ADO.NET

(1/1)

dariosc:
Hola desarrolladores! Les cuento brevemente mi problema:

Hace un año desarrolle (soy principiante) un soft para mi esposa... a mediado de año se me descompuso el disco rigido de mi pc y perdi el codigo fuente. El programa funciona pero hay q hacerle varios cambios, asi q empece a hacerlo nuevamente...

Ahora me surgio un error que antes no lo tenia:

Cuando agrego un "nuevo registro" en la tabla de la BD (Access) lo guarda sin ningun problema. Pero al querer modificar alguno (update) me sale el error de "Expresion demasiado compleja". No puedo encontrar donde me he equivocado, hace 3 días que he revisado el codigo y no encuentro la falla.

espero que puedan ayudarme por q este error me ha atrasado bastante. acontinuacion les pongo el codigo para que puedan revisarlo:

procedimiento de conexion:



--- Código: vb.net ---Public Sub ConectarDBPac()    basededatos = "./datos.mdb"    'me conecto y compruebo si existe la bse de datos    Try      If System.IO.File.Exists(cadenaPac) = False Then        MessageBox.Show("No existe la base de datos indicada")        Exit Sub      End If    Catch ex As Exception      MessageBox.Show("ERROR: " & ex.Message & vbCrLf & "Seguramente porque no existe la base de datos")      Exit Sub    End Try    '    'cadena de conexión    Dim sCnn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=pass;Data Source=" & basededatos & ";Mode=ReadWrite;Persist Security Info=true;"    'cadena de selección    Dim sSel As String = "SELECT * FROM Pacientes ORDER BY Apellido"     ' Comprobar errores    Try      ' Crear un nuevo objeto del tipo DataAdapter      daPac = New OleDbDataAdapter(sSel, sCnn)      ' Crear los comandos de insertar, actualizar y eliminar      Dim cb As New OleDbCommandBuilder(daPac)      ' 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...)      daPac.UpdateCommand = cb.GetUpdateCommand      daPac.InsertCommand = cb.GetInsertCommand      daPac.DeleteCommand = cb.GetDeleteCommand      '      ' Esta base de datos usa el ID con valores automáticos      daPac.MissingSchemaAction = Data.MissingSchemaAction.AddWithKey      '      dtPac = New DataTable      ' Llenar la tabla con los datos indicados      daPac.Fill(dtPac)      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 

procedimiento del boton guardar (en este procedimiento estan la parte de nuevo registro y actualizacion juntos, segun el valor de la variable "modif")



--- Código: vb.net ---Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGuardar.Click    If Not (((((((((Me.TxtApe.Text = Nothing) Or (Me.TxtNom.Text = Nothing)) Or (Me.TxtDom.Text = Nothing)) Or (Me.TxtDNI.Text = Nothing)) Or (Me.TxtPAct.Text = Nothing)) Or (Me.TxtPDes.Text = Nothing)) Or (Me.TxtTalla.Text = Nothing)) Or (Me.TxtCCint.Text = Nothing)) Or (Me.TxtCCade.Text = Nothing)) Then      If (Modif = 0) Then        ' Creamos un nuevo registro        Dim dr As DataRow = dtPac.NewRow()        'Asignamos los datos        asignarDatos(dr)        'Añadimos la nueva fila a la tabla        dtPac.Rows.Add(dr)        ' Guardamos los datos en la base        Try          daPac.Update(dtPac)          dtPac.AcceptChanges()          'Actualizamos IDs          If CInt("0" & dr("ID").ToString) = 0 Then            dtPac = New DataTable            daPac.Fill(dtPac)          End If          ' Posicionamos en la última fila          BtnUltimo_Click(Nothing, Nothing)        Catch ex As DBConcurrencyException          MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message)        Catch ex As Exception          MessageBox.Show(ex.Message)        End Try        MsgBox(String.Concat(New String() {"Ha Guardado el Paciente: ", Me.TxtApe.Text, " ", Me.TxtNom.Text, " con Exito!!!!"}), MsgBoxStyle.OkOnly, Nothing)      Else        ' Actualizamos los datos en la fila actual        If filaPac < 0 OrElse filaPac > dtPac.Rows.Count - 1 Then Exit Sub        Dim dr As DataRow = dtPac.Rows(filaPac)        ' Asignamos los datos        asignarDatos(dr)        ' Guardamos físicamente los datos en la base        Try          daPac.Update(dtPac) 'ACA SE CORTA Y HACE EL ERROR "EXPRESION DEMASIADO COMPLEJA"          dtPac.AcceptChanges()        Catch ex As DBConcurrencyException          MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message)        Catch ex As Exception          MessageBox.Show(ex.Message)        End Try        Interaction.MsgBox(String.Concat(New String() {"Ha Modificado el Paciente: ", Me.TxtApe.Text, " ", Me.TxtNom.Text, " con Exito!!!!"}), MsgBoxStyle.OkOnly, Nothing)      End If      Me.BtnGuardar.Enabled = False      Me.BtnModi.Enabled = True      Me.BtnNuevo.Enabled = True      Me.BtnCancel.Enabled = False      Me.BtnEli.Enabled = True      Me.BtnEli.Enabled = True      Me.BtnPrimero.Enabled = True      Me.BtnSiguiente.Enabled = True      Me.BtnAnterior.Enabled = True      Me.BtnUltimo.Enabled = True      Modif = 0    Else      Interaction.MsgBox("Faltan datos por Completar", MsgBoxStyle.Critical, Nothing)    End If  End Sub 

y aca les dejo el procedimiento "asignardatos":



--- Código: Visual Basic ---Private Sub asignarDatos(ByVal dr As DataRow)    dr("Nombre") = Me.TxtNom.Text    dr("Apellido") = Me.TxtApe.Text    dr("FecNac") = Me.DTFecNac.Text    dr("Edad") = Me.LblEdad.Text    dr("DNI") = Me.TxtDNI.Text    dr("Domicilio") = Me.TxtDom.Text    dr("SexMasc") = Me.OptSexMasc.Checked    dr("SexFem") = Me.OptSexFem.Checked    dr("EstCivSol") = Me.OptEstCivSol.Checked    dr("EstCivCasa") = Me.OptEstCivCasa.Checked    dr("EstCivOtro") = Me.OptEstCivOtro.Checked    dr("Telefono") = Me.TxtTel.Text    If (nuevo = 1) Then      dr("FecReg") = DateAndTime.Today    End If    If (Module1.Modif = 0) Then      dr("FecVis") = DateAndTime.Today    End If    dr("ObraSocial") = Int(Me.CbxObraS.SelectedValue)    dr("Consultorio") = Int(Me.CbxConsul.SelectedValue)    dr("Contex") = Me.CbxContex.Text    dr("SuAct") = Me.CbxSuAct.Text    dr("PracDep") = Me.CbxPDep.Text    dr("CualDep") = Me.CbxCDep.Text    dr("PesoTeo") = Convert.ToDecimal(Me.TxtPTeo.Text)    dr("PesoAct") = Convert.ToDecimal(Me.TxtPAct.Text)    dr("PesoDes") = Convert.ToDecimal(Me.TxtPDes.Text)    dr("Talla") = Convert.ToDecimal(Me.TxtTalla.Text)    dr("Contex") = Me.CbxContex.Text    dr("ContCint") = Convert.ToDecimal(Me.TxtCCint.Text)    dr("Contcade") = Convert.ToDecimal(Me.TxtCCade.Text)    dr("OptDismPeso") = OptDismPeso.Text    dr("OptMantPeso") = OptMantPeso.Text    dr("OptAumPeso") = OptAumPeso.Text    dr("CalcE") = TxtCalcE.Text    dr("Estre") = Me.ChkEstre.Checked    dr("Gastri") = Me.ChkGastri.Checked    dr("Nausea") = Me.ChkNau.Checked    dr("Ulcera") = Me.ChkUlc.Checked    dr("Pirosis") = Me.ChkPiro.Checked    dr("Vomito") = Me.ChkVom.Checked    dr("Colitis") = Me.ChkColi.Checked    dr("ProbleOtros") = Me.ChkPOtros.Checked    dr("Dent") = Me.TxtDent.Text    dr("Diarrea") = Me.ChkDiarrea.Checked    dr("ObsPA") = Me.TxtObsPA.Text    dr("PAEnfD") = Me.TxtPAEnfD.Text    dr("HPEnfI") = Me.TxtHPEnfI.Text    dr("HiperCol") = Me.ChkHCol.Checked    dr("HiperTri") = Me.ChkHTri.Checked    dr("AcidoUr") = Me.ChkAcidUr.Checked    dr("Cardio") = Me.ChkCardio.Checked    dr("Obesidad") = Me.ChkObe.Checked    dr("Cancer") = Me.ChkCancer.Checked    dr("Diabetes") = Me.ChkDiab.Checked    dr("HTA") = Me.ChkHTA.Checked    dr("AFN") = Me.TxtAFN.Text    dr("Embara") = Me.ChkEmb.Checked    dr("Lactan") = Me.ChkLact.Checked    dr("Mestrua") = Me.ChkMes.Checked    dr("Premeno") = Me.ChkPreMen.Checked    dr("Meno") = Me.ChkMeno.Checked    dr("CComD") = Me.CbxCComD.Text    dr("CCFS") = Me.ChkCCFS.Checked    dr("CCES") = Me.ChkCCES.Checked    dr("CFES") = Me.ChkCFES.Checked    dr("CFFS") = Me.ChkCFFS.Checked    dr("NotID") = Me.TxtNotID.Text    dr("QuienP") = Me.TxtQuP.Text    dr("CeCQ") = Me.TxtCeCQ.Text    dr("SICeC") = Me.OptSICeC.Checked    dr("NoCeC") = Me.OptNOCeC.Checked    dr("SIAliMod") = Me.OptSIAM.Checked    dr("NOAliMod") = Me.OptNOAM.Checked    dr("HModAli6") = Me.TxtMAPQ.Text    dr.Item("HModAli6C") = Me.TxtHModAli6C.Text    dr("ApeBue") = Me.OptABu.Checked    dr("ApeMal") = Me.OptAMa.Checked    dr("ApeReg") = Me.OptAR.Checked    dr("HoraH") = Me.TxtHH.Text    dr("AliPref") = Me.TxtAliP.Text    dr("AliNO") = Me.TxtAliNo.Text    dr("AliMal") = Me.TxtAliM.Text    dr("AlerSI") = Me.OptAlSI.Checked    dr("AlerNO") = Me.OptAlNO.Checked    dr("AliAler") = Me.TxtAliA.Text    dr("SupSI") = Me.OptSSI.Checked    dr("SupNO") = Me.OptSNO.Checked    dr("CualSup") = Me.TxtCS.Text    dr("DosisSup") = Me.TxtDS.Text    dr("PQSup") = Me.TxtPQS.Text    dr("ConVa") = Me.TxtConVa.Text    dr("ConVaSI") = Me.OptCVSI.Checked    dr("ConVaNO") = Me.OptCVNO.Checked    dr("SalSI") = Me.OptSalSI.Checked    dr("SalNO") = Me.OptSalNO.Checked    dr("Marg") = Me.ChkMarg.Checked    dr("Aceite") = Me.ChkAc.Checked    dr("Mant") = Me.ChkMant.Checked    dr("Otros") = Me.ChkOtros.Checked    dr("DietaEspSI") = Me.OptDESI.Checked    dr("DietaEspNO") = Me.OptDENO.Checked    dr("TipoD") = Me.TxtTipoD.Text    dr("HaceCto") = Me.TxtHCto.Text    dr("CuanTpo") = Me.TxtCTpo.Text    dr("PQRaz") = Me.TxtPQRaz.Text    dr("ObRes") = Me.TxtObRes.Text    dr("Desay") = Me.TxtDy.Text    dr("Col1") = Me.TxtC1.Text    dr("Almu") = Me.TxtAl.Text    dr("MediaT") = Me.TxtMT.Text    dr("Col2") = Me.TxtC2.Text    dr("Cena") = Me.TxtC.Text    dr("Alc") = Me.ChkAlc.Checked    dr("Tab") = Me.ChkTab.Checked    dr("Caf") = Me.ChkCaf.Checked    dr("ConsuNotas") = Me.TxtCN.Text  End Sub  
tambien les dejo las bibliotecas que tengo declaradas por las dudas ;)



--- Código: vb.net ---Option Strict OnImports Microsoft.VisualBasicImports SystemImports System.DataImports System.Data.OleDbImports System.DrawingImports System.Windows.FormsImports System.ComponentModelImports System.Data.OleDb.OleDbDataAdapter 
la variable "filapac" es global. esta declarada en un modulo. tiene el valor de la fila que le da los botones de navegacion. espero q eso sea lo q me planteas.
aca te dejo los botones primero y siguiente:


--- Código: vb.net ---Private Sub BtnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrimero.Click    ' Posicionarse en la primera fila    filaPac = 0    ' Mostrar los datos de la fila indicada    mostrarDatos(filaPac)  End Sub Private Sub BtnSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSiguiente.Click    ' Posicionarse en la fila siguiente    Dim uf As Integer = dtPac.Rows.Count - 1    filaPac = filaPac + 1    If filaPac > uf Then filaPac = uf    ' Mostrar los datos de la fila indicada    mostrarDatos(filaPac)End Sub  
Espero su pronta ayuda en este problema, ustedes tiene toda la experiencia y seguramente van a encontrar el error.

Un abraso y Saludos

PD: Estoy usando Visual Studio 2008

Navegación

[0] Índice de Mensajes

Ir a la versión completa