• Viernes 8 de Noviembre de 2024, 12:28

Autor Tema:  error: "Expresion demasiado compleja" ADO.NET  (Leído 1736 veces)

dariosc

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
error: "Expresion demasiado compleja" ADO.NET
« en: Viernes 4 de Marzo de 2011, 22:37 »
0
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
  1. Public Sub ConectarDBPac()
  2.     basededatos = "./datos.mdb"
  3.     'me conecto y compruebo si existe la bse de datos
  4.     Try
  5.       If System.IO.File.Exists(cadenaPac) = False Then
  6.         MessageBox.Show("No existe la base de datos indicada")
  7.         Exit Sub
  8.       End If
  9.     Catch ex As Exception
  10.       MessageBox.Show("ERROR: " & ex.Message & vbCrLf & "Seguramente porque no existe la base de datos")
  11.       Exit Sub
  12.     End Try
  13.     '
  14.     'cadena de conexión
  15.     Dim sCnn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=pass;Data Source=" & basededatos & ";Mode=ReadWrite;Persist Security Info=true;"
  16.     'cadena de selección
  17.     Dim sSel As String = "SELECT * FROM Pacientes ORDER BY Apellido"
  18.  
  19.     ' Comprobar errores
  20.     Try
  21.       ' Crear un nuevo objeto del tipo DataAdapter
  22.       daPac = New OleDbDataAdapter(sSel, sCnn)
  23.       ' Crear los comandos de insertar, actualizar y eliminar
  24.       Dim cb As New OleDbCommandBuilder(daPac)
  25.       ' Como hay campos con caracteres especiales,
  26.       ' al usarlos incluirlos entre corchetes.
  27.       cb.QuotePrefix = "["
  28.       cb.QuoteSuffix = "]"
  29.       ' Asignar los comandos al DataAdapter
  30.       ' (se supone que lo hace automáticamente, pero...)
  31.       daPac.UpdateCommand = cb.GetUpdateCommand
  32.       daPac.InsertCommand = cb.GetInsertCommand
  33.       daPac.DeleteCommand = cb.GetDeleteCommand
  34.       '
  35.       ' Esta base de datos usa el ID con valores automáticos
  36.       daPac.MissingSchemaAction = Data.MissingSchemaAction.AddWithKey
  37.       '
  38.       dtPac = New DataTable
  39.       ' Llenar la tabla con los datos indicados
  40.       daPac.Fill(dtPac)
  41.       Catch ex As Exception
  42.       MessageBox.Show("ERROR al conectar o recuperar los datos:" & vbCrLf & _
  43.               ex.Message, "Conectar con la base", _
  44.               MessageBoxButtons.OK, MessageBoxIcon.Error)
  45.     End Try
  46.   End Sub
  47.  


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
  1. Private Sub BtnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGuardar.Click
  2.     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
  3.       If (Modif = 0) Then
  4.         ' Creamos un nuevo registro
  5.         Dim dr As DataRow = dtPac.NewRow()
  6.         'Asignamos los datos
  7.         asignarDatos(dr)
  8.         'Añadimos la nueva fila a la tabla
  9.         dtPac.Rows.Add(dr)
  10.         ' Guardamos los datos en la base
  11.         Try
  12.           daPac.Update(dtPac)
  13.           dtPac.AcceptChanges()
  14.           'Actualizamos IDs
  15.           If CInt("0" & dr("ID").ToString) = 0 Then
  16.             dtPac = New DataTable
  17.             daPac.Fill(dtPac)
  18.           End If
  19.           ' Posicionamos en la última fila
  20.           BtnUltimo_Click(Nothing, Nothing)
  21.         Catch ex As DBConcurrencyException
  22.           MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message)
  23.         Catch ex As Exception
  24.           MessageBox.Show(ex.Message)
  25.         End Try
  26.         MsgBox(String.Concat(New String() {"Ha Guardado el Paciente: ", Me.TxtApe.Text, " ", Me.TxtNom.Text, " con Exito!!!!"}), MsgBoxStyle.OkOnly, Nothing)
  27.       Else
  28.         ' Actualizamos los datos en la fila actual
  29.         If filaPac < 0 OrElse filaPac > dtPac.Rows.Count - 1 Then Exit Sub
  30.         Dim dr As DataRow = dtPac.Rows(filaPac)
  31.         ' Asignamos los datos
  32.         asignarDatos(dr)
  33.         ' Guardamos físicamente los datos en la base
  34.         Try
  35.           daPac.Update(dtPac) 'ACA SE CORTA Y HACE EL ERROR "EXPRESION DEMASIADO COMPLEJA"
  36.           dtPac.AcceptChanges()
  37.         Catch ex As DBConcurrencyException
  38.           MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message)
  39.         Catch ex As Exception
  40.           MessageBox.Show(ex.Message)
  41.         End Try
  42.         Interaction.MsgBox(String.Concat(New String() {"Ha Modificado el Paciente: ", Me.TxtApe.Text, " ", Me.TxtNom.Text, " con Exito!!!!"}), MsgBoxStyle.OkOnly, Nothing)
  43.       End If
  44.       Me.BtnGuardar.Enabled = False
  45.       Me.BtnModi.Enabled = True
  46.       Me.BtnNuevo.Enabled = True
  47.       Me.BtnCancel.Enabled = False
  48.       Me.BtnEli.Enabled = True
  49.       Me.BtnEli.Enabled = True
  50.       Me.BtnPrimero.Enabled = True
  51.       Me.BtnSiguiente.Enabled = True
  52.       Me.BtnAnterior.Enabled = True
  53.       Me.BtnUltimo.Enabled = True
  54.       Modif = 0
  55.     Else
  56.       Interaction.MsgBox("Faltan datos por Completar", MsgBoxStyle.Critical, Nothing)
  57.     End If
  58.   End Sub
  59.  


