博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
存储过程的输出接受强类
阅读量:5345 次
发布时间:2019-06-15

本文共 5249 字,大约阅读时间需要 17 分钟。

这个是为了后面我们使用T4模板生成存储过程的使用,这里单独拿出来学习

无参的存储过程这里就不演示了,这里演示有参的无输出的和有输出的这两种。

难点:我们可以把存储过程执行的结果填充到DataTable中,然后使用映射,把返回的字段映射到实体类,这需要我们的强类型中的字段和返回的结果集的列名保持一致,不区分大小写,或者使用逻辑让他们对应起来

注:QueryList2这个方法就实现了这一步,    这篇介绍了一个实体映射到另一个实体,参考一下就完成了QueryList2这个方法

 

无输出参数存储过程

sql

IF OBJECT_ID('[TestPro2]') IS NOT NULL    DROP PROCEDURE dbo.TestPro2;GO-- =============================================-- Author:        
-- Create date: <2019-01-29>-- Description:
<测试无输出参数的存储过程>
-- Example: EXEC dbo.TestPro2 @id = 1-- =============================================CREATE PROCEDURE [dbo].[TestPro2] (@id INT)ASSELECT *FROM dbo.tb_menuWHERE parent = @id;GO;

执行结果:

代码:

      string sqlcon = @"server=DESKTOP-UTQ1325\SQLSERVER2012;uid=sa;password=123;database=Test";            List
parameters = new List
(); string sql = " EXEC dbo.TestPro2 @id"; parameters.Add(new SqlParameter("@id", 1)); List
test = new Program().QueryList
(sqlcon, sql, parameters.ToArray()); //TestMapp是针对返回的结果创建的实体类

 

public class TestMapp    {        public int id { get; set; }        public string title { get; set; }        public int Parent { get; set; }    }

 

public List
QueryList
(string conStr, string sql, SqlParameter[] parameters) where T : class, new() { return QueryList2
(conStr, sql, parameters); } public List
QueryList2
(string conStr, string sql, SqlParameter[] parameters) { List
result = new List
(); using (SqlConnection connection = new SqlConnection(conStr)) { connection.Open(); SqlCommand command = connection.CreateCommand(); command.CommandText = sql; command.Parameters.AddRange(parameters.ToArray()); SqlDataAdapter dataAdapter = new SqlDataAdapter(command); DataTable dt = new DataTable(); dataAdapter.Fill(dt); //执行的结构填充到我们的表格中 foreach (DataRow item in dt.Rows) { T d = Activator.CreateInstance
(); Type pp = typeof(T); PropertyInfo[] ppList = pp.GetProperties(); foreach (PropertyInfo pro in pp.GetProperties()) { Type s = pro.PropertyType; pro.SetValue(d, item[pro.Name], null);//进行数据映射 } result.Add(d); } } return result; }

 运行结果:

 

 

有输出参数存储过程,这里定义的是单个输出参数

sql:  注意点:你的输出参数必须有个标识来标识他是输出参数

IF OBJECT_ID('[TestPro3]') IS NOT NULL    DROP PROCEDURE dbo.[TestPro3];GO-- =============================================-- Author:        
-- Create date: <2019-01-29>-- Description:
<测试有返回参数>
-- Example:DECLARE @Outtitle NVARCHAR(50);EXEC dbo.TestPro3 @id = 0,@Outtitle = @Outtitle OUTPUT -- =============================================CREATE PROCEDURE [dbo].[TestPro3]( @id INT, @Outtitle NVARCHAR(50) OUTPUT)ASSELECT @Outtitle = titleFROM dbo.tb_menuWHERE id = @id;SELECT *FROM dbo.tb_menuWHERE parent = @id;GO

结果:

DECLARE @Outtitle NVARCHAR(50);EXEC dbo.TestPro3 @id = 1,@Outtitle = @Outtitle OUTPUT ;select @Outtitle;

 

 

代码:我们需要在上面的方法上加个参数来保存输出参数的key和value

string sqlcon = @"server=DESKTOP-UTQ1325\SQLSERVER2012;uid=sa;password=123;database=Test";            List
parameters = new List
(); string sql = "EXEC dbo.TestPro3 @id,@Outtitle OUTPUT"; parameters.Add(new SqlParameter("@id", 1)); SqlParameter outPar = new SqlParameter("@Outtitle", SqlDbType.NVarChar, 100); outPar.Direction = ParameterDirection.Output; //标识为输出参数 parameters.Add(outPar); Dictionary
keys = new Dictionary
(); //用来存储输出参数 List
test = new Program().QueryList
(sqlcon, sql, parameters.ToArray(),keys); string returnString = keys["@Outtitle"].ToString();

 

public List
QueryList
(string conStr, string sql, SqlParameter[] parameters, Dictionary
keys = null) where T : class, new() { return QueryList2
(conStr, sql, parameters, keys); } public List
QueryList2
(string conStr, string sql, SqlParameter[] parameters, Dictionary
keys = null) { List
result = new List
(); using (SqlConnection connection = new SqlConnection(conStr)) { connection.Open(); SqlCommand command = connection.CreateCommand(); command.CommandText = sql; command.Parameters.AddRange(parameters.ToArray()); SqlDataAdapter dataAdapter = new SqlDataAdapter(command); DataTable dt = new DataTable(); dataAdapter.Fill(dt);//执行的结构填充到我们的表格中 foreach (SqlParameter item in parameters) { if (item.ParameterName.Contains("Out")) //根据你sql的标识来确定输出参数 { //这里存object类型,使用的时候自己需要转型 keys[item.ParameterName] = command.Parameters[item.ParameterName].Value; } } foreach (DataRow item in dt.Rows) { T d = Activator.CreateInstance
(); Type pp = typeof(T); PropertyInfo[] ppList = pp.GetProperties(); foreach (PropertyInfo pro in pp.GetProperties()) { Type s = pro.PropertyType; pro.SetValue(d, item[pro.Name], null);//进行数据映射 } result.Add(d); } } return result; }

 

结果:

 

 如果有输出参数你就传一个字典类型,如果没有输出参数你就不用传字典类型

 

转载于:https://www.cnblogs.com/Sea1ee/p/10334339.html

你可能感兴趣的文章
认证和授权(Authentication和Authorization)
查看>>
Mac上安装Tomcat
查看>>
CSS3中box-sizing的理解
查看>>
传统企业-全渠道营销解决方案-1
查看>>
Lucene全文检索
查看>>
awk工具-解析1
查看>>
推荐一款可以直接下载浏览器sources资源的Chrome插件
查看>>
CRM product UI里assignment block的显示隐藏逻辑
查看>>
AMH V4.5 – 基于AMH4.2的第三方开发版
查看>>
Web.Config文件配置之配置Session变量的生命周期
查看>>
mysql导入source注意点
查看>>
linux下编译安装nginx
查看>>
ArcScene 高程不同的表面无法叠加
查看>>
[ONTAK2010] Peaks
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>
参数范围的选择
查看>>
使用 MarkDown & DocFX 升级 Rafy 帮助文档
查看>>