2015-04-22 4 views
5

Ich möchte Dapper verwenden, um über dbf-Dateien abzufragen. In meiner Datei example.dbf habe ich zwei Spalten:Dapper: Nicht in der Lage, String von DBF zu analysieren (Error analysing column)

  1. Wert - Typ numeric
  2. Name - Typ CHARACTER

Ich schreibe Klasse ExampleDbf

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

Jetzt will ich schreiben zwei einfache Abfrage

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

LISTONE sind in Ordnung, aber wenn ich listTwo ausführen ich habe folgende System.Data.DataException:

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

Wenn ich Standard Datareader verwende ich etwas wie das

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

Natürlich schreiben muss ich etwas schreiben kann wie dies:

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

es So funktioniert nun

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

Aber diese Lösung ist sehr hässlich, vielleicht hat jemand eine bessere Lösung.

+0

Die Daten aus dem DB sind Zeichendaten; Dapper wird niemals 'Encoding' Entscheidungen in Ihrem Namen treffen: das ist eine viel zu unklare Frage ... Sie könnten eine Shim-Eigenschaft verwenden, wenn Sie wollten ... –

Antwort

6

Sie könnten immer eine dynamische Variable zurückgeben und sie dann Ihrem Objekt zuordnen und die Transformationsoperation während der Objektinitialisierung durchführen.

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(); 
Verwandte Themen