1

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

当我使用为@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);
    }
}

我已经看到其他一些与此非常相似的问题。我能找到的最佳答案似乎表明,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 的标量结果。

4

2 回答 2

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
于 2015-11-17T19:10:08.780 回答
0

韦尔普。正如@usr 在评论中指出的那样(@AlexHn 也是如此),结果证明这是一个愚蠢的用户错误。出于某种原因,我无法完全理解他们最初要求我做什么。一旦我这样做了,很明显我错误地设置了我的参数值,因此它实际上返回了一个准确的结果 0。

向所有人道歉!

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

于 2015-11-18T14:43:00.073 回答