Как восстановить и связать хранимую процедуру с выходным параметром, переменной в C# код
Я пытаюсь получить самое высокое число int в смешанном столбце var/int с помощью выходного параметра хранимой процедуры таким образом, что для значений AG000123,AG000768, AG000769 я хочу получить 769. Когда я вызываю этот SP в коде C# , я получаю недопустимое исключение cast на int. Это моя хранимая процедура :
<pre lang="SQL">CREATE PROCEDURE [dbo].[GetMaxAGCode] @returnValue INT OUT AS BEGIN SET NOCOUNT ON; SELECT MAX(CAST(SUBSTRING(Linked_Sun_Id, 4, LEN(Linked_Sun_Id)-3) AS INT)) FROM BrokerMappings WHERE Linked_Sun_Id LIKE 'AG%' END GO
И вот как я называю то же самое в C#:
<pre lang="c#"> using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect)) { conn.Open(); SqlCommand cmd = new SqlCommand("spGetHighestAGCode", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@returnValue", SqlDbType.Int).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); int counter = (int)cmd.Parameters["@returnValue"].Value; conn.Close(); }
Я могу получить значение в SSMS, но в моем фактическом результирующем наборе оно возвращает null, то есть самый высокий индекс столбца имеет NULL.
DECLARE @number INT EXEC spGetHighestAGCode @returnValue=@number SELECT @number AS 'Highest index'
Верхний результирующий набор в SSMS, однако, возвращает значение, я хотел бы прикрепить скриншот для ясности, но я не вижу здесь опции.
Что я уже пробовал:
Когда я пытаюсь получить значение в виде varchar, я получаю исключение DBNull при отладке в C#. Я действительно подозреваю, что это происходит потому, что строка SELECT @number как "самый высокий индекс" в SSMS возвращает NULL.Это означает, что, хотя я могу получить правильное выходное значение, я не могу назначить его переменной @number. Я сделал это как :
ALTER PROCEDURE [dbo].[spGetHighestAGCode] @returnValue VARCHAR(50) OUT AS BEGIN SET NOCOUNT ON; SELECT MAX(CAST(SUBSTRING(Linked_Sun_Id, 4, LEN(Linked_Sun_Id)-3) AS VARCHAR(50))) FROM BrokerMappings WHERE Linked_Sun_Id LIKE 'AG%' END
и :
cmd.Parameters.Add("@returnValue", SqlDbType.VarChar, 50).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); string counter = (string)cmd.Parameters["@returnValue"].Value;
Что я делаю не так?