EF/VB.NET下未知查询结果类型时如何执行存储过程并展示数据
解决方案
你遇到的场景核心限制是EF的Database.SqlQuery方法依赖强类型模型做列映射,未知返回结构时无法直接获取列和值的对应关系,可直接通过EF上下文暴露的原生数据库连接获取动态结构的结果,再绑定到WPF DataGrid即可,具体实现如下:
1. 执行存储过程返回动态结构DataTable
直接复用EF上下文的数据库连接执行存储过程,将结果加载到自带列结构存储的DataTable中,无需提前定义模型:
using System.Data; using System.Data.Common; using System.Data.SqlClient; // dbContext为你已实例化的EF上下文对象 public DataTable ExecuteDynamicStoredProcedure(string procName, SqlParameter[] parameters) { var resultTable = new DataTable(); using (var conn = dbContext.Database.Connection) { using (var cmd = conn.CreateCommand()) { cmd.CommandText = procName; cmd.CommandType = CommandType.StoredProcedure; if (parameters != null) { cmd.Parameters.AddRange(parameters); } if (conn.State != ConnectionState.Open) { conn.Open(); } using (var reader = cmd.ExecuteReader()) { // 自动读取存储过程返回的列结构和所有数据 resultTable.Load(reader); } } } return resultTable; }
2. 绑定到WPF DataGrid展示
WPF DataGrid默认开启自动生成列配置,直接将DataTable绑定即可自动渲染所有返回列:
XAML代码
<DataGrid x:Name="ResultGrid" AutoGenerateColumns="True" />
后台绑定代码
// 执行存储过程后直接绑定 var result = ExecuteDynamicStoredProcedure("你的存储过程名称", 入参数组); ResultGrid.ItemsSource = result.DefaultView;
可选优化
- 若存储过程返回多个结果集,可调用
reader.NextResult()循环加载多个DataTable到DataSet中,按需切换展示 - 若需要自定义特殊类型(如二进制、枚举)的列展示,可订阅DataGrid的
AutoGeneratingColumn事件,在列生成时做自定义适配
内容的提问来源于stack exchange,提问作者Michael Bayer
相关产品推荐
相关产品推荐

