none
Definir Campo varchar RRS feed

  • Pergunta

  • Olá pessoal,

     

    Tenho na procedure abaixo um campo tipo @CH_TIPO AS int OUTPUT, como defino um campo varchar, 50 com OUTPUT,

     

    Grato,

    Dirceu

     

    ALTER PROCEDURE [dbo].[USP_Pec_01_Usuarios_Seleciona]

    @LOGIN AS varchar(50),

    @SENHA AS varchar(255),

    @SITUACAO AS varchar(7),

    @VCATEGORIA As Varchar(50),

    @CH_TIPO AS int OUTPUT

    As

    if (@login Is Not Null)

    Begin

    SET NOCOUNT ON

     

    SELECT a.Descricao, a.ch_top from Tb_Pec_01_Usuarios_Grupos a

    INNER JOIN Tb_Pec_01_Usuarios b ON a.ch_top=b.grupo WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao AND Categoria = @VCategoria

    SET @CH_TIPO = (SELECT ch_top from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

    update Tb_Pec_01_Usuarios

    set situacao = 'Inativo' WHERE Data_Vencimento > Data_Cadastro + 365

    SET NOCOUNT OFF

    End

    Else

    Begin

    SET NOCOUNT ON

    Select nome From tbl_pec_01_Usuarios

    SET NOCOUNT OFF

    End

    RETURN

    terça-feira, 24 de julho de 2007 17:41

Respostas

  •  

     

    Utilize entao ExecuteNonQuery em vez de executeScalar

     

    porque assim você informa quantos parametros output e tem o valor de retorno deles sem problemas.

     

     

    quarta-feira, 25 de julho de 2007 16:45

Todas as Respostas

  • Oi !

     

    Simplesmente colocando a palavra output após o varchar(50).... é essa a dúvida ?

     

    []'s

     

    terça-feira, 24 de julho de 2007 17:55
  •  

    Se for isso, o Dennes esta certo!!! 

    terça-feira, 24 de julho de 2007 18:07
  • Olá Pessoal,

     

    Fiz dessa forma;

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    GO

    -- =============================================

    -- Author: Dirceu Martins de Azevedo

    -- Create date: 07/06/2007

    -- Description: Busca registros do Banco

    -- =============================================

    ALTER PROCEDURE [dbo].[USP_Pec_01_Usuarios_Seleciona]

    @LOGIN AS varchar(50),

    @SENHA AS varchar(255),

    @SITUACAO AS varchar(7),

    @VCATEGORIA As Varchar(50),

    @CHCATEGORIA As Varchar(50) OUTPUT,

    @CH_TIPO AS int OUTPUT

    As

    if (@login Is Not Null)

    Begin

    SET NOCOUNT ON

     

    SELECT a.Descricao, a.ch_top from Tb_Pec_01_Usuarios_Grupos a

    INNER JOIN Tb_Pec_01_Usuarios b ON a.ch_top=b.grupo WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao AND Categoria = @VCategoria

    SET @CH_TIPO = (SELECT ch_top from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

    SET @CHCATEGORIA = (SELECT Categoria from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

    update Tb_Pec_01_Usuarios

    set situacao = 'Inativo' WHERE Data_Vencimento > Data_Cadastro + 365

    SET NOCOUNT OFF

    End

    Else

    Begin

    SET NOCOUNT ON

    Select nome From tbl_pec_01_Usuarios

    SET NOCOUNT OFF

    End

    RETURN

     

     

    Fiz dessa forma, sem  isso essas linha abaixo funciona, com elas não:

     

    CHCATEGORIA As Varchar(50) OUTPUT,

    SET @CHCATEGORIA = (SELECT Categoria from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

     

     

    Qual o erro,

    Grato

    Dirceu

     
    quarta-feira, 25 de julho de 2007 13:39
  • Oi !

     

    Qual erro ocorre ?

     

    Chutes :

     

    1) Seu select está retornando mais de uma linha

    2) Seu select não está retornando nada e isso está gerando algum erro...

     

    []'s

     

    quarta-feira, 25 de julho de 2007 14:18
  • Olá,

     

    Não esta retornando nada!

     

    Dirceu

    quarta-feira, 25 de julho de 2007 15:11
  •  

     

    entao coloca assim

     

    SET @CHCATEGORIA = (SELECT isnull(Categoria,-99) from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

     

     

    sendo que -99 é uma categoria que não existe e que você irá tratar na aplicação ou mesmo no banco.

     

    []'s

     

    Rafael Krisller

    quarta-feira, 25 de julho de 2007 15:14
  • Olá,

     

    Deu erro de novo, não sei o que poder ser, estou recebendo dessa forma no código...

     

    SqlParameter prChCat;

    prChCat = new SqlParameter("@CH_CATEGORIA", SqlDbType.VarChar,50);

    prChCat.Value = string.Empty;

    cmd.Parameters.Add(prChCat);

    prChCat.Direction = ParameterDirection.InputOutput;

     

    Abs,

     

    Dirceu

    quarta-feira, 25 de julho de 2007 15:33
  •  

     

    Mas ocorre erro aonde? No SQL , erro de syntaxe ?

     

    Porque você tem que recuperar o valor depois de executar a procedure.

     

    EX:

     

    cmd.ExecuteNonQuery()

     

    if prChCat.Value == "-99"

    {

      //categoria invalida.

    }

     

     

    Descreva o erro que fica mais fácil de resolver.

     

    []'s

     

    Rafael Krisller

    quarta-feira, 25 de julho de 2007 16:27
  • Oi,

     

    E um sistema de login, como uso ExecuteScalar(), só posso retornar um valor;

    Preciso criar uma Session com o id do usuário, então faço isso,:

     

    @CH_TIPO AS int OUTPUT

     

    SET @CH_TIPO = (SELECT ch_top from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

     

    Então  recebo deste forma:

     

    SqlParameter prChTipo;

    prChTipo= new SqlParameter("@CH_TIPO" ,SqlDbType.Int,4);

    prChTipo.Value = 0;

    cmd.Parameters.Add(prChTipo);

    prChTipo.Direction = ParameterDirection.InputOutput;

     

    Então crio a Session com o id do usuário.

    Session["CHTIPO"] = prChTipo.Value.ToString();

     

    Até aqui roda sem problemas...

    ------------------------------------------------------------------------------------------------------------------------

     

    Meu problema começa aqui...

    Preciso passar além do id do usuário, a categoria do usuário cadastrada no banco...

    Faço assim:

     

    @CHCATEGORIA As Varchar(50) OUTPUT,

     

    SET @CHCATEGORIA = (SELECT Categoria from Tb_Pec_01_Usuarios WHERE Login = @Login AND Senha = @Senha And Situacao = @Situacao And Categoria = @vCategoria)

     

    e recebo desta forma:

     

     SqlParameter prChCat;

     prChCat = new SqlParameter("@CH_CATEGORIA", SqlDbType.VarChar,50);

     prChCat.Value = prChCat;

     cmd.Parameters.Add(prChCat);

     prChCat.Direction = ParameterDirection.InputOutput;

     

    Só que desta forma o programa deixa de funcionar...

     

    Dirceu

     

     

    quarta-feira, 25 de julho de 2007 16:41
  •  

     

    Utilize entao ExecuteNonQuery em vez de executeScalar

     

    porque assim você informa quantos parametros output e tem o valor de retorno deles sem problemas.

     

     

    quarta-feira, 25 de julho de 2007 16:45
  • Oi !

     

    ExecuteScalar não impede que parâmetros de retorno sejam devidamente recebidos no client. Um parâmetro virá pelo resultado do ExecuteScalar, os demais como parâmetros de output e todos serão devidamente recebidos.

     

    []'s

     

    quarta-feira, 25 de julho de 2007 17:12
  • Olá Dennes,

     

    Estou com problemas na classe que me passou, poderia me dar uma força.

     

    Me passou esta clesse em VB, esta convertida pra C#.

     

    public class clsSession : System.Web.UI.Page

    {

    public string CHTIPO

    {

    get

    {

    if ((Session["CHTIPO"] != null))

    {

    return (Session["CHTIPO"].ToString());

    }

    if (Context.User.Identity.IsAuthenticated)

    {

    Session["CHTIPO"] = Context.User.Identity.Name;

    }

    else

    {

    System.Web.Security.FormsAuthentication.RedirectToLoginPage();

    Response.End();

    }

    return (Session["CHTIPO"].ToString());

    }

    }

    }

     

    Cono faço para chamar esta classe e passando os parâmetro no meu  page Load..

     

    Dirceu

     

    quarta-feira, 25 de julho de 2007 17:22