为了账号安全,请及时绑定邮箱和手机立即绑定

从存储过程传递和返回值到视图模型

从存储过程传递和返回值到视图模型

C#
杨__羊羊 2021-11-14 14:40:55
事先,我很感激 Stackoverflow 上有很多与存储过程相关的问题和答案,我知道因为在过去的几天里我已经阅读了大量的内容,但我仍然无法理解创建存储过程的过程这将返回值到我的视图模型。这个问题分为两部分:为什么我的代码没有成功运行而是返回 -1 ?如果在您的帮助下我解决了第一个问题,然后如何将存储过程中返回的数据放入我的视图模型列表中我非常感谢社区可以给我的任何帮助......数据库名称是 Discovery表名是 Person存储过程名称是 uspGetOrgChart我的桌子CREATE TABLE Discovery.dbo.Person (     ADID nvarchar(50) NOT NULL,     First_Name nvarchar(50) NOT NULL,     Last_Name nvarchar(50) NOT NULL,     Report_To_ADID nvarchar(50) NULL,     Position_ID int NULL,     Role_ID int NULL,     IGEMS nvarchar(50) NULL,     DOB date NULL,     Start_Date date NULL,     Cost_Code nvarchar(50) NULL,     PRIMARY KEY CLUSTERED (ADID),     CONSTRAINT FK_Person_Position1          FOREIGN KEY (Position_ID) REFERENCES dbo.Position (Position_ID),     CONSTRAINT FK_Person_Role          FOREIGN KEY (Role_ID) REFERENCES dbo.Role (Role_ID))ON [PRIMARY]GO 
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

过程不能返回表。使用带有表返回值的函数:


CREATE FUNCTION  fnGetOrgChart()

RETURNS  @rtnTable TABLE 

(

---you fields

)

AS

BEGIN

DECLARE @TempTable table (id uniqueidentifier, name nvarchar(255)....)

insert into @myTable 

select from your stuff

--This select returns data

insert into @rtnTable

SELECT ID, name FROM @mytable 

return

END

请参阅有关带有表结果的函数的 microsoft 文档


然后打电话


var result = context.Database.SqlQuery<vmNewOrgChart>("select * from fnGetOrgChart()");

正如 Tetsuya Yamamoto 所建议的


否则,您必须调用存储来填充临时表,然后从临时表中选择数据并刷新它


注意。您可以轻松地将参数传递给这些函数。为简洁起见省略


查看完整回答
反对 回复 2021-11-14
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

您可以使用此解决方案:


 using (var cmd = _db.Database.GetDbConnection().CreateCommand())

                {

                    cmd.CommandText = "dbo.GetCategories"; //sp name

                    cmd.CommandType = System.Data.CommandType.StoredProcedure;

                    _db.Database.OpenConnection();

                    using (var result = cmd.ExecuteReader())

                    {

                        if (result.HasRows)

                        {

                             var List= MapToList<Category>(result);

                        }

                    }

                }


public IList<T> MapToList<T>(DbDataReader dr)

        {

            var objList = new List<T>();

            var props = typeof(T).GetRuntimeProperties();


            var colMapping = dr.GetColumnSchema()

                .Where(x => props.Any(y => y.Name.ToLower() == x.ColumnName.ToLower()))

                .ToDictionary(key => key.ColumnName.ToLower());


            if (dr.HasRows)

            {

                while (dr.Read())

                {

                    T obj = Activator.CreateInstance<T>();

                    foreach (var prop in props)

                    {

                        if (colMapping.Any(a => a.Key.ToLower() == prop.Name.ToLower()))

                        {

                            var val = dr.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);

                            prop.SetValue(obj, val == DBNull.Value ? null : val);

                        }

                    }

                    objList.Add(obj);

                }

            }

            return objList;

        }


查看完整回答
反对 回复 2021-11-14
?
桃花长相依

TA贡献1860条经验 获得超8个赞

到目前为止谢谢大家


谢谢你,这看起来更接近工作了。当我使用代码时


using (_context)

{

using (var cmd = _context.Database.GetDbConnection().CreateCommand())

{

cmd.CommandText = "exec uspGetOrgChart";

cmd.CommandType = System.Data.CommandType.StoredProcedure;


var personIdParam = cmd.CreateParameter();

personIdParam.ParameterName = "ContactID";

personIdParam.Value = id;


cmd.Parameters.Add(personIdParam);


_context.Database.OpenConnection();

using (var result = cmd.ExecuteReader())

{

if (result.HasRows)

{

// do something with results


}

}

}


}

我收到一条错误消息,无法从这一行找到存储过程,该过程肯定在那里并且可以正常工作


(var result = cmd.ExecuteReader())

我认为这是因为代码正在关闭并打开第二个连接,所以我注释掉了这一行


_context.Database.OpenConnection();

这导致连接未打开的错误。


我当前的上下文被称为


_Context 

并且正在整个应用程序的其余部分使用,我是否真的必须创建一个全新的上下文和连接才能运行该过程。


查看完整回答
反对 回复 2021-11-14
  • 3 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信