多结果存储过程

时间:2018-01-10 09:19:17

标签: devforce

我正在使用Devforce 2012,我需要从存储过程返回多结果集以绑定到报表(相关实体或DataSet)。这可以在DF 2012中完成吗?

我已将存储过程添加到EDM,但结果仅包含第一个表。

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

您不能直接使用StoredProcQuery执行此操作,但可以通过调用的服务器方法执行此操作。它有点曲折,服务器方法需要使用本机连接来执行读取器并处理结果,然后返回DevForce EntityCacheState。然后,您将EntityCacheState加载到EntityManager。它看起来像这样:

- 在客户端 -

  var em = new NorthwindEntities();
  var ecs = em.InvokeServerMethod("Mynamespace.MyClass, MyExe", "TestProc") as EntityCacheState;
  em.CacheStateManager.RestoreCacheState(ecs);

在服务器上,获取连接有点棘手 - 您可以从连接字符串轻松创建EF ObjectContext,然后从中创建DbContext,然后打开并使用连接。例如:

- 在服务器上

[AllowRpc]
public static EntityCacheState TestProc(IPrincipal principal, EntityManager em, params Object[] args) {
  var cs = ((ClientEdmKey)em.DataSourceResolver.GetDataSourceKey("NorthwindEntities")).ConnectionString;
  using (var ctx = new ObjectContext(cs))
  using (var db = new DbContext(ctx, true)) {
    var cn = db.Database.Connection;
    cn.Open();
    var cmd = cn.CreateCommand();
    cmd.CommandText = "[dbo].[mystoredproc]";

    // Let's say this proc returns Customers and Suppliers
    // Read each result set and attach entities to the EM

    var reader = cmd.ExecuteReader();
    var customers = ctx.Translate<Customer>(reader);
    em.AttachEntities(customers);

    reader.NextResult();
    var suppliers = ctx.Translate<Supplier>(reader);
    em.AttachEntities(suppliers);

    // Return the EntityCacheState to the client
    return em.CacheStateManager.GetCacheState();
  }
}