2014-10-09 75 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

我最終將所有查詢分解爲單獨的存儲過程。當我選擇從數據庫進行更新時,這讓我可以將每個新增加到我的模型中。它會自動爲返回值設置複雜類型,並且不會爲那些沒有數據返回的更新(更新等)設置複雜類型。

工作很好。感謝您的建議。

相關問題