【问题标题】:Execute Stored Procedure with parameters and return value执行带参数和返回值的存储过程
【发布时间】:2019-02-16 06:44:21
【问题描述】:

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

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());

【问题讨论】:

  • 我查看了您的建议,但该建议并未解决我的问题。
  • 为什么您会看到执行超时并认为这是因为您传递的参数错误?如果它说这是一个执行超时,你应该假设它就是这样,除非你能证明不是这样。错误是否总是在设定的秒数后发生?您是否尝试过增加超时?通过 SSMS 运行需要多长时间?

标签: c# entity-framework


【解决方案1】:

试试这个方法:

 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;

            }
        }

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

returnParameter.Direction = ParameterDirection.ReturnValue;

你是

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

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

【讨论】:

    【解决方案2】:

    由于声誉问题,无法发表评论。

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

    【讨论】:

    • 我错过了粘贴这行代码。现在编辑了。还是一样的错误。
    • 代码看起来是正确的。你检查你的连接字符串,看看你的程序是否可以连接到服务器?
    • 是的,我正在对数据库进行不同的调用。其余的工作正常
    猜你喜欢
    • 2013-01-27
    • 2011-08-27
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2014-03-03
    相关资源
    最近更新 更多