Выполнить хранимую процедуру с параметрами и возвращаемым значением - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь выполнить хранимую процедуру, которая принимает параметры и возвращает параметр. Когда я запускаю процедуру отдельно в 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 голосов
/ 12 сентября 2018

Попробуйте этот подход:

 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 слишком длинный.

0 голосов
/ 11 сентября 2018

Не может комментировать из-за репутации.

Но ваш код не добавляет outputParameter к параметрам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...