.NET SqlCommand ExecuteScalar始终为0

时间:2015-11-17 17:24:31

标签: c# sql-server ado.net executescalar

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语句构建存储过程。如你所见,我不是。

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

更新:我还尝试在程序结束时添加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

在SSMS中执行此操作现在只提供以下结果:

$time = "00:20:00";
$unixdatetime = strtotime($time) - 800;
echo strftime("%M:%S",$unixdatetime);  // 06:40

此过程的更新继续在我的应用程序中给出标量结果为0。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

向所有人道歉!

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