我正在使用Devforce 2012,我需要从存储过程返回多结果集以绑定到报表(相关实体或DataSet)。这可以在DF 2012中完成吗?
我已将存储过程添加到EDM,但结果仅包含第一个表。
提前谢谢你。
答案 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();
}
}