none
transacções RRS feed

  • Pergunta

  • ola, pretendo fazer o seguinte:

    tenho um formulario em que o utilizador insere um artigo que pertence a um tipo de negocio(venda,leilao).apos a inserção do artigo,vou guardar os dados do mesmo na tabela artigo e tambem na tabela artigo_venda ou artigo_leilao.na tabela artigo o chave primaria id_Artigo é identity e apos inserir o artigo nessa tabela preciso de capturar o id do artigo inserido para inserir na tabela artigo_venda ou artigo_classificado depende do de negocio.

    tabela artigo campos(id_Artigo,titulo,descricao)

    tabela artigo_venda(id_artigo,preco,comissao).

    penso que neste caso se justifica uma transacção, e entao fiz a seguinte:

    BEGIN TRANSACTION T1
     
      Declare @Ident int
     
     insert into artigo(titulo,descricao,n_unidades) values('"&titulo&"','"&descricao&"','"&n_unidades&"')
     
     Select @Ident = SCOPE_IDENTITY()
     
     insert into artigo_venda values(Ident,'"&preco&"','"&comissao&"')

    COMMIT TRANSACTION T1

    Gostava de saber se esta transacçao tem potencial.

    obrigado.

     

    terça-feira, 29 de agosto de 2006 10:58

Todas as Respostas

  • CREATE TABLE TB01
    (COD INT IDENTITY,
     DESCR VARCHAR(10))

    DECLARE @IDENT INT

    BEGIN TRANSACTION
    INSET TB01 VALUES ('TESTE')

    SELECT @IDENT = @@IDENTITY

    INSERT TB02 VALUES (1, @IDENT, 'TESTE')

    COMMIT TRANSACTION

     

    ABS

     

    terça-feira, 29 de agosto de 2006 11:45
  •  

     

     vc. esta usando isso pela aplicacao, o que eu sugiro e colocar tudo em uma procedure como no exemplo do Andre....

     

     

    terça-feira, 29 de agosto de 2006 11:58
  • obrigado Andre pela atenção, nao seria melhor usar Select @Ident = SCOPE_IDENTITY()  em vez de  

    SELECT @IDENT = @@IDENTITY .Andre eu para inserir dados na b.d. uso um sqlcommand.

    ficheiro aspx.vb

    Dim command As SqlCommand

    command = New SqlCommand(insert into utilizador(nome,morada,telefone) values('" & nome & "','" & morada & "','" & telefone & "'),ligacao)

    command.ExecuteNonQuery()

    Para criar uma transacção posso fazer:

    command = New SqlCommand(

    DECLARE @IDENT INT

    BEGIN TRANSACTION
    INSET TB01 VALUES ('TESTE')

    SELECT @IDENT = @@IDENTITY

    INSERT TB02 VALUES (1, @IDENT, 'TESTE')

    COMMIT TRANSACTION 

     ).

    obrigado.

    terça-feira, 29 de agosto de 2006 12:18
  • Eu tb acho que vc deveria colocar o exemplo em um procedure... depois vc pode chamar a procedure através da aplicação

     

    abs

     

    terça-feira, 29 de agosto de 2006 13:04
  • ola mais uma vez, vocês acham que este stored procedure permite fazer o que pretendo e que descrevi ni primeiro post?

    create procedure insereArtigos
    @titulo varchar(50),
    @descricao varchar(50),
    @n_unidades numeric(2),
    @preco numeric(9),
    @comissao numeric(9)
    As
    BEGIN
    insert into artigo(titulo,descricao,n_unidades) values(@titulo,@descricao,@n_unidades)
    Select @Ident = SCOPE_IDENTITY()
    insert into artigo_venda(id_artigo,preco,comissao) values(@Ident,@preco,@comissao)
    END

    terça-feira, 29 de agosto de 2006 14:29
  • Sim fiz alguma alterações.... vc pode trabalhar com transações..

    create procedure insereArtigos
    @titulo varchar(50),
    @descricao varchar(50),
    @n_unidades numeric(2),
    @preco numeric(9),
    @comissao numeric(9)
    As
    BEGIN TRANSACTION
    insert into artigo(titulo,descricao,n_unidades) values(@titulo,@descricao,@n_unidades)
    Select @Ident = SCOPE_IDENTITY()
    insert into artigo_venda(id_artigo,preco,comissao) values(@Ident,@preco,@comissao)
    COMMIT TRANSACTION

    terça-feira, 29 de agosto de 2006 14:41
  • ola Andre numa transacção posso ter varios insert´s ou existe um numero maximo?

     

    obrigado.

    terça-feira, 29 de agosto de 2006 15:01
  • Podem tem vários...... mas vc tem que tomar cuidado se colocar muitos.....  porque vc pode causar bloqueios nas tabelas....  enquanto uma transação esta aberta os dados estão bloqueados

     

    abs

     

    terça-feira, 29 de agosto de 2006 15:04