SQLite 作为 SQL Server 的内存数据库

Posted

技术标签:

【中文标题】SQLite 作为 SQL Server 的内存数据库【英文标题】:SQLite as in-memory database for SQL Server 【发布时间】:2016-11-01 21:20:30 【问题描述】:

我的设置类似于使用内存中的 SQLite (http://mikhail.io/2016/02/unit-testing-dapper-repositories/) 测试对 SQL Server 的 dapper 调用,使用以下库:https://github.com/ServiceStack/ServiceStack.OrmLite

我正在为我的 DAL 使用带有 ad hoc SQL 的 dapper,并且想在不依赖 SQL Server 的情况下测试数据访问层。我使用 SQLite 内存数据库。问题是 SQL Server 和 SQLite 之间的 SQL 语法不同。

例如,我有一个使用偏移量返回分页结果并获取下一个的查询,但 SQLite 仅支持限制和偏移量。

如果您对我进行内存单元测试有什么建议怎么办?我没有使用模拟的 db 上下文进行 EF 路由,因为 dapper 性能更高,并且不想使用存储过程,因为我也想测试我的 SQL。我不想模拟我的数据库调用。

【问题讨论】:

【参考方案1】:

Ormlite 的 Typed API 与 RDBMS 无关,因此只要您坚持使用 OrmLite 的 Typed API,您就可以通过更改连接字符串和方言提供者轻松地在不同数据库之间切换,例如:

//SQL Server
var dbFactory = new OrmLiteConnectionFactory(connectionString,  
    SqlServerDialect.Provider);

//InMemory Sqlite DB
var dbFactory = new OrmLiteConnectionFactory(":memory:", 
    SqliteDialect.Provider); 

然后您可以使用任一数据库来创建、持久化和查询 POCO,例如:

using (var db = dbFactory.Open())

    db.DropAndCreateTable<Poco>();
    db.Insert(new Poco  Name = name );
    var results = db.Select<Poco>(x => x.Name == name);
    results.PrintDump();

但如果使用Custom SQL API's to execute MSSQL-specific SQL,您将无法针对 SQLite 执行该操作。您可以使用mockable support in OrmLite,但我个人建议改用 OrmLite 的 RDBMS 不可知类型 API。

【讨论】:

以上是关于SQLite 作为 SQL Server 的内存数据库的主要内容,如果未能解决你的问题,请参考以下文章

SQLite玩转

SQL Server CE 性能

将 SQL Server 数据库导出到 sqlite(或 SQL Server Compact)的最佳方式

SQLite 中是不是可以进行十进制数约束?

Windows 应用程序 SQL Server Express / SQLite / SQL Server CE 的最佳选择是哪个? [关闭]

从 SQLite 导出到 SQL Server