Dapper: impossible d'analyser la chaîne à partir de dbf (colonne d'analyse d'erreur)

c# dapper dbf

Question

Je veux utiliser dapper pour interroger des fichiers dbf. Dans mon fichier example.dbf, j'ai deux colonnes:

  1. Valeur - type NUMERIC
  2. Nom - type CARACTERE

J'écris la classe ExampleDbf

class ExampleDbf
{
    public int Value { get; set; }
    public string Name { get; set; }
}

Maintenant, je veux écrire deux requêtes simples

var listOne = connection.Query<ExampleDbf>("SELECT value FROM Example");
var listTwo = connection.Query<ExampleDbf>("SELECT name, value FROM Example");

ListOne est OK mais quand j'exécute listTwo j'ai suivi System.Data.DataException:

Additional information: Error parsing column 0 (name=System.Byte[] - Object)

Lorsque j'utilise DataReader standard, je dois écrire quelque chose comme ça

example.name = System.Text.Encoding.ASCII.GetString((byte[])reader["name"]).Trim();

Bien sûr, je peux écrire quelque chose comme ceci:

class ExampleDbf2
{
    public int Value { get; set; }
    public byte[] Name { get; set; }
    public string StringName
    {
        get
        {
            return System.Text.Encoding.ASCII.GetString((byte[])Name ).Trim();
        }
    }
}

Alors maintenant ça marche

var listTwo = connection.Query<ExampleDbf2>("SELECT name, value FROM Example");

Mais cette solution est très laide, peut-être que quelqu'un a une meilleure solution.

Réponse acceptée

Vous pouvez toujours renvoyer une dynamique, puis la mapper à votre objet et effectuer l'opération de transformation lors de l'initialisation de l'objet.

var listTwo = connection.Query<dynamic>("SELECT name, value FROM Example")
    .Select(x => new ExampleDbf 
        { 
            Value = x.value,  
            Name = System.Text.Encoding.ASCII.GetString((byte[])x.name).Trim()
        }).ToList();



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