¿Por qué Dapper no ACTUALIZA datos a MS Access aunque no sea una excepción?

dapper ms-access sql

Pregunta

Usé el siguiente código para actualizar, pero no está funcionando. La llamada es exitosa; no hay excepción Pero la actualización no se refleja en la base de datos.

Cuando cambio @id a 2, tiene éxito.

OpenSqlConnection();

tm = new testmyy();
tm.ID = 2;
tm.namemy = "1233";

// update fails
string query2 = "UPDATE testmyy SET namemy = @namemy WHERE ID = @ID";  

// update successful
// query2 = "UPDATE testmyy SET namemy = @namemy WHERE ID = 2";   

int i = conn.Execute(query2, tm);

Respuesta aceptada

Use DynamicParameters . Modifique su código como a continuación:

var param = new DynamicParameters();
param.Add("@ID", 2);
param.Add("@namemy", 1233);
string query2 = "UPDATE testmyy SET namemy = @namemy WHERE ID = @ID";
int i = conn.Execute(query2, param, .....);

Respuesta experta

El problema aquí es "acceso" (desde la cadena github). El proveedor ADO.NET de acceso está algo roto: permite parámetros con nombre, pero el acceso en sí no lo hace, ¿solo es compatible ? marcadores de posición. Más: el orden en que agrega los marcadores de posición no se basa en el orden en que se encontraron los parámetros nombrados. Entonces, básicamente: el acceso es muy estricto con respecto al orden de los parámetros, lo cual no tiene importancia cuando se usan parámetros con nombre. Creo que lo que está sucediendo en su caso es que el proveedor de acceso está cambiando:

UPDATE testmyy SET namemy = @namemy WHERE ID = @ID

a

UPDATE testmyy SET namemy = ? WHERE ID = ?

pero agregando @ID entonces @namemy . Esto esencialmente invierte el orden de los parámetros.


Ahora, cómo arreglar esto. Dapper admite parámetros pseudoposicionales, destinados a proveedores que ni siquiera pretenden admitir parámetros con nombre. Access pretende, pero no es muy bueno en eso. Entonces: para activar el manejo de parámetros pseudoposicionales de dapper, use:

UPDATE testmyy SET namemy = ?namemy? WHERE ID = ?ID?

Dapper tratará esto como:

UPDATE testmyy SET namemy = ? WHERE ID = ?

y sabrá usar un orden estricto de parámetros. Básicamente, funcionará.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué