【问题标题】:Stored Procedure returning 0 on scope identity存储过程在范围标识上返回 0
【发布时间】:2019-01-07 19:23:51
【问题描述】:

我在一个旧项目上使用了同样的程序,它已经工作了一段时间,所以我不知道这个有什么问题,为什么我插入时它返回 0。

IF OBJECT_ID('dbo.spInsertArtigo') IS NOT NULL
    DROP PROCEDURE spInsertArtigo
GO

CREATE PROCEDURE spInsertArtigo
    @IdUser INT,
    ----- hArtigos -----
    @MotivoCriacao NVARCHAR(100) = NULL,
    @CodeRequest TINYINT,
    @Cliente TINYINT,
    @ReferenciaCliente NVARCHAR(50),
    @ReferenciaInterna NVARCHAR(7),
    @Indice NVARCHAR(10),
    @Projecto NVARCHAR(50),
    @Desenho NVARCHAR(50),
    @CadenciaMensal INT,
    @NumCOMDEV NVARCHAR(50),
    @QTDLancamentoFormas INT,
    @CapacidadeReal NVARCHAR(20) = NULL,
    @Observacoes NVARCHAR(100) = NULL,
    ----- hCaixa -----
    @TipoCaixa NVARCHAR(50) = NULL,
    @QTDPecasCaixa INT = NULL,
    @UnidadeProducao NVARCHAR(50) = NULL,
    @CelulaProducao NVARCHAR(50) = NULL,
    @Peso FLOAT,
    @NumKanbansProducao INT = NULL,
    ----- hMetodologiaProducao
    @TipoMetodologia nchar(3) = NULL,
    @QTDMetodoProducao INT = NULL,

    @ID INT = NULL OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    BEGIN
        INSERT INTO hArtigos (MotivoCriacao, CodeRequest, Cliente, ReferenciaCliente, ReferenciaInterna, Indice, Projecto, Desenho,
                              CadenciaMensal, NumCOMDEV, QTDLancamentoFormas, CapacidadeReal, Observacoes, IdUser)
        VALUES (@MotivoCriacao, @CodeRequest, @Cliente, @ReferenciaCliente, @ReferenciaInterna, @Indice, @Projecto, @Desenho,
                @CadenciaMensal, @NumCOMDEV, @QTDLancamentoFormas, @CapacidadeReal, @Observacoes, @IdUser)

        INSERT INTO hCaixa (TipoCaixa, QTDPecasCaixa, UnidadeProducao, CelulaProducao, Peso, NumKanbansProducao, IdArtigo)
        VALUES (@TipoCaixa, @QTDPecasCaixa, @UnidadeProducao, @CelulaProducao, @Peso, @NumKanbansProducao, SCOPE_IDENTITY())

        INSERT INTO hMetodologiaProducao(TipoMetodologia, QTDMetodoProducao, IdArtigo) 
        VALUES (@TipoMetodologia, @QTDMetodoProducao, SCOPE_IDENTITY())

        INSERT INTO hData(DataCriacao, DataAlteracao, IdArtigo)
        VALUES (GETDATE(), GETDATE(), SCOPE_IDENTITY())

        SELECT @ID = SCOPE_IDENTITY()
    END
END

这是我调用程序的地方

public static INT InsertRequisicao(Requisicao req)
{
        string constr = ConfigurationManager.ConnectionStrings["GestaoRequisicoes_ConnectionString"].ConnectionString;
        string query = "spInsertArtigo";

        try
        {
            using (SqlConnection con = new SqlConnection(constr))
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@IdUser", HttpContext.Current.User.Identity.Name);
                cmd.Parameters.AddWithValue("@MotivoCriacao", req.MotivoCriacao);
                cmd.Parameters.AddWithValue("@CodeRequest", req.CodeRequest);
                cmd.Parameters.AddWithValue("@Cliente", req.Cliente);
                cmd.Parameters.AddWithValue("@ReferenciaCliente", req.ReferenciaCliente);
                cmd.Parameters.AddWithValue("@ReferenciaInterna", req.ReferenciaInterna);
                cmd.Parameters.AddWithValue("@Indice", req.Indice);
                cmd.Parameters.AddWithValue("@Projecto", req.Projecto);
                cmd.Parameters.AddWithValue("@Desenho", req.Desenho);
                cmd.Parameters.AddWithValue("@CadenciaMensal", req.CadenciaMensal);
                cmd.Parameters.AddWithValue("@NumCOMDEV", req.NumCOMDEV);
                cmd.Parameters.AddWithValue("@QTDLancamentoFormas", req.NumLancamentoFormas);
                cmd.Parameters.AddWithValue("@CapacidadeReal", req.CapacidadeReal);
                cmd.Parameters.AddWithValue("@TipoCaixa", req.TipoCaixa);
                cmd.Parameters.AddWithValue("@QTDPecasCaixa", req.NumPecasCaixa);
                cmd.Parameters.AddWithValue("@UnidadeProducao", req.UnidadeProducao);
                cmd.Parameters.AddWithValue("@CelulaProducao", req.CelulaProducao);
                cmd.Parameters.AddWithValue("@Peso", req.Peso);                 
                cmd.Parameters.AddWithValue("@NumKanbansProducao", req.NumKanbansProducao);
                cmd.Parameters.AddWithValue("@TipoMetodologia", req.TipoMetodologia);
                cmd.Parameters.AddWithValue("@QTDMetodoProducao", req.NumMetodoProducao);
                cmd.Parameters.AddWithValue("@Observacoes", req.Observacoes);

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

        }
        catch (SqlException ex)
        {
            throw ex;
        }
}

我认为一切看起来都不错...过程与另一个完全相同,我认为 C# 代码没有任何问题

【问题讨论】:

  • 你的表有标识列吗?另外,如果您要做的只是重新抛出错误,为什么还要麻烦尝试/捕获?我会删除 try/catch 块或用它做点什么。
  • 是的 sql 表没问题。我尝试在 db 上手动添加值并工作,问题是 executescalar 返回 0。然后尝试捕获我离开,以便将来我可以使用 elmah 记录错误并向用户显示消息
  • 哦,我想我现在明白你的问题了。您认为它会返回身份值吗?存储过程返回一个 int 作为执行状态。您的过程实际上根本没有 return 语句,因此它将始终返回 0。如果您希望它返回其他内容,则需要使用 return 语句或使用输出参数。
  • 我认为您忘记了 C# 代码中的 OUTPUT 参数。看看this answer 一个非常相似的问题
  • 是的,这解释了 0。我几乎不使用参数输出,也从未注意到这一点

标签: c# sql-server


【解决方案1】:

不是获取ExecuteScalar()的RETURN值,而是需要获取输出参数@ID的值

【讨论】:

  • 啊,我明白了,我什至没有注意到这个细节,因为我习惯于在过程结束时选择并运行标量
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多