【发布时间】:2017-06-02 10:40:55
【问题描述】:
我在 SQL Server 2012 中创建了一个存储过程。该存储过程有一个类型为 varchar(15) 的输出参数:
CREATE PROCEDURE [dbo].[Proc_Authenticate]
(@username int,
@password varchar(25),
@Error varchar(15) output)
AS
BEGIN
DECLARE @count INT
SET @count = (SELECT COUNT(*)
FROM loginmaster
WHERE userid = @userid AND password = @password)
IF (@count = 0)
BEGIN
SET @Error = 'Error1'
END
END
当我从 SSMS 运行存储过程时,它工作正常,但是当我在 ExecuteScalar 的帮助下从 C# 调用存储过程时,它没有按预期工作。 ExecuteScalar 总是返回 null。如果我对ExecuteNonQuery 做同样的事情,它工作正常。 ExecuteNonQuery 用于插入/更新。 ExeuteNonQuery 将受影响的行数作为 int 值返回:
Int rowaffected = cmd.ExecuteNonQuery()
一般我检查rowaffected是否大于0,取值输出参数。
if(rowaffected > 0)
{
string s = sqlparameterError.value.Tostring()
}
我该如何检查? rowaffected 始终为 -1。检查方法是否正确?
我更改了我的代码。我删除了输出参数。我创建了一个变量并进行了选择。在ExecuteScalar 的帮助下,我能够获得它的价值。
修改后的存储过程是这样的:
CREATE PROCEDURE [dbo].[Proc_Authenticate]
(@username int,
@password varchar(25))
AS
BEGIN
DECLARE @count INT
DECLARE @Error VARCHAR(15)
SET @count = (SELECT COUNT(*)
FROM loginmaster
WHERE userid = @userid and password = @password)
IF (@count = 0)
BEGIN
SET @Error = 'Error1'
END
SELECT @Error AS Error
END
【问题讨论】:
-
你试过这个
cmd.ExecuteNonQuery然后cmd.Parameters["@Error"].Value吗? -
是的,Afnan,我已经做到了。
-
这个能用吗?
-
如何从您的 c# 代码中调用 sp? Recordsaffected msdn 状态:插入或删除的行数。您正在计数,没有插入或删除。受影响的记录不是获取您的计数的方法。
-
ExecuteScalar 被定义为返回选择的第一个数据集的第一个结果值。它不返回输出参数(其中可能有多个)。所以这种行为(空结果)是预期的。
标签: sql asp.net stored-procedures sql-server-2012