.NET SqlCommand ExecuteScalar всегда 0
C# SqlCommand.ExecuteScalar(), кажется, всегда приводит к объекту со значением 0. Использование SQL Server 2012. Это происходит со всеми хранимыми процедурами. Вот очень простой пример:
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT COUNT(serial_number)
FROM dbo.t_pql_contents
WHERE serial_number = @Serial
END
GO
Когда я выполняю это непосредственно в SSMS с известным существующим значением, предоставленным для @Serial, я получаю ожидаемые результаты:
(No column name)
1
Return Value
0
Когда я выполняю в своем приложении C# со следующим кодом, result
ниже всегда 0:
string unit_serial = "something"; // The same known existing value
SqlCommand comm = new SqlCommand("sp_IsUnitPackaged");
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@Serial", SqlDbType.VarChar)
{
Value = unit_serial,
Direction = ParameterDirection.Input,
Size = 20
});
int result = 0;
using (SqlConnection conn = Utils.CONN)
{
conn.Open();
using (comm)
{
comm.Connection = conn;
Int32.TryParse(comm.ExecuteScalar().ToString(), out result);
}
}
Я видел некоторые другие вопросы, очень похожие на это. Наилучший ответ, который я смог найти, показал, что важно не структурировать хранимую процедуру с помощью RETURN
заявление, когда вы ожидаете использовать его с ExecuteScalar
, Как видите, я нет.
Итак, что мне здесь не хватает?
ОБНОВЛЕНИЕ: я также попытался добавить RETURN 0
оператор до конца моей процедуры, чтобы у меня был только один результат при выполнении в SSMS:
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT COUNT(serial_number)
FROM dbo.t_pql_contents
WHERE serial_number = @Serial
RETURN 0
END
GO
Выполнение этого в SSMS теперь дает только следующий результат:
(No column name)
1
Однако это обновление процедуры продолжает давать скалярный результат 0 в моем приложении.
2 ответа
Welp. Как отметил @usr в комментариях (за ним следует и @AlexHn.), Это оказалось глупой ошибкой пользователя. Я не мог полностью обернуть голову вокруг того, что они просили меня сделать сначала по некоторым причинам. Как только я это сделал, выяснилось, что я неправильно установил значение моего параметра, и поэтому он фактически возвращал точный результат 0.
Много извинений всем!
[Я не был уверен, что диктует эти правила здесь, на SO. Как указал @usr, никакого реального ответа не было - только предложения, которые помогут мне найти ответ самостоятельно. Если кто-то заслуживает чека, это @usr.]
Обновите ваш запрос, как показано ниже, но если вы не видите результат 5, значит, в вашем коде C# есть проблема, иначе в вашем запросе.
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT 5
FROM dbo.t_pql_contents
END
GO