14

我正在围绕 servicestack 框架构建一个应用程序,并且需要能够访问 Oracle 和 MS Sql Server 中的数据。这是否可以使用 ORMLite,似乎我只能为应用程序设置一种方言,或者我错过了什么?

4

1 回答 1

16

是的,这是可能的,并且已经内置了对此的支持OrmLiteConnectionFactory,请参阅OrmLite 项目主页上的 Master SQLServer + Sqlite 分片示例

基本上你会先注册你的默认(或主)连接:

var dbFactory = new OrmLiteConnectionFactory(
  "Data Source=host;Initial Catalog=RobotsMaster;Integrated Security=SSPI", 
  SqlServerDialect.Provider); 

然后,您将为您希望支持的每个其他连接注册一个命名连接,例如:

dbFactory.RegisterConnection("shard-1", 
  "~/App_Data/{0}.sqlite".Fmt(shardId).MapAbsolutePath(),
    SqliteDialect.Provider);

配置完成后,打开连接而不指定名称将打开到默认数据库的连接,例如:

using (IDbConnection db = dbFactory.OpenDbConnection()) { ... } //Default DB

虽然您可以指定一个名称以打开与具有不同提供程序的数据库的命名连接,例如:

using (var dbShard = dbFactory.OpenDbConnection("shard-1")) { ... } //Named DB

手动使用不同的方言提供者

不同 RDBMS 之间的 SQL 提供程序实现之间的差异包含在每个方言提供程序中。因此,如果您想针对特定的 ADO.NET 提供程序实现使用 OrmLite 的便利扩展方法,您只需分配您希望使用的 ThreadStatic DialectProvider,例如:

OrmLiteConfig.DialectProvider = SqlServerDialect.Provider;
var dbConn = new SqlConnection(SqlServerConnString);
dbConn.Select<Table>(); //All db access now uses the above dialect provider

这基本上就是RegisterConnectionOrmLiteConnectionFactory 在幕后自动为您所做的所有事情。

到目前为止,OrmLite 的所有方言提供程序供参考:

  • SqlServerDialect.Provider
  • SqliteDialect.Provider(不同的 32/64 和 Mono impls 可用)
  • MySqlDialect.Provider
  • PostgreSqlDialect.Provider
  • Oracle方言提供者
  • FirebirdDialect.Provider
于 2012-12-03T22:56:11.507 回答