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。
答案 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。]