为什么dapper将每个数字列作为Int64返回?

时间:2016-05-30 22:27:41

标签: c# .net dapper

我有以下查询:

SELECT
  [Person].[Id] AS [Person_Id],
  [Person].[Name] AS [Person_Name],
  [Address].[Id] AS [Address_Id],
  [Address].[Number] AS [Address_Number],
  [Address].[Street] AS [Address_Street],        
FROM [Person]
LEFT JOIN [Address] ON [Person].[addressId] = [Address].[Id]

用于查询SQLite内存数据库中的内容:

var rows = _database.Query(query);

但是,当我尝试将值读为Int32时,我得到InvalidCastException

foreach (IDictionary<string, object> row in rows)
{
    var someId = (int)row["Person_Id"];
    var someNumber = (int)row["Address_Number"];
}

我之所以使用dapper,是因为作为一个辅助项目,我在dapper之上构建了一些功能,以将值映射到POCO(我知道类似的项目,例如rainbowdapper.extensions等。

这就是:

var rowVal = row[fieldName];
propInfo.SetValue(obj, rowVal, null);    

再次,忽略与反射调用相关的性能成本。

在上面的示例中,POCO的属性类型为int32,由于此问题,我无法将值分配给obj

非常感谢任何帮助或想法。

1 个答案:

答案 0 :(得分:5)

它不是Dapper,它是SQLite。请参阅Datatypes In SQLite Version 3(假设您实际上正在使用v3):

  

例如,INTEGER存储类包含6种不同长度的不同整数数据类型。这在磁盘上有所不同。 B ut一旦从磁盘读取INTEGER值并进入内存进行处理,它们就会转换为最通用的数据类型(8字节有符号整数)。因此,在大多数情况下,&#34;存储类&#34;与&#34;数据类型&#34;无法区分这两个术语可以互换使用。