简体   繁体   English

C#和SQL Server存储过程-无法获取输出参数值,返回值有效

[英]C# & SQL Server stored procedures - can't get output parameter value, return value works

I would like to get a value of an output parameter of a stored procedure, but I'm getting +1 all the time. 我想获取存储过程的输出参数的值,但是我一直都在+1 When obtaining a value by return everything's ok. 通过返回获取值时,一切正常。

I managed to obtain a value of the output parameter using Entity Framework, however, it works really slowly. 我设法使用Entity Framework获得了输出参数的值,但是,它的运行速度确实很慢。 I'm attaching my stored procedure and C# code used to get the values from the stored procedures. 我附加了存储过程和用于从存储过程中获取值的C#代码。

Stored procedure with an output parameter works fine in SQL Server. 具有输出参数的存储过程在SQL Server中可以正常工作。

Does someone have any idea why my code doesn't work? 有人知道为什么我的代码不起作用吗?

Thanks for your help in advance. 感谢您的帮助。

Stored procedure: 存储过程:

Create procedure sp_CountEachNumberOccurencesOutput
    @number tinyint, 
    @count_number int output
As
    SET NOCOUNT ON

    select count(*) 
    from RawData
    where Number1 = @number or Number2 = @number or Number3 = @number

    select @count_number = count(*)

C# code for stored procedure with and output parameter which uses Entity Framework and works, but it's slow: 具有和输出参数的存储过程的C#代码使用Entity Framework并且可以运行,但是速度很慢:

using (SqlConnection cn = new SqlConnection(cnStr))
{
    cn.Open();

    using (SqlCommand cmd = new SqlCommand("sp_CountEachNumberOccurencesOutput", cn))
    {
        var outParam = new SqlParameter();
        int outputValue = 0;
        outParam.SqlDbType = SqlDbType.Int;
        outParam.Direction = ParameterDirection.Output;

        DbContext dbContext = new DbContext(this.connectionString);

        var data = dbContext.Database.SqlQuery<int>("sp_CountEachNumberOccurencesOutput @number, @count_number OUT",
                   new SqlParameter("number", parameter),
                   new SqlParameter("count_number", outputValue),
                   outParam);

        outputValue = data.ToList()[0];

        return outputValue;
    }
}

C# code for stored procedure with and output parameter which doesn't work: 带有和输出参数的存储过程的C#代码不起作用:

using (SqlConnection cn = new SqlConnection(cnStr))
{
    cn.Open();

    using (SqlCommand cmd = new SqlCommand("sp_CountEachNumberOccurencesOutput", cn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter param = cmd.Parameters.Add("@number", SqlDbType.Int);
        param.Direction = ParameterDirection.Input;
        param.Value = parameter;

        SqlParameter outputParameter = cmd.Parameters.Add("@count_number", SqlDbType.Int);
        outputParameter.Direction = ParameterDirection.Output;
        outputParameter.Value = 0;                   

        cmd.ExecuteNonQuery();

        cn.Close();

        int OutputValue = (int)cmd.Parameters["@count_number"].Value;

        return OutputValue;
    }
}

This code gets return value and works: 此代码获取返回值并起作用:

using (SqlConnection cn = new SqlConnection(cnStr))
{
    cn.Open();

    using (SqlCommand cmd = new SqlCommand("sp_CountEachNumberOccurencesReturn", cn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter param = cmd.Parameters.Add("@number", SqlDbType.Int);
        param.Direction = ParameterDirection.Input;
        param.Value = parameter;

        SqlParameter returnValue = new SqlParameter();
        returnValue.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(returnValue);

        return Convert.ToInt32(cmd.ExecuteScalar());
    }
}

Not sure if you can assign count(*) to a parameter. 不知道是否可以将count(*)分配给参数。 It only works in the sql statement. 它仅在sql语句中有效。

Perhaps try this 也许试试这个

Create procedure sp_CountEachNumberOccurencesOutput
    @number tinyint, @count_number int output
    As
    SET NOCOUNT ON
    select @counter_number=count(*)  from RawData
                where Number1 = @number or Number2 = @number  or Number3 = @number

I used to perform this task as following: 我以前执行此任务的方法如下:

public Int32 ExecuteGenericSP(string spName, out int errNum, out string errMsg, params object[] lstParams)
{
    Int32 returnValue;
    /* Aqui */
    SqlDatabase _sqlDatabase = new SqlDatabase(getConnectionString());
    using (DbConnection con = _sqlDatabase.CreateConnection())
    {
        DbCommand cmd = _sqlDatabase.GetStoredProcCommand(spName);
        _sqlDatabase.DiscoverParameters(cmd);
        int n = 3;

        errNum = 0;
        errMsg = "";
        cmd.Parameters["@RETURN_VALUE"].Value = 0;

        cmd.Parameters["@errNum"].Value = 0;
        cmd.Parameters["@errDes"].Value = "";

        foreach (object o in lstParams)
        {
            if (cmd.Parameters[n].DbType.ToString() == "DateTime")
                cmd.Parameters[n].Value = Convert.ToDateTime(o);
            else
                cmd.Parameters[n].Value = o.ToString();
            n++;
        }

        returnValue = _sqlDatabase.ExecuteNonQuery(cmd);

        errNum = Convert.ToInt16(_sqlDatabase.GetParameterValue(cmd, "errNum"));
        errMsg = _sqlDatabase.GetParameterValue(cmd, "errDes").ToString();
    }
    return returnValue;
}

And for instance, this is a sample of a SP: 例如,这是SP的示例:

ALTER PROCEDURE [dbo].[AUD_Insertar]
    @errNum smallint OUTPUT,
    @errDes varchar(50) OUTPUT,
    @id smallint,    
    @message varchar(MAX),
    @type char(1),
    @userId varchar(20),
    @modulo char(1)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET @errNum = 0;
    SET @errDes = '';

    INSERT INTO log(message, type, userId, modulo) VALUES (@message, @type, @userId, @modulo)
    IF (@@ROWCOUNT = 0)
    BEGIN
        SET @errNum = 1;
        SET @errDes = 'Error while inserting';
    END
END

I hope this can help you. 希望对您有所帮助。 Regards, 问候,

Adrian 阿德里安

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 SQL Server存储过程的JSON字符串输出参数在SSMS中有效,但在C#客户端中产生空值 - JSON string output parameter from SQL Server stored procedure works in SSMS but produces empty value in C# client 如何在c#中获取SQL Server存储过程的返回值? - How can I get SQL Server stored procedure return value in c#? 如何获取SQL Server存储过程输出参数C# - How to get SQL Server stored procedure output parameter C# 读取C#中SQL服务器存储过程的返回值? - Read the return value of SQL Server stored procedure in C#? SQL Server存储过程返回值,并在C#中使用它 - SQL Server stored procedure return value, and using it in C# C#中的TransactionScope是否可以触发SQL Server中存储过程中的回滚? - Can TransactionScope in C# trigger rollbacks in stored procedures in SQL server? 如何从 SQL Server 存储过程的 3 列中获取 MAX 值? - How to get a MAX value from 3 columns in SQL Server stored procedures? 从 C# 中的存储过程中获取 select 的值 - Get a value of a select from a stored procedures in C# SQL Server输出参数在EF C#中显示空值 - SQL Server Output Parameter showing null value in EF C# 如何使用 C# 从 SQL 服务器获取参数 output 并将值放入 Z21D6F2440CFB5121982E4 变量中 - How to get a parameter output from SQL Server with C# and put the value in a session variable
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM