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
Ir a la versión completa