【问题标题】:How to obtain returned scalar value of a Stored Procedure using dapper如何使用 dapper 获取存储过程的返回标量值
【发布时间】:2015-12-22 05:35:45
【问题描述】:

我对 dapper-dot-net 非常陌生,我正在尝试调用一个名为 esp_TRV_PERIODO_MES_CRU 的存储过程,它返回一个 int,即 IdPeriodo 插入/现有/更新的记录

请不要删除我代码中的 cmets,因为它们显示了我尝试过但未成功的其他方法

DECLARE @return_value int

EXEC    @return_value = [dbo].[esp_TRV_PERIODO_MES_CRU]
        @anio = 2017,
        @mes = 12,
        @mesCerrado = NULL

SELECT  'Return Value' = @return_value

我有以下(非工作)实现

public Tescalar ExecuteScalar<Tescalar>(string spName, DynamicParameters p)
{
    Tescalar resp ;

    resp = default(Tescalar);

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        try
        {

            connection.Open();
            resp = connection.ExecuteScalar<Tescalar>(spName, p, null, connection.ConnectionTimeout, commandType: CommandType.StoredProcedure);
            //connection.Execute(spName, p, null, connection.ConnectionTimeout, commandType: CommandType.StoredProcedure);
        }
        catch (Exception ex)
        {

            throw ex;
        }
        return resp;
    } 
}

我是这样调用上述方法的:

public Int32 ConsultarPeriodoMes(int anio, int mes)
{
    Int32 idPeriodo;
    DynamicParameters parametros;
    DynamicParameters resp;

    parametros = new DynamicParameters();
    parametros.Add("@anio", anio);
    parametros.Add("@mes", mes);
    parametros.Add("@mesCerrado", null);

    //idPeriodo = GetDataBaseHelper().ExecuteProcedureNonQuery("esp_TRV_PERIODO_MES_CRU", parametros);

    //resp = GetDataBaseHelper().ExecuteProcedure("esp_TRV_PERIODO_MES_CRU", parametros);
    //idPeriodo = -999;

    idPeriodo = GetDataBaseHelper().ExecuteScalar<Int32>("esp_TRV_PERIODO_MES_CRU", parametros);



    return idPeriodo;
}

我已经测试了存储过程 esp_TRV_PERIODO_MES_CRU 并返回了预期的 INSERTED/FOUND/UPDATED 实体的 idPeriodo,这里是 SP

CREATE PROC [dbo].[esp_TRV_PERIODO_MES_CRU]
@anio INT,
@mes INT,
@mesCerrado BIT
AS
BEGIN
    DECLARE
    @idperiodo AS INT

    --Verfica si el periodo existe, dado los parametros anio y mes 
    SELECT @idperiodo = ISNULL((SELECT IdPeriodoMes FROM TRV_PERIODO_MES(NOLOCK) WHERE Anio=@anio AND Mes=@mes),-1)

    IF @idperiodo > -1
        UPDATE [dbo].[TRV_PERIODO_MES]
        SET [CierreEjecutado] = ISNULL(@mesCerrado, 0)
        WHERE IdPeriodoMes = @idperiodo
    ELSE
    BEGIN
        INSERT INTO TRV_PERIODO_MES VALUES(@anio,@mes,ISNULL(@mesCerrado, 0))
        SET  @idperiodo = SCOPE_IDENTITY();
    END

    RETURN @idperiodo
END

为了能够使用 dapper-dot-net 获得上面显示的存储过程的返回值,我需要修复什么

【问题讨论】:

标签: sql-server store dapper


【解决方案1】:

您也可以使用 DynamicParameters。

using (IDbConnection con = new SqlConnectionFactory().Create())
        {
            var p = new DynamicParameters();

            //parameters
            p.Add("@x", valueX);
            p.Add("@y", valueY);

            //return value
            p.Add("@idperiodo", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

            //PSET_SOURCEEVENT - name of procedure
            con.Execute("PSET_SOURCEEVENT", p, commandType: CommandType.StoredProcedure);
            con.Close();
            return p.Get<int>("@idperiodo");
        }

【讨论】:

  • 这没有回答问题。而是将此作为评论发布。
猜你喜欢
  • 1970-01-01
  • 2022-07-29
  • 2010-10-19
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多