Using the methods below, you can obtain the stored procedure return value, along with your data, which I've not seen in other blogs.
A stored proc should return 0 for success, and any other value for a failure.
Here is an example table, filled with data:
CREATE TABLE DemoData(    id INT NOT NULL PRIMARY key,    someValue DECIMAL(4,4) NOT NULL)GOINSERT INTO DemoData(id, someValue)VALUES (1, 1.23), (2, 2.34), (3, 3.45), (4, 4.56)  Here are our example stored procedures: CREATE PROCEDURE GetDemoData(@maxId INT)ASBEGIN    SET NOCOUNT ON;    SELECT id, someValue FROM DemoData WHERE id <= @maxIdENDGOCREATE PROCEDURE AddTwoValues(@a INT, @b INT)ASBEGIN    SET NOCOUNT ON;    RETURN @a + @b -- Don't do this. Stored procs should return                   -- 0 for success, and any other value for failure.ENDGOCREATE PROCEDURE AddTwoValuesWithResult(@a INT, @b INT, @result INT OUTPUT, @result2 INT OUTPUT)ASBEGIN    SET NOCOUNT ON;    SET @result = @a + @b    SET @result2 = @b - @aENDGOCREATE PROCEDURE ConvertToString(@someValue INT, @someString VARCHAR(20) OUTPUT)ASBEGIN    SET NOCOUNT ON;    SET @someString = '*' + CAST(@someValue AS VARCHAR(20)) + '*'ENDGO  Here is the C# code to call the above:  public class DemoData{    public Int32 Id { get; set; }    public Decimal? SomeValue { get; set; }}public class MyDbContext : DbContext{    static MyDbContext()    {        Database.SetInitializer<MyDbContext>(null);    }    public MyDbContext()        : base("Name=MyDbContext")    {    }    public MyDbContext(string connectionString)        : base(connectionString)    {    }    public MyDbContext(string connectionString,         System.Data.Entity.Infrastructure.DbCompiledModel model)        : base(connectionString, model)    {    }    // Stored Procedures    public int AddTwoValues(int a, int b)    {        var procResult = new SqlParameter        {            ParameterName = "@procResult",             SqlDbType = SqlDbType.Int,             Direction = ParameterDirection.Output        };        Database.ExecuteSqlCommand(            "exec @procResult = AddTwoValues @a, @b",             new object[]        {            new SqlParameter            {                ParameterName = "@a",                 Value = a,                 SqlDbType = SqlDbType.Int,                 Direction = ParameterDirection.Input            },             new SqlParameter            {                ParameterName = "@b",                 Value = b,                 SqlDbType = SqlDbType.Int,                 Direction = ParameterDirection.Input            },             procResult        });        return (int)procResult.Value;    }    public int AddTwoValuesWithResult(int a, int b, out int result, out int result2)    {        var resultParam = new SqlParameter        {            ParameterName = "@result",             SqlDbType = SqlDbType.Int,             Direction = ParameterDirection.Output        };        var result2Param = new SqlParameter         {             ParameterName = "@result2",             SqlDbType = SqlDbType.Int,             Direction = ParameterDirection.Output };        var procResult = new SqlParameter        {            ParameterName = "@procResult",             SqlDbType = SqlDbType.Int,             Direction = ParameterDirection.Output        };        Database.ExecuteSqlCommand(            "exec @procResult = AddTwoValuesWithResult @a, @b, @result OUTPUT, @result2 OUTPUT",             new object[]        {            new SqlParameter            {                ParameterName = "@a",                 Value = a,                 SqlDbType = SqlDbType.Int,                 Direction = ParameterDirection.Input            },             new SqlParameter            {                ParameterName = "@b",                 Value = b,                 SqlDbType = SqlDbType.Int,                 Direction = ParameterDirection.Input            },             resultParam,             result2Param,             procResult        });        result = (int)resultParam.Value;        result2 = (int)result2Param.Value;        return (int)procResult.Value;    }    public int ConvertToString(int someValue, out string someString)    {        var someStringParam = new SqlParameter        {            ParameterName = "@someString",             SqlDbType = SqlDbType.VarChar,             Size = 20,             Direction = ParameterDirection.Output        };        var procResult = new SqlParameter         {             ParameterName = "@procResult",             SqlDbType = SqlDbType.Int,             Direction = ParameterDirection.Output         };        Database.ExecuteSqlCommand(            "exec @procResult = ConvertToString @someValue, @someString OUTPUT",             new object[]        {            new SqlParameter            {                ParameterName = "@someValue",                 Value = someValue,                 SqlDbType = SqlDbType.Int,                 Direction = ParameterDirection.Input            },             someStringParam,            procResult        });        someString = (string)someStringParam.Value;                     return (int)procResult.Value;    }    public List<DemoData> GetDemoData(int maxId, out int procResult)    {        var procResultParam = new SqlParameter        {            ParameterName = "@procResult",             SqlDbType = SqlDbType.Int,             Direction = ParameterDirection.Output        };                     var sqlQuery = Database.SqlQuery<DemoData>(            "exec @procResult = GetDemoData @maxId",             new object[]        {            new SqlParameter            {                ParameterName = "@maxId",                 Value = maxId,                 SqlDbType = SqlDbType.Int,                 Direction = ParameterDirection.Input            },             procResultParam        }).ToList();        procResult = (int) procResultParam.Value;        return sqlQuery;    }} To call the above and return the results: 
using (var db = new MyDbContext()){    Console.WriteLine("AddTwoValuesWithResult");    int result, result2;    int procResult = db.AddTwoValuesWithResult(3, 7, out result, out result2);    Console.WriteLine("result = " + result);    Console.WriteLine("result2 = " + result2);    Console.WriteLine("procResult = " + procResult);    Console.WriteLine("");    Console.WriteLine("ConvertToString");    string someString;    procResult = db.ConvertToString(56, out someString);    Console.WriteLine("someString = " + someString);    Console.WriteLine("procResult = " + procResult);        Console.WriteLine("");    Console.WriteLine("AddTwoValues");    procResult = db.AddTwoValues(5, 10);    Console.WriteLine("procResult = " + procResult);    Console.WriteLine("");    Console.WriteLine("GetDemoData");    var list = db.GetDemoData(3, out procResult);    Console.WriteLine("procResult = " + procResult);    foreach (var i in list)    {        Console.WriteLine(i.Id + ", " + i.SomeValue);    }} Yields the following output: AddTwoValuesWithResultresult = 10result2 = 4procResult = 0ConvertToStringsomeString = *56*procResult = 0AddTwoValuesprocResult = 15GetDemoDataprocResult = 01 1.2302 2.3403 3.450  This will be available in the EntityFramework Reverse POCO Generator, available at https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838    






0 comments:
Post a Comment