2

I have a model-first EF model. I just imported the first stored procedure: cpas_POIDVendorProjectDate

I imported it as a function. It has three input parameters: @ProjectID(int), @VendorID(int), and @Workdate(datetime), and returns @POID(int).

Here's the SQL code:

 CREATE PROCEDURE [dbo].[cpas_POIDVendorProjectDate]
    @VendorID int,
    @ProjectID int,
    @WorkDate datetime,
    @PO_ID int OUTPUT
 AS
 BEGIN
    SET NOCOUNT ON;

    DECLARE @RowCount int;

       SELECT @PO_ID = ID FROM tblPO WHERE 
        VendorID = @VendorID
        AND ExpirationDate >= @WorkDate
        AND (ProjectID IS NULL OR ProjectID = @ProjectID)
        AND CapitalExpense = (
          SELECT CapitalExpense FROM tblProjects WHERE ID=@ProjectID)
        AND GroupCode in (1,3,5);

     SET @RowCount = @@RowCount;

     IF (@RowCount != 1)
       SET @PO_ID = -1*@RowCount;

END

I called it in my c# program as follows:

context.cpas_POIDVendorProjectDate(
    currVendorID, currProjectID, currWorkDate, currPOID);

Intellisense says my use of "context" is wrong...It's a "variable", and I'm using it as a "method".

In addition, currPOID is rejected because it's looking for a system.data.objects.OjbectParameter, not an int. Intellisense is happy with the function name and other parameters (strangely...)

What am I doing wrong here?

2
  • you may want to post more code. We don't know what type context is
    – Mario
    Commented Feb 8, 2013 at 18:09
  • Have to say, "editing" is catch-as-catch-can. I'm sorry the code block didn't come out right. I don't know how to fix it.
    – JimS-CLT
    Commented Feb 8, 2013 at 18:22

2 Answers 2

1

You can always do this if nothing else works:

using(var context = new MyDataContext())
{
    using(var cmd = context.Database.Connection.CreateCommand())
    {
        cmd.CommandText = "cpas_POIDVendorProjectDate";
        cmd.CommandType = CommandType.StoredProcedure;
        //if the stored proc accepts params, here is where you pass them in
        cmd.Parameters.Add(new SqlParameter("VendorId", 10));
        cmd.Parameters.Add(new SqlParameter("ProjectId", 12));
        cmd.Parameters.Add(new SqlParameter("WorkDate", DateTimw.Now));
        var poid = (int)cmd.ExecuteScalar();
    }
}
0

If you would like an object orientated way, then Mindless passenger has a project that allows you to call a stored proc from entity frame work like this....

using (testentities te = new testentities())
{
    //-------------------------------------------------------------
    // Simple stored proc
    //-------------------------------------------------------------
    var parms1 = new testone() { inparm = "abcd" };
    var results1 = te.CallStoredProc<testone>(te.testoneproc, parms1);
    var r1 = results1.ToList<TestOneResultSet>();
}

... and I am working on a stored procedure framework (here) which you can call like in one of my test methods shown below...

[TestClass]
public class TenantDataBasedTests : BaseIntegrationTest
{
    [TestMethod]
    public void GetTenantForName_ReturnsOneRecord()
    {
        // ARRANGE
        const int expectedCount = 1;
        const string expectedName = "Me";

        // Build the paraemeters object
        var parameters = new GetTenantForTenantNameParameters
        {
            TenantName = expectedName
        };

        // get an instance of the stored procedure passing the parameters
        var procedure = new GetTenantForTenantNameProcedure(parameters);

        // Initialise the procedure name and schema from procedure attributes
        procedure.InitializeFromAttributes();

        // Add some tenants to context so we have something for the procedure to return!
        AddTenentsToContext(Context);

        // ACT
        // Get the results by calling the stored procedure from the context extention method 
        var results = Context.ExecuteStoredProcedure(procedure);

        // ASSERT
        Assert.AreEqual(expectedCount, results.Count);
    }
}

internal class GetTenantForTenantNameParameters
{
    [Name("TenantName")]
    [Size(100)]
    [ParameterDbType(SqlDbType.VarChar)]
    public string TenantName { get; set; }
}

[Schema("app")]
[Name("Tenant_GetForTenantName")]
internal class GetTenantForTenantNameProcedure
    : StoredProcedureBase<TenantResultRow, GetTenantForTenantNameParameters>
{
    public GetTenantForTenantNameProcedure(
        GetTenantForTenantNameParameters parameters)
        : base(parameters)
    {
    }
}

If either of those two approaches are any good?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.