存储过程始终在输出参数上返回NULL值。

huangapple go评论75阅读模式
英文:

Stored procedure return always NULL value on an output parameter

问题

I'm trying to fetch the value of a stored procedure parameter but it return always a NULL value.

If I execute the stored procedure by the server client it shows the correct value for that parameter, but as you can see from the image, the code returns a null value for the parameter @esitoRecuperoAmicizie.

In this screenshot, the debug parameter value:

存储过程始终在输出参数上返回NULL值。

This is the stored procedure code:

ALTER PROCEDURE [dbo].[SocialPartyFinder_RecuperaListaAmici_GET] 
	@IdUtente INT,
	@esitoRecuperoAmicizie INT OUTPUT
AS
BEGIN
	SET NOCOUNT ON;
	
	BEGIN TRY
		SELECT 
            ListaAmici.FkUPropAmicizia, Utenti.Utnte_Username, 
            Utenti.StatoConnessione, Utenti.ImmagineProfilo
		FROM 
            ListaAmici 
        INNER JOIN 
            Utenti ON ListaAmici.FkAmico = Utenti.IdUtente
		WHERE 
            ListaAmici.FkUPropAmicizia = @IdUtente

		SET @esitoRecuperoAmicizie = 10;
	END TRY
	BEGIN CATCH
		SET @esitoRecuperoAmicizie = 99;
	END CATCH
END

This is the code that calls the stored procedures and fetches the value from the parameter:

public List<Utenti> recuperaListaAmici(int id) 
{
    string errore = String.Empty;
    List<Utenti> listaAmici = new List<Utenti>();

    SqlConnection sqlConnection = new SqlConnection();
    sqlConnection.ConnectionString = connectionString;

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = sqlConnection;
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.CommandText = "SocialPartyFinder_RecuperaListaAmici_GET";
    
    SqlParameter parametroInput = new SqlParameter();
    parametroInput.ParameterName = "@IdUtente";
    parametroInput.Direction = System.Data.ParameterDirection.Input;
    parametroInput.Value = id;
    parametroInput.DbType = System.Data.DbType.Int32;

    cmd.Parameters.Add(parametroInput);

    SqlParameter parameteroOutput = new SqlParameter();
    parameteroOutput.ParameterName = "@esitoRecuperoAmicizie";
    parameteroOutput.DbType = System.Data.DbType.Int32;
    parameteroOutput.Direction = System.Data.ParameterDirection.Output;

    cmd.Parameters.Add(parameteroOutput);

    try
    {
        sqlConnection.Open();

        try
        {
            SqlDataReader reader = cmd.ExecuteReader();
            Convert.ToInt32(cmd.Parameters["@esitoRecuperoAmicizie"].Value);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    // DO SOMETHING
                }
            }
            else 
            {
                // DO SOMETHING
            }

            return listaAmici;
        }
        catch
        {
            // DO SOMETHING
        }
    }
    catch
    {
        // DO SOMETHING
    }

    return listaAmici;
}
英文:

I'm trying to fetch the value of a stored procedure parameter but it return always a NULL value.

If I execute the stored procedure by the server client it shows the correct value for that parameter, but as you can see from the image, the code returns a null value for the parameter @esitoRecuperoAmicizie.

In this screenshot, the debug parameter value:

存储过程始终在输出参数上返回NULL值。

This is the stored procedure code:

ALTER PROCEDURE [dbo].[SocialPartyFinder_RecuperaListaAmici_GET] 
	@IdUtente INT,
	@esitoRecuperoAmicizie INT OUTPUT
AS
BEGIN
	SET NOCOUNT ON;
	
	BEGIN TRY
		SELECT 
            ListaAmici.FkUPropAmicizia, Utenti.Utnte_Username, 
            Utenti.StatoConnessione, Utenti.ImmagineProfilo
		FROM 
            ListaAmici 
        INNER JOIN 
            Utenti ON ListaAmici.FkAmico = Utenti.IdUtente
		WHERE 
            ListaAmici.FkUPropAmicizia = @IdUtente

		SET @esitoRecuperoAmicizie = 10;
	END TRY
	BEGIN CATCH
		SET @esitoRecuperoAmicizie = 99;
	END CATCH
END

