.NET SqlCommand ExecuteScalar Is Always 0

本文关键字:Always Is ExecuteScalar SqlCommand NET | 更新日期: 2023-09-27 18:22:25

C#SqlCommand.ExecuteScaler()似乎总是产生值为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

当我使用为@Serial提供的已知现有值直接在SSMS中执行此操作时,我会得到预期的结果:

(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);
    }
}

我看到其他一些问题被问到与此非常相似。我能找到的最好的答案似乎表明,当您希望将存储过程与ExecuteScalar一起使用时,不要使用RETURN语句来构建存储过程,这一点很重要。正如你所看到的,我不是。

那么,我在这里错过了什么?


更新:我还尝试在过程的末尾添加一个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。

.NET SqlCommand ExecuteScalar Is Always 0

如下更新您的查询,但如果您看不到5作为结果,那么您的C#代码中存在一些问题,否则您的查询中就会出现问题。

CREATE PROCEDURE [dbo].[sp_IsUnitPackaged] 
    @Serial varchar(20)
AS
BEGIN
    SET NOCOUNT ON
    SELECT 5
    FROM dbo.t_pql_contents
END
GO

Welp。正如@usr在评论中指出的那样(后面还有@AlexHn.),这是一个愚蠢的用户错误。出于某种原因,我一开始无法完全理解他们要求我做什么。一旦我这样做了,很明显我设置的参数值不正确,所以它实际上返回了0的准确结果。

向所有人致以深深的歉意!

[我不确定SO的礼仪是什么。正如@usr所指出的,没有提交真正的答案,只有帮助我自己找到答案的建议。如果有人值得检查,那就是@usr。]