Почему я не могу получить значение выходного параметра обратно из executenonquery?
Я выполняю хранимую процедуру и пытаюсь получить значение выходного параметра "после выполнения" (@parmRecID), которое должно быть значением RecID записи, добавленной хранимой процедурой в таблицу.
Значение выходного параметра всегда равно "1", хотя хранимая процедура правильно устанавливает его в значение RecID вновь добавленной записи.
Приведенный ниже код создает экземпляр класса, затем использует функцию из этого класса для выполнения хранимой процедуры, а затем (безуспешно) извлекает значение выходного параметра и возвращает это значение в качестве возвращаемого значения вызываемого метода (функции).
SQLDatabase MySQLClass = new SQLDatabase(); string TheDatabase = "CustomerDB"; string TheProcedure = "usp_AddCustomer"; Dictionary<string, ParameterValues> TheParams = new Dictionary<string, ParameterValues>(); ParameterValues values = new ParameterValues(); values.Value = TxtFirstName.Text; values.Direction = "Input"; TheParams.Add("@parmFirstName", values); values = new ParameterValues(); values.Value = TxtLastName.Text; values.Direction = "Input"; TheParams.Add("@parmLastName", values); values = new ParameterValues(); values.Value = TxtAddress.Text; values.Direction = "Input"; TheParams.Add("@parmAddress", values); values = new ParameterValues(); values.Value = TxtCity.Text; values.Direction = "Input"; TheParams.Add("@parmCity", values); values = new ParameterValues(); values.Value = TxtZipCode.Text; values.Direction = "Input"; TheParams.Add("@parmZipCode", values); values = new ParameterValues(); values.Value = ""; values.Direction = "Output"; TheParams.Add("@parmRecID", values); string RecID = MySQLClass.ExecStoredProcedure(TheDatabase, TheProcedure, TheParams); MessageBox.Show("From FrmMain, RecID is " + RecID);
Ниже приведен вызываемый метод (MySQLClass.ExecStoredProcedure):
public string ExecStoredProcedure(string Database, string Procedure, Dictionary<string, ParameterValues> Parameters) { string TheConnectionString = $"Data Source=DESKTOP-EL4GU86;Initial Catalog={Database};Integrated Security=true"; using (SqlConnection Conn = new SqlConnection(TheConnectionString)) { using (SqlCommand Cmd = new SqlCommand(Procedure, Conn)) { Conn.Open(); Cmd.CommandType = CommandType.StoredProcedure; foreach (KeyValuePair<string, ParameterValues> entry in Parameters) { ParameterValues vals = entry.Value; Cmd.Parameters.AddWithValue(entry.Key, vals.Value); switch (vals.Direction) { case "Output": Cmd.Parameters[entry.Key].Direction = ParameterDirection.Output; break; default: Cmd.Parameters[entry.Key].Direction = ParameterDirection.Input; break; } } Cmd.ExecuteNonQuery(); foreach (SqlParameter param in Cmd.Parameters) // This 'foreach' is just to show the 'after execution' { // value of the output parameter.. string pName = param.ParameterName; if (pName == "@parmRecID") { string pValue = param.Value.ToString(); MessageBox.Show("From SQLClass, " + pName + " = " + pValue); } } return Cmd.Parameters["@parmRecID"].Value.ToString(); } } } } public class ParameterValues { public string Value { get; set; } public string Direction { get; set; } }
Исследуя эту проблему, я нашел "System.Data.ParameterDirection.Аргумент returnvalue;"
это позволило бы мне получить возвращаемое значение из хранимой процедуры, но я только сейчас пытаюсь понять, почему я не могу получить значение выходного параметра после выполнения хранимой процедуры...
Пока я этим занимаюсь, вот хранимая процедура...
CREATE OR ALTER procedure [dbo].[usp_AddCustomer] @parmFirstName as varchar(50), @parmLastName as varchar(50), @parmAddress as varchar(50), @parmCity as varchar(50), @parmZipCode as varchar(50), @parmRecID as varchar(10) output as if exists ( select * from CustomerDB.dbo.SmallCustomerTable where FirstName = @parmFirstName and LastName = @parmLastName and Address = @parmAddress ) set @parmRecID = '0' else begin insert into CustomerDB.dbo.SmallCustomerTable select @parmFirstName, @parmLastName, @parmAddress, @parmCity, @parmZipCode set @parmRecID = (select convert(varchar, max(RecID)) from SmallCustomerTable) end GO
Что я уже пробовал:
Приведенный выше код-это то, что я пробовал...