This is the code that calls the stored procedures and fetches the value from the parameter:

    public List&lt;Utenti&gt; recuperaListaAmici(int id) 
    {
        string errore = String.Empty;
        List&lt;Utenti&gt; listaAmici = new List&lt;Utenti&gt;();

        SqlConnection sqlConnection = new SqlConnection();
        sqlConnection.ConnectionString = connectionString;

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = sqlConnection;
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = &quot;SocialPartyFinder_RecuperaListaAmici_GET&quot;;
        
        SqlParameter parametroInput = new SqlParameter();
        parametroInput.ParameterName = &quot;@IdUtente&quot;;
        parametroInput.Direction = System.Data.ParameterDirection.Input;
        parametroInput.Value = id;
        parametroInput.DbType = System.Data.DbType.Int32;

        cmd.Parameters.Add(parametroInput);

        SqlParameter parameteroOutput = new SqlParameter();
        parameteroOutput.ParameterName = &quot;@esitoRecuperoAmicizie&quot;;
        parameteroOutput.DbType = System.Data.DbType.Int32;
        parameteroOutput.Direction = System.Data.ParameterDirection.Output;

        cmd.Parameters.Add(parameteroOutput);

        try
        {
            sqlConnection.Open();

            try
            {
                SqlDataReader reader = cmd.ExecuteReader();
                Convert.ToInt32(cmd.Parameters[&quot;@esitoRecuperoAmicizie&quot;].Value);

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        // DO SOMETHING
                    }
                }
                else 
                {
                    // DO SOMETHING
                }

                return listaAmici;
            }
            catch
            {
                // DO SOMETHING
            }
        }
        catch
        {
            // DO SOMETHING
        }

        return listaAmici;
    }

答案1

得分: 0

使用Try和Catch应仅用于错误,
此查询返回两个结果,将导致程序代码中的错误,因此建议您按如下方式修改代码:

IF EXISTS(SELECT 1 FROM ListaAmici WHERE ListaAmici.FkUPropAmicizia = @IdUtente)
BEGIN
    SELECT @esitoRecuperoAmicizie = 10
END
ELSE	
BEGIN
    SELECT @esitoRecuperoAmicizie = 99
END

SELECT 
    ListaAmici.FkUPropAmicizia, 
    Utenti.Utnte_Username, 
    Utenti.StatoConnessione, 
    Utenti.ImmagineProfilo, 
    @esitoRecuperoAmicizie AS esitoReroAmicizie
FROM 
    ListaAmici 
    INNER JOIN 
    Utenti ON ListaAmici.FkAmico = Utenti.IdUtente
WHERE 
    ListaAmici.FkUPropAmicizia = @IdUtente
英文:

The use of Try and Catch should only be for errors,
This query returns two results that will cause an error in the program code, so I suggest you modify the code as follows:

IF EXISTS(SELECT 1 FROM ListaAmici WHERE ListaAmici.FkUPropAmicizia = @IdUtente)
	BEGIN
		SELECT @esitoRecuperoAmicizie = 10
	END
ELSE	
	BEGIN
		SELECT @esitoRecuperoAmicizie = 99
	END

SELECT 
    ListaAmici.FkUPropAmicizia, 
	Utenti.Utnte_Username, 
    Utenti.StatoConnessione, 
	Utenti.ImmagineProfilo, 
	@esitoRecuperoAmicizie AS esitoReroAmicizie
FROM 
    ListaAmici 
	INNER JOIN 
    Utenti ON ListaAmici.FkAmico = Utenti.IdUtente
WHERE 
    ListaAmici.FkUPropAmicizia = @IdUtente

答案2

得分: -1

因为@esitoRecuperoAmicizie的代码逻辑只是被赋值而没有添加任何值,所以当你调用存储过程时,该值将为空。

就像选择@esitoRecuperoAmicizie from dual一样 - 如果你这样做,将会得到返回的值或使用@esitoRecuperoAmicizie变量设置的值。

尝试一下,它会起作用。

英文:

The value will be null when you hit the stored procedure because the code logic of @esitoRecuperoAmicizie is just being assigned and not added in any value.

Like select @esitoRecuperoAmicizie from dual - if you do this this will give you the value returned or set using @esitoRecuperoAmicizie variable

Try it .. it will work

huangapple
  • 本文由 发表于 2023年6月30日 00:56:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/76583136.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定