微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在一个视图/控制器中使用带有连接表的多个存储过程?

如何解决如何在一个视图/控制器中使用带有连接表的多个存储过程?

我创建了多个带有连接操作的存储过程。我试图在我的 ASP.NET MVC 应用程序中使用这些存储过程,但它不起作用。我在单个视图上调用这些存储过程。我正在使用实体框架进行通信。到数据库

基本上,我必须根据特定条件调用这些存储过程,这意味着必须在单个视图上的存储过程之间切换。

有没有人知道在单个视图中调用这样的存储过程?

这是我的两个存储过程:

CREATE PROCEDURE sp_GetTotalRecordsByAccountNumber
    @branch varchar(4),@basic varchar(6),@suffix varchar(3)
AS 
BEGIN
    SELECT
        Date AS 'Date',desc1 + RTRIM(LTRIM(ISNULL(desc2,''))) + '' +
                RTRIM(LTRIM(ISNULL(desc2,''))) AS 'Description',ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt / Currency) END,0) AS Debit,ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt / Currency) END,0) AS Credit,(TotalAmount / currency) AS Balance
    FROM
        tbl1
    LEFT OUTER JOIN 
        tbl2 ON tbl1.accountnumber = tbl2.accountnumber
    LEFT OUTER JOIN 
        tbl3 ON tbl1.currency = tbl3.currency
    LEFT OUTER JOIN 
        tbl4 ON tbl1.accountName = tbl4.accountName
    WHERE
        branch = @branch 
        AND basic = @basic 
        AND suffix = @suffix
    ORDER BY 
        date 
END

CREATE PROCEDURE sp_GetTotalRecordsByDates
    @branch varchar(4),@suffix varchar(3),@startdate datetime,@enddate datetime
AS
BEGIN
    SELECT 
        Date AS 'Date',ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt/Currency) END,ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt/Currency) END,(TotalAmount/currency) AS Balance
    FROM
        tbl1
    LEFT OUTER JOIN 
        tbl2 ON tbl1.accountnumber = tbl2.accountnumber
    LEFT OUTER JOIN 
        tbl3 ON tbl1.currency = tbl3.currency
    LEFT OUTER JOIN 
        tbl4 ON tbl1.accountName = tbl4.accountName
    WHERE 
        branch = @branch 
        AND basic = @basic 
        AND suffix = @suffix
        AND date BETWEEN @startdate AND @enddate
    ORDER BY 
        date date
END

我的控制器是:

[HttpPost]
public ActionResult Index(FormCollection formCollection,string accountNo,string date,bool allcheckBox) 
{  
    if(allcheckBox == true) 
    {
       var dc = db.sp_GetTotalRecordsByAccountNumber(accountNo).ToList();
    }
    else
    {
       var dc = db.sp_GetTotalRecordsByDates(accountNo).ToList();
    }

    return view("Index",dc);
}

我的观点是:

@model IEnumerable<ComplexStoredProceduremvc.Models.sp_GetTotalRecordsByAccountNumber_Result>

这里,如果我想按日期获取数据,它只按帐号提供数据,然后我必须更改存储过程名称,这不是正确的选项。

我希望你能解决这个问题......等待一些解决方案......帮助!

解决方法

我认为你可以用下面的一个 SP 处理这两种情况

CREATE PROCEDURE sp_GetTotalRecordsByDates
@branch varchar(4)='0',@basic varchar(6)='0',@suffix varchar(3)='0',@startdate datetime=null,@enddate datetime=null
AS
BEGIN
SELECT 
    Date AS 'Date',desc1 + RTRIM(LTRIM(ISNULL(desc2,''))) + '' +
            RTRIM(LTRIM(ISNULL(desc2,''))) AS 'Description',ISNULL(CASE WHEN Amount < 0 THEN (Transactionamt/Currency) END,0) AS Debit,ISNULL(CASE WHEN Amount > 0 THEN (Transactionamt/Currency) END,0) AS Credit,(TotalAmount/currency) AS Balance
FROM
    tbl1
LEFT OUTER JOIN 
    tbl2 ON tbl1.accountnumber = tbl2.accountnumber
LEFT OUTER JOIN 
    tbl3 ON tbl1.currency = tbl3.currency
LEFT OUTER JOIN 
    tbl4 ON tbl1.accountName = tbl4.accountName
WHERE 
    (branch = @branch or @branch='0')
    AND (basic = @basic or @basic='0')
    AND (suffix = @suffix or @suffix ='0')
    AND (date >= @startdate or @startdate is null)
    AND (date <= @enddate or @enddate is null)
ORDER BY 
    date
END

只要确定您是否不想使用某些 parameter 进行过滤,将其作为 0 or null 传递。在本例中,我使用 0 表示 varchar,使用 null 表示日期。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。