gpt4 book ai didi

oracle - ServiceStack 中的 Dapper 和 OrmLite IDBConnectionFactory

转载 作者:行者123 更新时间:2023-12-02 09:14:10 30 4
gpt4 key购买 nike

使用 ServiceStack 创建服务的速度给我留下了深刻的印象,但有一段时间我无法掌握在我的项目中同时使用 OrmLite 和 Dapper 的概念。我正在 Global.asax.cs 中注册这样的 IDbConnectionFactory

    public override void Configure(Funq.Container container)
{
var dbConnectionFactory =
new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("test"), true, OracleDialect.Provider);

container.Register<IDbConnectionFactory>(dbConnectionFactory);
container.Register<ISubscriberRepository>(
c => new SubscriberRepository(c.Resolve<IDbConnectionFactory>()));
}

这对于 OrmLite 来说效果很好,但对于 Dapper 来说就没那么简单了。也许我只是想这应该比实际更方便。在我的存储库中,我尝试调用 Oracle 存储过程。这是我在这个过程中使用 Dapper 而不是 OrmLite 的主要原因。这是我的存储库:

    public class SubscriberRepository : ISubscriberRepository {
public SubscriberRepository(IDbConnectionFactory conn) {
_conn = conn;
}

public IDbConnectionFactory _conn { get; set; }

public SubscriberResponse GetSubscriber(SubscriberRequest request) {
using (IDbConnection db = _conn.OpenDbConnection()) {
var resp = new SubscriberResponse();

List<Subscriber> s = db.Select<Subscriber>(
q => q.Subscribernum == request.Subscribernum &&
q.Personcode == request.Personcode &&
q.Clientcode == request.Clientcode);

resp.Subscriber = s[0];

return resp;
}
}


public SubscribersResponse SearchSubscribers(SubscribersRequest request) {
var response = new SubscribersResponse();

using (var cnn = new OracleConnection("this is my conneciton string")) {
cnn.Open();

var p = new OracleDynamicParameters();
p.Add("@username", "uname", OracleDbType.Varchar2);
p.Add("@Subscribernum", "", OracleDbType.Varchar2);
p.Add("@Personcode", "", OracleDbType.Varchar2);
p.Add("@Lastname", "TEST", OracleDbType.Varchar2);
p.Add("@Firstname", "HA", OracleDbType.Varchar2);
p.Add("@Mi", "", OracleDbType.Varchar2);
p.Add("@Dob", null, OracleDbType.Date);
p.Add("@MaxResults", 200, OracleDbType.Int32);
p.Add("@Curs", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);

using (SqlMapper.GridReader multi = cnn.QueryMultiple("SEARCHSUBSCRIBER", p,
commandType: CommandType.StoredProcedure)) {
List<SearchSubscriberResults> r = multi.Read<SearchSubscriberResults>().ToList();
response.Results = r;
}
}
return response;
}
}

这有效。但它在 SearchSubscribers 函数中根本没有真正使用 IDbConnectionFactory。我真的不想查看存储库中的连接字符串,因为我真的可以在服务本身中预先注册它们。

我尝试使用 ServiceStack.Razor.Dapper.SqlMapper.QueryMultiple() 但这不起作用,因为如果不使用 OracleDynamicParamaters 就无法将 Oracle sys_refcursor 映射回任何内容。解决方法。

所以,我的问题是我可以从 IDBConnectionFactory 为 Dapper 创建连接吗?

谢谢!

最佳答案

我还没有在 .NET 中使用过 Oracle(自从我使用 Perl 以来),但是 OracleConnection 实现了 IDbConnection 接口(interface)。

您应该能够转换从中获取的数据库连接:

IDbConnection db = _conn.OpenDbConnection()

并将其转换为 OracleConnection (假设 the OrmLite provider creates that same instance )。

var cnn = db as OracleConnection;

...然后您可以尝试调用所有特定于 Oracle 的内容,例如 OracleDynamicParameters。

您可能需要在 AppHost.Configure() 或其他地方进行设置:

OrmLiteConfig.DialectProvider = new OracleOrmLiteDialectProvider();

关于oracle - ServiceStack 中的 Dapper 和 OrmLite IDBConnectionFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644309/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com