从包含EF6 / MVC5中的多个查询的存储过程返回数据

时间:2014-10-09 16:27:27

标签: entity-framework stored-procedures asp.net-mvc-5

如果我有一个存储过程,其中多个查询使用不同的“操作”调用,则看起来EF无法找到所有查询并创建一个反映它们的复杂类型。看起来它只是在sproc中找到了第一个查询并创建了结果类型以适合仅包含3个字段的查询。

@Action VARCHAR(20) = Null,
@ID INT = Null,
@Username VARCHAR(50) = Null,
@Description VARCHAR(200) = Null,
@Account VARCHAR(20) = NULL,
@BranchCode SMALLINT = NULL,
@Receipt BIT = NULL,
@BackDate DATETIME = NULL,
@GetDate DATETIME = NULL,
@AccountID CHAR(16) = NULL,
@StatementDate DATETIME = NULL
as

Set @GetDate = Convert(Datetime,Convert(Varchar(10), GetDate(), 101))

IF @Action = 'GetStatements'
BEGIN
   SELECT DISTINCT [AccountID], [CardHolderName], [StatementDate]
   FROM CorpCardTransactions
   WHERE username = @username + '@xxxxxxxx.com'
   ORDER BY StatementDate
END

IF @Action = 'EmpSubmitTransactions'
BEGIN
   UPDATE CorpCardTransactions
   SET [Description] = @Description, [GL_Account] = @Account, BranchCode = @BranchCode, Receipt = @Receipt,
       SubmitDate = @GetDate
   WHERE ID = @ID
END

在我的代码中,当点击“finishBtn”时,我正在调用EmpSubmitTransactions查询。

[HttpPost]
    public  ActionResult Index(List<CorpCardTransaction> list, string saveBtn, string finishBtn)
    {
        if (ModelState.IsValid)
        {
            if (saveBtn != null)
            {
                using (db)
                {
                    foreach (var i in list)
                    {
                        var t = db.CorpCardTransactions.Where(a => a.ID.Equals(i.ID)).FirstOrDefault();
                        if (t != null)
                        {
                            t.Description = i.Description;
                            t.GL_Account = i.GL_Account;
                            t.BranchCode = i.BranchCode;
                            t.Receipt = i.Receipt;
                        }
                    }
                    db.SaveChanges();
                    ViewBag.Message = "Successfully updated.";
                    return View(list);
                }
            }
            else 
            {
                using (db)
                {
                    foreach (var i in list)
                    {
                        db.sp_CorpCardExpense("EmpSubmitTransactions", i.ID, null, i.Description, i.GL_Account, i.BranchCode, i.Receipt, null, null, null, null);
                    }
                    return RedirectToAction("Index", "Statements");
                }
            }
        }
        else
        {
            ViewBag.Message = "Ooops, something is wrong with the Model State.  Try again.";
            return View(list);
        }
    }
}

当我点击finishBtn时,它确实到达了代码的正确部分,它确实试图触发存储过程,但它给了我这个错误,

“数据阅读器与指定的'CorpCardTransactionsModel.sp_CorpCardExpense_Result'不兼容。类型为“AccountID”的成员在数据阅读器中没有相应的具有相同名称的列。“

我不是想要返回所有字段,我只是想把它们全部发送到sproc加上让sproc做一些其他事情,比如将字段标记为“完成”然后将我重定向到语句列表再次。我只更新表,不返回任何字段,并尝试重定向所以我想我不明白为什么它找不到“AccountID”。为什么它指的是数据读取器?

1 个答案:

答案 0 :(得分:0)

我最终将所有查询分解为单个存储过程。这让我在选择从数据库更新时将每个新的添加到我的模型中。它会自动为返回值的复杂类型设置复杂类型,而不为那些没有数据返回的复杂类型(更新等)。

工作得很好。谢谢你的建议。