2013-10-02 43 views
8

任何人都可以指導我如何在ASP.NET MVC/EF
應用程序中執行SQL Server存儲過程並獲取結果嗎?如何執行存儲過程並獲取返回結果在MVC/EF/LINQ

SQL Server存儲過程

CREATE PROCEDURE dbo.StoredProcedure2 AS 
    declare @parameter2 int 
    SET @parameter2 = 4 

    RETURN @parameter2 

MVC編碼

private readonly TestDatastoreContext _context = new TestDatastoreContext(); 

public ViewResult Index(string id) 
{ 
     ViewData["EnvironmentId"] = id; 

     using (_context) 
     { 
      _context.Database.Connection.Open(); 
      var command = _context.Database.Connection.CreateCommand(); 
      command.CommandText = "dbo.StoredProcedure2"; 
      command.CommandType = System.Data.CommandType.StoredProcedure; 
      var test = (command.ExecuteScalar()); 
     } 

     var bigView = new BigViewModel 
     { 
      VersionsModel = _context.Versions.ToList(), 
      EnvironmentViewModel = _context.Environments.ToList(), 
     }; 

     return View(model: bigView); 
} 
+0

請解釋一下你的代碼是應該做的,什麼它實際上和你試圖解釋和殲滅這些差異。 – CodeCaster

回答

8

你的問題是這樣的:您傳回存儲過程的值(使用RETURN @paramter2),但是.NET代碼正在嘗試讀取結果集;通過東西使用存儲過程

SELECT .....語句,以便改變你的存儲過程,這將被「返回」:

CREATE PROCEDURE dbo.StoredProcedure2 AS 
    declare @parameter2 int 
    SET @parameter2 = 4 

    SELECT @parameter2 

,然後你的.NET代碼應該只是罰款。

RETURN語句應僅用於狀態碼而且它只能返回INT值。如果你想使用,你必須定義一個SqlParameter爲您的存儲過程與Direction.ReturnValue

4

檢查如何將Stored Procedure映射到您的背景下,這個官方文檔:

Stored Procedures in the Entity Framework

映射之後,你就可以調用Stored Procedure這樣:

var val = _context.StoredProcedure2(); 
+0

這隻有在使用EDMX文件時纔有效。它不會與代碼先行,提問者沒有說他使用的是哪個版本。 –

+0

我發佈了一個鏈接,它有很好的工具來首先使用代碼。 –

2

一種選擇是簡單地做到這一點:

MyReturnEntity ret = context.Database 
     .SqlQuery<MyReturnEntity>("exec myStoredProc ?, ?", param1, parm2); 
+0

它不起作用:「附加信息:'?'附近語法不正確。」 – Teo

+0

@Teo他指的是過程中參數的名稱。 –

0

你可以使用這個庫: https://github.com/mrmmins/C-StoreProcedureModelBinding

返回值作爲一個表,你只需要創建一個簡單類的名稱和值類型,如:

var productos = DataReaderT.ReadStoredProceadures<MyCustomModel>(myDbEntityInstance, "dbo.MySPName", _generic); 

和MyCumtomModel類是一樣的東西:

public int id {get; set;} 
public int salary {get; set;} 
public string name {get; set;} 
public string school {get; set;} 

和通用這樣的:

List<Generic> _generic = = new List<Generic> 
          { 
           new Generic 
            { 
             Key = "@phase", Type = SqlDbType.Int, Value = "207" 
            } 
          } 
         }; 

而現在,你products有選項,如:products.First()products.Count()foreach

相關問題