none
Dùvida com Procedure RRS feed

  • Pergunta

  • Olá pessoal,
    Criei uma procedure para a simples inserção de um "Livro" em uma tabela. De acordo com a variável @cod passada, caso ela já exista no banco, é dado um UPDATE, caso contrário um INSERT.

    Meu problema é que minha Procedure funciona perfeitamente executado via Managment Studio, porém via meu aplicativo C# ela sempre entra na rotina de INSERT, nunca na UPDATE, duplicando os dados a cada vez que salvo, e retornando um @cod sempre maior.

    Abaixo meu código em C# e a procedure para análise:

    --- C# ---

    // Procedure de salvar título
    IDbCommand cm = new System.Data.SqlClient.SqlCommand();
    cm.CommandText = "salvaTitulo";
    cm.CommandType = CommandType.StoredProcedure;

    // Parâmetros
    System.Data.SqlClient.SqlParameter pmCod = new System.Data.SqlClient.SqlParameter();
    pmCod.ParameterName = "@cod";
    pmCod.SqlDbType = SqlDbType.Int;
    pmCod.Value = cod;
    pmCod.Direction = ParameterDirection.Output;
    cm.Parameters.Add(pmCod);

    System.Data.SqlClient.SqlParameter pmTitulo = new System.Data.SqlClient.SqlParameter();
    pmTitulo.ParameterName = "@titulo";
    pmTitulo.SqlDbType = SqlDbType.VarChar;
    pmTitulo.Value = titulo;
    pmTitulo.Size = 255;
    cm.Parameters.Add(pmTitulo);

    System.Data.SqlClient.SqlParameter pmSubTitulo = new System.Data.SqlClient.SqlParameter();
    pmSubTitulo.ParameterName = "@subtitulo";
    pmSubTitulo.SqlDbType = SqlDbType.VarChar;
    pmSubTitulo.Value = subtitulo;
    pmSubTitulo.Size = 255;
    cm.Parameters.Add(pmSubTitulo);

    // Executa comando
    banco.ExecutarComando(cm);

    // Pega novo código do título
    System.Data.SqlClient.SqlParameter paramSql;
    paramSql = (System.Data.SqlClient.SqlParameter)cm.Parameters["@cod"];
    cod = (Int32)paramSql.Value;


    --- Procedure ---

    USE [livroteca]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].salvaTitulo
        @cod int output,    
        @titulo varchar(255),
        @subtitulo varchar(255)
    AS
        SET NOCOUNT ON;

        IF exists(SELECT id FROM titulos WHERE id = @cod) AND @cod > 0
            BEGIN
                UPDATE titulos SET
                    titulo = @titulo,
                    subtitulo = @subtitulo
                WHERE id = @cod
                SET @cod = @cod
            END
        ELSE
            BEGIN
                INSERT INTO titulos
                    (titulo, subtitulo)
                VALUES
                    (@titulo, @subtitulo)
                SET @cod = @@identity
            END
    GO


    Muito obrigado
    domingo, 20 de maio de 2007 22:21

Respostas

  • Oi !

     

    Nesta linha :

     

    pmCod.Direction = ParameterDirection.Output;

     

    Você está definindo o parâmetro @cod apenas como output. Uma das opções do ParameterDirection é InputOutput, experimente utilizar esta e verifique se resolve o problema.

     

    []'s

     

     

    domingo, 20 de maio de 2007 22:29

Todas as Respostas

  • Oi !

     

    Nesta linha :

     

    pmCod.Direction = ParameterDirection.Output;

     

    Você está definindo o parâmetro @cod apenas como output. Uma das opções do ParameterDirection é InputOutput, experimente utilizar esta e verifique se resolve o problema.

     

    []'s

     

     

    domingo, 20 de maio de 2007 22:29
  • Impressionante como as vezes um detalhe pode consumir horas...

    Muito obrigado Dennes, salvou meu dia.
    domingo, 20 de maio de 2007 23:09