Könnte mir eine Anleitung geben, wie eine in SQL Server gespeicherte Prozedur in ASP.NET MVC/EF ausgeführt wird
Anwendung und Ergebnisse zurückbekommen?
Gespeicherte SQL Server-Prozedur
CREATE PROCEDURE dbo.StoredProcedure2 AS
declare @parameter2 int
SET @parameter2 = 4
RETURN @parameter2
MVC-Code
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);
}
Ihr Problem ist folgendes: Sie geben den Wert aus der gespeicherten Prozedur zurück (mit RETURN @paramter2
), aber Ihr .NET-Code versucht, eine Ergebnismenge zu lesen. etwas, das mit einer SELECT .....
-Anweisung in der gespeicherten Prozedur "zurückgegeben" wird
Ändern Sie also Ihre gespeicherte Prozedur folgendermaßen:
CREATE PROCEDURE dbo.StoredProcedure2 AS
declare @parameter2 int
SET @parameter2 = 4
SELECT @parameter2
und dann sollte Ihr .NET-Code gut funktionieren.
Die RETURN
-Anweisung sollte nur für status codes verwendet werden und kann nur INT
-Werte zurückgeben. Wenn Sie dies verwenden möchten, müssen Sie eine SqlParameter
für Ihre gespeicherte Prozedur mit einem Direction.ReturnValue
definieren.
In diesem offiziellen Dokument erfahren Sie, wie Sie den Stored Procedure
Ihrem Kontext zuordnen können:
Gespeicherte Prozeduren im Entity Framework
Nach dem Mapping können Sie den Stored Procedure
folgendermaßen aufrufen:
var val = _context.StoredProcedure2();
Eine Möglichkeit ist, dies einfach zu tun:
MyReturnEntity ret = context.Database
.SqlQuery<MyReturnEntity>("exec myStoredProc ?, ?", param1, parm2);
Sie können diese Bibliothek verwenden: https://github.com/mrmmins/C-StoreProcedureModelBinding
Gibt die Werte als Liste zurück. Sie müssen lediglich eine einfache Klasse mit den Namen- und Wertetypen erstellen, z.
var productos = DataReaderT.ReadStoredProceadures<MyCustomModel>(myDbEntityInstance, "dbo.MySPName", _generic);
und MyCumtomModel-Klasse ist so etwas wie:
public int id {get; set;}
public int salary {get; set;}
public string name {get; set;}
public string school {get; set;}
und generisch wie:
List<Generic> _generic = = new List<Generic>
{
new Generic
{
Key = "@phase", Type = SqlDbType.Int, Value = "207"
}
}
};
Und jetzt hat Ihre products
die folgenden Optionen: products.First()
, products.Count()
, foreach
usw.