2013-10-02 15 views
8

Czy ktoś może mi doradzić, w jaki sposób wykonać procedurę składowaną SQL Server w aplikacji ASP.NET MVC/EF
i uzyskać wyniki z powrotem?Jak wykonać procedurę przechowywaną i uzyskać wynik zwracania w MVC/EF/LINQ

SQL Server procedura przechowywana Kod

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

Proszę wyjaśnić, co Twój kod ma robić, co faktycznie robi i co Cię próbowali wyjaśnić i zniszczyć te różnice. – CodeCaster

Odpowiedz

8

Twój problem jest taki: masz zawracania wartość z procedura składowana (przy użyciu RETURN @paramter2), ale kod .NET próbuje odczytać zestaw wyników; coś, co będzie „wrócił” za pomocą SELECT ..... oświadczenie wewnątrz procedury przechowywanej

Więc zmienić procedurę przechowywaną, aby w ten sposób:

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

    SELECT @parameter2 

a następnie kod .NET powinien działać dobrze.

Oświadczenie RETURN powinno być używane tylko dla kodów stanu i może zwracać tylko wartości INT. Jeśli chcesz użyć, że będziesz musiał zdefiniować SqlParameter do procedury przechowywanej z Direction.ReturnValue

4

Sprawdź to oficjalny dokument, w jaki sposób mapować Stored Procedure do kontekstu:

Stored Procedures in the Entity Framework

Po odwzorowaniu będziesz mógł zadzwonić do Stored Procedure ten sposób:

var val = _context.StoredProcedure2(); 
+0

To będzie działać tylko w przypadku korzystania z pliku EDMX. Nie zadziała z kodem, który pytający nie powiedział, której wersji używa. –

+0

Umieściłem link, który ma fajne narzędzie do pracy z kodem jako pierwszym. –

2

Jedną z opcji jest po prostu to zrobić:

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

to nie działa: "Dodatkowe informacje: Niepoprawna składnia w pobliżu"? "." – Teo

+0

@Teo Odnosi się do nazw parametrów w procedurze. –

0

Możesz użyć tej biblioteki: https://github.com/mrmmins/C-StoreProcedureModelBinding

Zwraca wartości jako listy, trzeba tylko stworzyć prosta klasa z nazwiskami i wartości typów, takich jak:

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

i klasa MyCumtomModel jest coś takiego:

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

i rodzajowy jak:

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

A teraz swój products ma opcje jak: products.First(), products.Count(), foreach itp