Paramètres ne fonctionnant pas avec Dapper.Net

.net c# dapper mysql

Question

J'ai téléchargé le fichier SqlMapper.cs depuis le lien ici .

Bien que j'aie un peu de mal à comprendre. Chaque fois que j'utilise des paramètres, mes requêtes renvoient des collections vides, même si je suis sûr d'utiliser les mêmes données de chaîne.

Voici un extrait de code utilisé pour extraire les données.

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();
}

Voici ma classe que j'utilise ...

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

Et voici la fonction wrapper dans mon objet PhoenixConnection.

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

J'ai essayé:

  • vérifier les noms et les valeurs de la table mysql
  • changer le wrapper pour utiliser autre chose que dynamique (ne fonctionne pas)
  • la vérification de la connexion est ouverte
  • Objet mysqlConnection brut, texte de commande, etc.

Que pourrais-je manquer ?

Y a-t-il un paramètre spécial utilisé pour les paramètres?

Modifier:

Utiliser les paramètres bruts de MySqlConnection fonctionne mieux avec ? et pas @ , bien que Dapper ne fonctionne toujours pas.

J'ai remarqué qu'il y avait des lignes spécifiques dans Dapper qui extraient les paramètres avec des instructions regex ( [@:] ), bien que les points d'interrogation semblent être ignorés. Que dois-je changer pour me donner les résultats attendus?

Réponse acceptée

J'ai trouvé le problème. Après avoir utilisé un objet MySqlConnection brut pour exécuter mes requêtes, cela m'a amené à rechercher pourquoi les symboles @ ne fonctionnaient dans aucune de mes déclarations. Dans le passé, j'ai toujours utilisé ? , donc ce comportement était étrange pour moi.

Changer SqlMapper.cs

Changez les symboles @ suivants en a ? (avec des numéros de ligne approximatifs) :

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

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

Résolu mon problème!



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi