.NET SqlCommand ExecuteScalar 始终为 0
.NET SqlCommand ExecuteScalar Is Always 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
当我使用为@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 的标量结果。
按如下方式更新您的查询,如果结果仍然看不到 5,则说明您的 C# 代码有问题,否则您的查询有问题。
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT 5
FROM dbo.t_pql_contents
END
GO
拜托。正如@usr 在评论中指出的那样(随后还有@AlexHn。),结果证明这是一个愚蠢的用户错误。出于某种原因,一开始我无法完全理解他们要求我做的事情。一旦我这样做了,很明显我错误地设置了我的参数值,所以它实际上返回了一个准确的结果 0。
非常抱歉!
[我不确定这里的礼节是什么。正如@usr 所指出的,没有提交真正的答案——只有帮助我自己找到答案的建议。如果有人值得检查,那就是@usr。]
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);
}
}
我看到其他一些与此非常相似的问题。我能找到的最佳答案似乎表明,当您希望将存储过程与 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 的标量结果。
按如下方式更新您的查询,如果结果仍然看不到 5,则说明您的 C# 代码有问题,否则您的查询有问题。
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT 5
FROM dbo.t_pql_contents
END
GO
拜托。正如@usr 在评论中指出的那样(随后还有@AlexHn。),结果证明这是一个愚蠢的用户错误。出于某种原因,一开始我无法完全理解他们要求我做的事情。一旦我这样做了,很明显我错误地设置了我的参数值,所以它实际上返回了一个准确的结果 0。
非常抱歉!
[我不确定这里的礼节是什么。正如@usr 所指出的,没有提交真正的答案——只有帮助我自己找到答案的建议。如果有人值得检查,那就是@usr。]