2015-04-22 68 views
5

我想使用dapper查詢dbf文件。在我的文件example.dbf我有兩列:Dapper:無法從dbf解析字符串(錯誤解析列)

  1. 值 - 類型NUMERIC
  2. 名稱 - 類型CHARACTER

我寫的類ExampleDbf

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

現在我想寫兩個簡單查詢

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

那麼listOne都OK,但是當我執行listTwo我有以下System.Data.DataException:

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

當我使用標準的DataReader我必須寫類似的東西

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

當然我可能喜歡寫東西這樣的:

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

所以現在它的工作原理

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

但是這個解決方案非常難看,也許有人有更好的解決方案。

+0

來自DB的數據是字符數據;小巧玲瓏從來不會爲你做出編碼決定:這個問題太不明瞭......如果你想要的話,你可以使用墊片屬性...... –

回答

6

您可以隨時返回動態,然後將其映射到對象並在對象初始化期間執行變換操作。

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