使用参数和返回值执行存储过程

时间:2018-09-11 17:37:17

标签: c# entity-framework

我正在尝试执行一个带参数并返回参数的存储过程。当我在Management Studio中单独运行该程序时,一切正常。但是,如果我尝试从代码中运行该过程,则会收到“执行超时已过期”错误。我怀疑我没有正确传递输出参数:

List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@BankType", "Checking"));
parameters.Add(new SqlParameter("@VendorEmail", "vendorEmail@yahoo.com"));
parameters.Add(new SqlParameter("@ID", 12345));

SqlParameter outputParameter = new SqlParameter();
outputParameter.ParameterName = "@Confirm";
outputParameter.SqlDbType = System.Data.SqlDbType.Bit;
outputParameter.Direction = System.Data.ParameterDirection.Output;

parameters.Add(outputParameter);

myEntity.Database.ExecuteSqlCommand("exec TestStoredProc @BankType, @VendorEmail, @ID, @Confirm out", parameters.ToArray());

2 个答案:

答案 0 :(得分:2)

尝试这种方法:

 var bankParameter =
                   new SqlParameter("@BankType", SqlDbType.VarChar) { Value = "Checking" };

        var emailParameter =
            new SqlParameter("@VendorEmail", SqlDbType.VarChar) { Value = "vendorEmail@yahoo.com" };

        var idParameter =
            new SqlParameter("@ID", SqlDbType.Int32) { Value = 12345 };

        var conStr = "yourConnectionString";
        using (SqlConnection sConn = new SqlConnection(conStr))
        {
            using (SqlCommand sComm = new SqlCommand("TestStoredProc", sConn))
            {
                sComm.CommandTimeout = 60;
                sComm.CommandType = CommandType.StoredProcedure;

                sComm.Parameters.Add(bankParameter);
                sComm.Parameters.Add(emailParameter);
                sComm.Parameters.Add(idParameter);

                var returnParameter = sComm.Parameters.Add("@Confirm", SqlDbType.Bit);
                returnParameter.Direction = ParameterDirection.ReturnValue;


                sConn.Open();

                //// NonQuery
                sComm.ExecuteNonQuery();
                var result = returnParameter.Value;

            }
        }

这段代码有一些缺陷(例如没有给定的约束或错误的数据类型),但是如果您根据需要进行调整,它们应该可以工作。主要区别是我的Direction

returnParameter.Direction = ParameterDirection.ReturnValue;

你是

outputParameter.Direction = System.Data.ParameterDirection.Output;

我还添加了CommandTimeout = 60,因为可能您的代码没有问题,但是您的SP太长了。

答案 1 :(得分:1)

由于声誉无法发表评论。

但是您的代码没有将 outputParameter 添加到参数