【问题标题】:sqlite and sqlserver with dappersqlite 和 sqlserver 与 dapper
【发布时间】:2012-07-18 21:11:38
【问题描述】:

我在 SQL Server 中使用 dapper,但在我的单元测试中使用 Sqlite 进行一些内存测试。

我有一堂课如下

public class Test
{
  public int ID {get;set;}
  public string Name 
}

如果我使用带有 SQL Server 连接的 dapper 进行查询,它可以正常工作。

如果我使用带有 SQLite 连接的 dapper 进行查询,我会收到类型转换错误。基本上我需要将 ID 的类型更改为 long,而不是 int。

我不想在 SQL Server 中更改我的架构,所以我想知道是否有针对该场景的解决方法。我尝试使用隐式转换为 long/int 创建和 ID 类,但这也失败了,而且我没有想法!

【问题讨论】:

  • 你是怎么定义sqlite表的?

标签: sql-server unit-testing dapper system.data.sqlite


【解决方案1】:

这围绕着 Dapper 在 IDataRecord 接口上使用 GetValue 方法这一事实。 System.Data.SqlLite 命名空间中的具体类可能映射值与 System.Data.SqlClient 不同。

正如@FelicePollano 指出的,尝试更改 SQLLite 表的结构,看看这是否会导致 System.Data.SqlLite 中的具体类以不同方式映射它。

另一种选择是使用 Dapper 返回的 FastExpando 对象滚动您自己的映射,并强制它将值转换为 Int。

IEnumerable<dynamic> results = Conn.Query("Select ID from SomeTable");

var testValue = new Test
{
    ID = Convert.ToInt32(Results[0].ID.ToString())
};

不是很喜欢它,因为它可能需要大量代码更改,但它可以工作。

请注意:如果 ID 列不是整数,该示例代码可能会引发异常。您可以使用 TryParse,但为了简洁起见,我没有包含它。

【讨论】:

    【解决方案2】:

    尝试创建将 INTEGER 的长度指定为 4 个字节的 sqlite 表。也许这个问题也会有所帮助:What is the difference between SQLite integer data types like int, integer, bigint, etc.?

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多