Usuario
"Expresión demasiado compleja" - ACCESS 2016 CON VB.NET

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
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).
-
-
Aquí tienes el enlace a la documentación de Microsoft:
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).