y aca les dejo el procedimiento "asignardatos":


Código: Visual Basic
  1. Private Sub asignarDatos(ByVal dr As DataRow)
  2.     dr("Nombre") = Me.TxtNom.Text
  3.     dr("Apellido") = Me.TxtApe.Text
  4.     dr("FecNac") = Me.DTFecNac.Text
  5.     dr("Edad") = Me.LblEdad.Text
  6.     dr("DNI") = Me.TxtDNI.Text
  7.     dr("Domicilio") = Me.TxtDom.Text
  8.     dr("SexMasc") = Me.OptSexMasc.Checked
  9.     dr("SexFem") = Me.OptSexFem.Checked
  10.     dr("EstCivSol") = Me.OptEstCivSol.Checked
  11.     dr("EstCivCasa") = Me.OptEstCivCasa.Checked
  12.     dr("EstCivOtro") = Me.OptEstCivOtro.Checked
  13.     dr("Telefono") = Me.TxtTel.Text
  14.     If (nuevo = 1) Then
  15.       dr("FecReg") = DateAndTime.Today
  16.     End If
  17.     If (Module1.Modif = 0) Then
  18.       dr("FecVis") = DateAndTime.Today
  19.     End If
  20.     dr("ObraSocial") = Int(Me.CbxObraS.SelectedValue)
  21.     dr("Consultorio") = Int(Me.CbxConsul.SelectedValue)
  22.     dr("Contex") = Me.CbxContex.Text
  23.     dr("SuAct") = Me.CbxSuAct.Text
  24.     dr("PracDep") = Me.CbxPDep.Text
  25.     dr("CualDep") = Me.CbxCDep.Text
  26.     dr("PesoTeo") = Convert.ToDecimal(Me.TxtPTeo.Text)
  27.     dr("PesoAct") = Convert.ToDecimal(Me.TxtPAct.Text)
  28.     dr("PesoDes") = Convert.ToDecimal(Me.TxtPDes.Text)
  29.     dr("Talla") = Convert.ToDecimal(Me.TxtTalla.Text)
  30.     dr("Contex") = Me.CbxContex.Text
  31.     dr("ContCint") = Convert.ToDecimal(Me.TxtCCint.Text)
  32.     dr("Contcade") = Convert.ToDecimal(Me.TxtCCade.Text)
  33.     dr("OptDismPeso") = OptDismPeso.Text
  34.     dr("OptMantPeso") = OptMantPeso.Text
  35.     dr("OptAumPeso") = OptAumPeso.Text
  36.     dr("CalcE") = TxtCalcE.Text
  37.     dr("Estre") = Me.ChkEstre.Checked
  38.     dr("Gastri") = Me.ChkGastri.Checked
  39.     dr("Nausea") = Me.ChkNau.Checked
  40.     dr("Ulcera") = Me.ChkUlc.Checked
  41.     dr("Pirosis") = Me.ChkPiro.Checked
  42.     dr("Vomito") = Me.ChkVom.Checked
  43.     dr("Colitis") = Me.ChkColi.Checked
  44.     dr("ProbleOtros") = Me.ChkPOtros.Checked
  45.     dr("Dent") = Me.TxtDent.Text
  46.     dr("Diarrea") = Me.ChkDiarrea.Checked
  47.     dr("ObsPA") = Me.TxtObsPA.Text
  48.     dr("PAEnfD") = Me.TxtPAEnfD.Text
  49.     dr("HPEnfI") = Me.TxtHPEnfI.Text
  50.     dr("HiperCol") = Me.ChkHCol.Checked
  51.     dr("HiperTri") = Me.ChkHTri.Checked
  52.     dr("AcidoUr") = Me.ChkAcidUr.Checked
  53.     dr("Cardio") = Me.ChkCardio.Checked
  54.     dr("Obesidad") = Me.ChkObe.Checked
  55.     dr("Cancer") = Me.ChkCancer.Checked
  56.     dr("Diabetes") = Me.ChkDiab.Checked
  57.     dr("HTA") = Me.ChkHTA.Checked
  58.     dr("AFN") = Me.TxtAFN.Text
  59.     dr("Embara") = Me.ChkEmb.Checked
  60.     dr("Lactan") = Me.ChkLact.Checked
  61.     dr("Mestrua") = Me.ChkMes.Checked
  62.     dr("Premeno") = Me.ChkPreMen.Checked
  63.     dr("Meno") = Me.ChkMeno.Checked
  64.     dr("CComD") = Me.CbxCComD.Text
  65.     dr("CCFS") = Me.ChkCCFS.Checked
  66.     dr("CCES") = Me.ChkCCES.Checked
  67.     dr("CFES") = Me.ChkCFES.Checked
  68.     dr("CFFS") = Me.ChkCFFS.Checked
  69.     dr("NotID") = Me.TxtNotID.Text
  70.     dr("QuienP") = Me.TxtQuP.Text
  71.     dr("CeCQ") = Me.TxtCeCQ.Text
  72.     dr("SICeC") = Me.OptSICeC.Checked
  73.     dr("NoCeC") = Me.OptNOCeC.Checked
  74.     dr("SIAliMod") = Me.OptSIAM.Checked
  75.     dr("NOAliMod") = Me.OptNOAM.Checked
  76.     dr("HModAli6") = Me.TxtMAPQ.Text
  77.     dr.Item("HModAli6C") = Me.TxtHModAli6C.Text
  78.     dr("ApeBue") = Me.OptABu.Checked
  79.     dr("ApeMal") = Me.OptAMa.Checked
  80.     dr("ApeReg") = Me.OptAR.Checked
  81.     dr("HoraH") = Me.TxtHH.Text
  82.     dr("AliPref") = Me.TxtAliP.Text
  83.     dr("AliNO") = Me.TxtAliNo.Text
  84.     dr("AliMal") = Me.TxtAliM.Text
  85.     dr("AlerSI") = Me.OptAlSI.Checked
  86.     dr("AlerNO") = Me.OptAlNO.Checked
  87.     dr("AliAler") = Me.TxtAliA.Text
  88.     dr("SupSI") = Me.OptSSI.Checked
  89.     dr("SupNO") = Me.OptSNO.Checked
  90.     dr("CualSup") = Me.TxtCS.Text
  91.     dr("DosisSup") = Me.TxtDS.Text
  92.     dr("PQSup") = Me.TxtPQS.Text
  93.     dr("ConVa") = Me.TxtConVa.Text
  94.     dr("ConVaSI") = Me.OptCVSI.Checked
  95.     dr("ConVaNO") = Me.OptCVNO.Checked
  96.     dr("SalSI") = Me.OptSalSI.Checked
  97.     dr("SalNO") = Me.OptSalNO.Checked
  98.     dr("Marg") = Me.ChkMarg.Checked
  99.     dr("Aceite") = Me.ChkAc.Checked
  100.     dr("Mant") = Me.ChkMant.Checked
  101.     dr("Otros") = Me.ChkOtros.Checked
  102.     dr("DietaEspSI") = Me.OptDESI.Checked
  103.     dr("DietaEspNO") = Me.OptDENO.Checked
  104.     dr("TipoD") = Me.TxtTipoD.Text
  105.     dr("HaceCto") = Me.TxtHCto.Text
  106.     dr("CuanTpo") = Me.TxtCTpo.Text
  107.     dr("PQRaz") = Me.TxtPQRaz.Text
  108.     dr("ObRes") = Me.TxtObRes.Text
  109.     dr("Desay") = Me.TxtDy.Text
  110.     dr("Col1") = Me.TxtC1.Text
  111.     dr("Almu") = Me.TxtAl.Text
  112.     dr("MediaT") = Me.TxtMT.Text
  113.     dr("Col2") = Me.TxtC2.Text
  114.     dr("Cena") = Me.TxtC.Text
  115.     dr("Alc") = Me.ChkAlc.Checked
  116.     dr("Tab") = Me.ChkTab.Checked
  117.     dr("Caf") = Me.ChkCaf.Checked
  118.     dr("ConsuNotas") = Me.TxtCN.Text
  119.   End Sub
  120.  
  121.  

tambien les dejo las bibliotecas que tengo declaradas por las dudas ;)


Código: vb.net
  1. Option Strict On
  2. Imports Microsoft.VisualBasic
  3. Imports System
  4. Imports System.Data
  5. Imports System.Data.OleDb
  6. Imports System.Drawing
  7. Imports System.Windows.Forms
  8. Imports System.ComponentModel
  9. Imports System.Data.OleDb.OleDbDataAdapter
  10.  

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
  1. Private Sub BtnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrimero.Click
  2.     ' Posicionarse en la primera fila
  3.     filaPac = 0
  4.     ' Mostrar los datos de la fila indicada
  5.     mostrarDatos(filaPac)
  6.   End Sub
  7.  
  8. Private Sub BtnSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSiguiente.Click
  9.     ' Posicionarse en la fila siguiente
  10.     Dim uf As Integer = dtPac.Rows.Count - 1
  11.     filaPac = filaPac + 1
  12.     If filaPac > uf Then filaPac = uf
  13.     ' Mostrar los datos de la fila indicada
  14.     mostrarDatos(filaPac)
  15. End Sub
  16.  
  17.  

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