Los parámetros no funcionan con Dapper.Net

.net c# dapper mysql

Pregunta

He descargado el archivo SqlMapper.cs desde el enlace aquí .

Aunque estoy teniendo un problema confuso. Cada vez que uso parámetros, mis consultas devuelven colecciones vacías, aunque estoy bastante seguro de que estoy usando los mismos datos de cadena.

Aquí hay un fragmento de código que se usa para extraer los datos.

using (PhoenixConnection connection = new PhoenixConnection(Open: true))
{
    //this example works, returns 1 token object
    string queryWorks = @"Select AccountName, AccountToken from btsource.accounts
    where AccountName = 'RekindledPhoenix'";

    // replaces 'RekindledPhoenix' with a parameter, returns empty collection
    string queryDoesnt = @"Select AccountName, AccountToken from btsource.accounts 
    where AccountName = @AccountName";

    var tokenList = connection.Query<TokenRequest>(queryWorks);
    var tokenList = connection.Query<TokenRequest>(queryDoesnt, new { AccountName = "RekindledPhoenix" });
    return tokenList.FirstOrDefault();
}

Aquí está mi clase que estoy usando ...

public class TokenRequest
{
    public string AccountName { get; set; } //`AccountName` VARCHAR(50) NOT NULL
    public long AccountToken { get; set; } //`AccountToken` BIGINT(20) NOT NULL
}

Y aquí está la función de envoltura en mi objeto PhoenixConnection.

public IEnumerable<T> Query<T>(string Query, dynamic Parameters = null)
{
    return _connection.Query<T>(Query, (object)Parameters);
}

He intentado:

  • comprobando dos veces los nombres y valores de la tabla mysql
  • cambio de envoltura para usar cualquier cosa menos dinámica (no funcionó)
  • verificando la conexión está abierta
  • objeto raw mysqlConnection, commandtext, etc.

¿Qué podría estar perdiendo ?

¿Hay alguna configuración especial utilizada para los parámetros?

Editar:

El uso de parámetros Raw MySqlConnection funciona mejor con ? y no @ , aunque todavía no funciona con Dapper.

Noté que había líneas específicas dentro de Dapper que extraían parámetros con expresiones regex ( [@:] ), aunque parece que se ignoran los signos de interrogación. ¿Qué debería cambiar para darme los resultados esperados?

Respuesta aceptada

Encontré el problema. Después de usar un objeto raw MySqlConnection para ejecutar mis consultas, me llevó a buscar por qué @ símbolos no funcionaban en ninguna de mis declaraciones. En el pasado, siempre he usado ? , por lo que este comportamiento fue extraño para mí.

Cambiando SqlMapper.cs

Cambiar los siguientes símbolos @ a ? (con números de línea aproximados) :

Línea 1863: if (identity.sql.IndexOf(" ? " + prop.Name, StringComparison.InvariantCultureIgnoreCase) < 0

Línea 1831: return parameters.Where(p => Regex.IsMatch(sql, "[ ? :]" + p.Name + "([^a-zA-Z0-9_]+|$)", RegexOptions.IgnoreCase | RegexOptions.Multiline));

¡Resolvió mi problema!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow