C# 使用C从SQL Server存储过程获取单个响应#

C# 使用C从SQL Server存储过程获取单个响应#,c#,sql,sql-server,stored-procedures,executescalar,C#,Sql,Sql Server,Stored Procedures,Executescalar,几天来,我一直在努力解决这个问题,并广泛挖掘了StackOverflow和其他各种网站。我真的在画一张空白。我正试图从存储过程中获取一个结果 以下是我的存储过程: ALTER PROC [dbo].[myHelper_Simulate] @CCOID nvarchar(100), @RVal nvarchar OUTPUT AS DECLARE @UserID int DECLARE @GUID uniqueidentifier SELECT @UserID

几天来,我一直在努力解决这个问题,并广泛挖掘了StackOverflow和其他各种网站。我真的在画一张空白。我正试图从存储过程中获取一个结果

以下是我的存储过程:

ALTER PROC [dbo].[myHelper_Simulate]
    @CCOID nvarchar(100), @RVal nvarchar OUTPUT
AS
    DECLARE @UserID int 
    DECLARE @GUID uniqueidentifier

    SELECT @UserID = UserID 
    FROM [User] 
    WHERE CCOID = @CCOID AND deleted = 0

    SELECT @GUID = newid()

    IF @UserID > 0
        BEGIN
            INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level)
            VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success')

            SELECT @RVal = 'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50))
            RETURN  
        END
    ELSE
        SELECT @RVal = 'Couldn''t find a user record for the CCOID ' + @CCOID
        RETURN 
GO
最初编写该过程是为了打印结果。我添加了
@RVal
返回值
,试图将值传递回我的C#code

下面是我的C#例程(
svrConn
已连接到数据库):

问题是
result
返回空值。我不确定这是否是由于存储过程造成的,也不确定我是如何设置参数和调用
ExecuteScalar

试试看

private void btnSimulate_MouseClick(object sender, EventArgs e) {
  using (SqlConnection con = svrConn) {
    using (SqlCommand cmd = new SqlCommand("myHelper_Simulate", con)) {
      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.Add("@CCOID", SqlDbType.VarChar).Value = txtDUserCCOID.Text.Trim();
      var output = new SqlParameter("@RVal", SqlDbType.VarChar);
      output.Direction = ParameterDirection.Output;
      cmd.Parameters.Add(output);

      con.Open();
      cmd.ExecuteNonQuery();
    }
  }
}
试一试

是整数,表示错误代码。正确的方法是使用
输出
参数。如果在SP中正确分配了它,则不需要返回语句

在C代码中,在执行后检查值。使用
ExecuteNonQuery
,因为没有来自SP的结果集

var rval = new SqlParameter("@RVal", SqlDbType.NVarChar);
rval.Direction = ParameterDirection.Output;
cmd.Parameters.Add(rval);
cmd.ExecuteNonQuery();
result = rval.Value;
是整数,表示错误代码。正确的方法是使用
输出
参数。如果在SP中正确分配了它,则不需要返回语句

在C代码中,在执行后检查值。使用
ExecuteNonQuery
,因为没有来自SP的结果集

var rval = new SqlParameter("@RVal", SqlDbType.NVarChar);
rval.Direction = ParameterDirection.Output;
cmd.Parameters.Add(rval);
cmd.ExecuteNonQuery();
result = rval.Value;

不需要返回参数或输出参数。ExecuteScalar返回结果集第一行的第一列。所以只要选择你想要返回的文本,就像这样

IF @UserID > 0
        BEGIN
            INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level)
            VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success')

            SELECT  'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50))
        END
    ELSE
        SELECT 'Couldn''t find a user record for the CCOID ' + @CCOID


RETURN 

不需要返回参数或输出参数。ExecuteScalar返回结果集第一行的第一列。所以只要选择你想要返回的文本,就像这样

IF @UserID > 0
        BEGIN
            INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level)
            VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success')

            SELECT  'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50))
        END
    ELSE
        SELECT 'Couldn''t find a user record for the CCOID ' + @CCOID


RETURN 

这是不正确的,因为@rval需要是一个输出参数。这是不正确的,因为@rval需要是一个输出参数。Tim不要忘记在using语句中包装command,这样就不会泄漏资源或溢出连接池。Tim不要忘记在using语句中包装command,这样就不会泄漏资源或溢出连接池连接池,就是这样!我知道这一定与存储过程以及我如何将信息传递回有关。我根据您的建议更改了程序,并删除了最后2个参数。在C#代码中添加语句,代码运行正常。谢谢,就是这样!我知道这一定与存储过程以及我如何将信息传递回有关。我根据您的建议更改了程序,并删除了最后2个参数。在C#代码中添加语句,代码运行正常。谢谢