Devforce 2012存储过程返回多结果集至报表的实现疑问
解决DevForce 2012存储过程多结果集返回问题
嘿,没问题!DevForce 2012完全支持从存储过程获取多结果集,只是默认通过EDM添加的存储过程生成的方法只会返回第一个结果集而已,咱们手动处理一下就能拿到所有结果~
下面是具体的实现步骤,不管你是要绑定到关联实体还是DataSet都适用:
方法一:映射到实体类
如果你想把结果集映射到EDM里的实体类型,可以这么做:
- 先创建存储过程的命令对象,并配置参数(如果有的话):
// 假设你的EntityManager实例叫em var cmd = em.Connection.CreateCommand(); cmd.CommandText = "你的存储过程名称"; cmd.CommandType = System.Data.CommandType.StoredProcedure; // 给存储过程加参数(如果需要的话) // cmd.Parameters.Add(new SqlParameter("@你的参数名", 参数值));
- 打开连接并执行命令,用
Translate方法逐个读取结果集:
if (em.Connection.State != System.Data.ConnectionState.Open) { em.Connection.Open(); } using (var reader = cmd.ExecuteReader()) { // 读取第一个结果集,映射到对应实体 var firstEntityList = em.Translate<你的第一个实体类型>(reader).ToList(); // 切换到第二个结果集 reader.NextResult(); // 读取第二个结果集,映射到第二个实体 var secondEntityList = em.Translate<你的第二个实体类型>(reader).ToList(); // 如果还有更多结果集,重复调用NextResult()和Translate()即可 }
方法二:填充到DataSet
如果需要把结果集放到DataSet里绑定报表,直接用DataSet.Load更方便:
var dataSet = new DataSet(); var cmd = em.Connection.CreateCommand(); cmd.CommandText = "你的存储过程名称"; cmd.CommandType = System.Data.CommandType.StoredProcedure; if (em.Connection.State != System.Data.ConnectionState.Open) { em.Connection.Open(); } using (var reader = cmd.ExecuteReader()) { // 把所有结果集加载到DataSet,指定表名 dataSet.Load(reader, System.Data.LoadOption.OverwriteChanges, "表1", "表2", "表3"); } // 现在dataSet里就有所有结果集对应的DataTable了,直接绑定报表就行
为什么EDM自动生成的方法只返回第一个结果?
因为EDM导入存储过程时,默认只会检测并映射第一个结果集的结构,生成的函数导入也就只会返回这一个结果。所以要获取多结果集,必须手动用DbDataReader来处理~
内容的提问来源于stack exchange,提问作者MikeyT
相关产品推荐
相关产品推荐

