.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
Другие вопросы по тегам