• 存储过程返回多个结果集,它在程序中这样做...


    前言

    面对存储过程返回多个结果集,我们在.NET应用程序中如何处理呢?

    存储过程

    脚本如下:

    CREATE PROCEDURE PROCEDURENAME
    AS
    BEGIN
      BEGIN
        IF OBJECT_ID('TABLE1') IS NOT NULL 
    	DROP TABLE TABLE1
        CREATE TABLE TABLE1 (ID INT PRIMARY KEY IDENTITY(1,1),[NAME] VARCHAR(50),AGE INT)
        INSERT INTO  TABLE1 ([NAME],AGE) VALUES('大卫1',50) 
        INSERT INTO  TABLE1 ([NAME],AGE) VALUES('约翰1',35) 
        
        IF OBJECT_ID('TABLE2') IS NOT NULL 
    	DROP TABLE TABLE2
        CREATE TABLE TABLE2 (ID INT PRIMARY KEY IDENTITY(1,1),[NAME] VARCHAR(50),AGE INT)
        INSERT INTO  TABLE2 ([NAME],AGE) VALUES('大卫2',50) 
        INSERT INTO  TABLE2 ([NAME],AGE) VALUES('约翰2',35) 
        
        IF OBJECT_ID('TABLE3') IS NOT NULL 
    	DROP TABLE TABLE3
        CREATE TABLE TABLE3 (ID INT PRIMARY KEY IDENTITY(1,1),[NAME] VARCHAR(50),AGE INT)
        INSERT INTO  TABLE3 ([NAME],AGE) VALUES('大卫3',50) 
        INSERT INTO  TABLE3 ([NAME],AGE) VALUES('约翰3',35) 
    
        IF OBJECT_ID('TABLE4') IS NOT NULL 
    	DROP TABLE TABLE4
        CREATE TABLE TABLE4 (ID INT PRIMARY KEY IDENTITY(1,1),[NAME] VARCHAR(50),AGE INT)
        INSERT INTO  TABLE4 ([NAME],AGE) VALUES('大卫4',50) 
        INSERT INTO  TABLE4 ([NAME],AGE) VALUES('约翰4',35) 
      END
      
      BEGIN
        SELECT * FROM TABLE1 //数据集1
        SELECT * FROM TABLE2 //数据集2
        SELECT * FROM TABLE3 //数据集3
        SELECT * FROM TABLE4 //数据集4
      END
    
    END
    
    

    程序中调用存储过程

    代码如下:

    public DataSet GetProcedureName(out string out outVal)
    {
        using(var db = new Entities())
        {
            var command=db.Database.Connection.CreateCommand(); //创建command的链接
            command.CommandType = CommandType.StoredProcedure;  //指向CommandType 为存储过程类型
            command.CommandText = "PROCEDURENAME";              //存储过程名称
            command.Parameters.AddRange(new SqlParameter[]{
                new SqlParameter("paraKey1",paraVal1),//输入参数
                new SqlParameter("paraKey2",paraVal2) //输出参数
                {
                    Direction = ParameterDirection.Output, //指向该参数是输出参数
                    SqlDbType = SqlDbType.VarChar,         //输出参数的类型
                    Size = 200                             //输出参数的大小
                },
            });
            using(var adapter=new SqlDataAdapter(command as SqlCommand))
            {
                DataSet dataSet = new DataSet();//声明数据集
                adapter.Fill(dataSet);          //添加数据集
                outVal = command.Parameters[1].Value.ToString();
                return dataSet;                 //返回数据集
            }
        }
    }
    

    .NET WEBAPI 中调用

    代码如下:

    public HttpResponseMessage GetProcedureName()
    {
        DataSet result = new DataSet(); //声明数据集
        result = GetProcedureName();    //调用方法
        return Json(new APIResultModel()
        {
            result = new
            {
               data1 = result.Tables[0],
               data2 = result.Tables[1],
               data3 = result.Tables[2],
               data4 = result.Tables[3],
            }
        });
    }
    

    总结

    使用此方法,可以完全避免EF对存储过程的更新。我们只需要专注于存储过程即可。

  • 相关阅读:
    python-web自动化环境安装
    python-单元测试优化,加入日志
    小谢第17问:三目运算符嵌套使用方法
    小谢第16问:1到6000的正整数正则表达式怎么写?
    小谢第15问:5到60的正整数正则表达式怎么写?
    小谢第14问:多个if语句和else if有什么区别?
    小谢第13问:输入框绑定回车enter事件自动刷新页面
    小谢第12问:初始化页面的时候子组件为什么不渲染?
    小谢第11问:vue中,子组件获取的值怎么传给父组件
    小谢第10问:前端JS下载文件、表格
  • 原文地址:https://www.cnblogs.com/ZengJiaLin/p/15160755.html
Copyright © 2020-2023  润新知