2014-10-09 72 views
0

如果我有一个存储过程,使用不同的“操作”调用多个查询,看起来EF似乎无法找到所有查询,并生成一个反映它们的复杂类型。它看起来只是在存储过程中找到了第一个查询,并创建了结果类型以适应仅包含3个字段的查询。返回EF6/MVC5中包含多个查询的存储过程的数据

@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”。为什么指的是数据读取器?

+0

为什么在世界上你不是做两个不同的存储过程,而不是有一个单一的过程,根据字符串输入做两个完全不同的事情?我认为这是一个可怕的设计。 – 2014-10-09 16:35:22

+0

我们认为,通过使用@action,我们可以将所有查询放入每个项目的一个sproc中。在使用数据表的WebForms中工作得很好,但我不能在我的生活中弄清楚如何在EF中很好地工作。为每个查询创建一个新的sproc是否更正确?对于这个特定的项目,我会有8个不同的存储过程。这似乎并不高效。 – Russ668 2014-10-09 16:53:22

+0

这就是答案吗?你们都同意你应该为每个查询分开存储过程? – Russ668 2014-10-10 16:02:08

回答

0

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

工作很好。感谢您的建议。

相关问题