none
"Expresión demasiado compleja" - ACCESS 2016 CON VB.NET RRS feed

  • Pregunta

  • Buenas Tardes a Todos

    Tengo un problema en VB.NET 2012

    Tengo una tabla de productos con 99 campos en ACCESS e hice la conexión con VB.net 2012 y tengo los códigos en vb.net de esta manera:

    DimstrConexión AsString= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\basededatosa.accdb"
    DimstrComando AsString= "Select * from aa_productos"
    DimDA AsOleDbDataAdapter
    DimDS AsNewDataSet()
    DimCB AsOleDbCommandBuilderDimPosicion AsInteger

    Private Subfrm_productos_Load(sender As Object, e As EventArgs) Handles MyBase.Load



    Try


     DA = NewOleDbDataAdapter(strComando, strConexión)

       DA.Fill(DS,"aa_productos")

      CB = NewOleDbCommandBuilder(DA)


    tb_cod_interno.DataBindings.Add(NewBinding("Text", DS, "aa_productos.cod_int"))
    tb_cod_pro.DataBindings.Add(NewBinding("Text", DS, "aa_productos.cod_pro"))
    tb_cod_cat.DataBindings.Add(NewBinding("Text", DS, "aa_productos.cod_cat"))tb_npro.DataBindings.Add(NewBinding("Text", DS, "aa_productos.nom_pro"))
    tb_cat.DataBindings.Add(NewBinding("Text", DS, "aa_productos.nom_cat"))
    cb_cla_pro.DataBindings.Add(NewBinding("Text", DS, "aa_productos.clase_pro"))


    Catchex AsException

                MsgBox(ex.Message)  

    EndTry

    EndSub

    Luego le doy ejecutar en vb.net y actualizo los datos el botón "Guardar"y me sale este error diciendo : "Expresión demasiado compleja"

    ¿Que puedo hacer para resolver este problema?

    Saludos




    Roger García

    domingo, 31 de diciembre de 2017 22:23

Todas las respuestas

  • Cuando usas el OleDbCommandBuilder tal como lo estás usando, te genera un UpdateCommand que por dentro mete un WHERE que compara todos y cada uno de los campos del registro:

    Update tabla set campo1=nuevoValor1, ... where campo1=valorAnterior1 AND campo2=valorAnterior2 AND...

    Esto lo hace para llevar el control de concurrencia, de forma que si desde otro puesto han modificado el registro mientras tanto, no se cumple el Where, el rowsAffected es 0, y al ver que es 0 se dispara la excepción de infracción de concurrencia.

    Sospecho que con 99 campos, el Where con 99 ANDs queda demasiado complejo y por eso el motor de base de datos lo está rechazando con el error que ves.

    Me temo que para resolverlo vas a tener que prescindir de este automatismo. En lugar de usar el OleDbCommandBuilder tendrás que construir a mano el UpdateCommand del OleDbCommand, y ponerle una expresión más simple para el control de concurrencia (o suprimirlo por completo si sabes con seguridad que tu programa no va a tener errores de concurrencia).

    lunes, 1 de enero de 2018 9:06
  • Gracias Alberto. ahora veré el cambio. una ayuda. tendrás un ejemplo de ¿como actualizar Usando el UpdateCommand del OleDbCommand?

    Gracias
    Saludos


    Roger García

    lunes, 1 de enero de 2018 23:49
  • Aquí tienes el enlace a la documentación de Microsoft:

    https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand(v=vs.110).aspx

    Si bajas hasta el ejemplo, verás cómo asigna las sentencias y sus parámetros a los cuatro Commands del DataAdatper. Esto es el equivalente a lo que hace internamente el CommandBuilder que tú estás usando. La diferencia es que si lo haces a mano puedes "ajustar" las sentencias a mano, mientras que el CommandBuilder siempre las hace en un formato fijo.

    Una vez que has usado ese mecanismo para configurar el DataAdapter, se usa de la misma manera, es decir, puedes llamar a sus métodos Fill y Update exactamente igual a como los estás llamando ahora mismo.

    Aunque el ejemplo usa el SqlClient, ese principio de funcionamiento es igualmente aplicable al OleDbClient que tú estás usando. Desde el punto de vista de los commands internos, el OleDbDataAdapter funciona igual que el SqlDataAdapter del ejemplo (pero como es lógico las sentencias SQL y sus parámetros tienen que ser compatibles con el cliente de OleDb que estés usando, en lugar de con SQL Server).

    martes, 2 de enero de 2018 9:08