none
recuperar id antes de ser gravado RRS feed

  • Pergunta

  • tenho o seguite cenário um form que de pedidos, que tem um campo codigo do pedido e data do pedido que gravado em tabela pedidos e outros campos item, valor, quantidade que gravam em outra tabela itemspedidos, nesta tabela tambem tem um campo idpedido que precisa ser gravado, mas devo gravar tudo na tabela pedido antes de gravar na tabela itenspedido, o problema e seguinte quero uma classe que possa gerar o idpedido antes de ele ser gravado e deve ser repassado para um textEdit.

     

     

    domingo, 31 de julho de 2011 22:24

Respostas

Todas as Respostas

  • Olá Wilson, você pode usar o comando do sql @@IDENTITY, ele retorna o ultimo id do insert que acabou de ser executado, detalhe esse comando só pode ser usada apos um insert ter acabado de ser executado, pois esta na mesma sessão do SQL, fiz um exemplo, espero que você entenda a ideia, 1 pedido pode ter 1 ou N itens, segue código abaixo, qualquer duvida só perguntar:
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.IO;
    using System.Text;
    using System.Data.SqlClient;
    
    namespace WebApplication5
    {
     //Classe que tem os itens do pedido
     public class ItensDePedido
     {
      public string Produto { get; set; }
      public int Quantidade { get; set; }
      public int PrecoTotal { get; set; }
     }
    
     public partial class WebForm1 : System.Web.UI.Page
     {
      protected void Page_Load(object sender, EventArgs e)
      {
       using (SqlConnection conn = new SqlConnection("StringDeConexao"))
       {
        //Query
        StringBuilder _queryPedido = new StringBuilder();
        _queryPedido.Append("INSERT INTO tbPedido (NomeCliente, DataPedido) ");
        _queryPedido.Append("VALUES ");
        _queryPedido.Append("(@NomeCliente,@DataPedido) ");
    
        //Usando comando @@IDENTITY para recuperar ultimo ID da tabela tbPedido que acabou de ser inserido
        _queryPedido.Append("SELECT @@IDENTITY ");
    
        //Passando query a ser executada e instancia de SqlConnection
        SqlCommand cmdPedido = new SqlCommand(_queryPedido.ToString(), conn);
    
        //Parametrizandro valores que vão para o insert
        cmdPedido.Parameters.Add("@NomeCliente", SqlDbType.VarChar).Value = null;
        cmdPedido.Parameters.Add("@DataPedido", SqlDbType.SmallDateTime).Value = null;
    
        //Gravando o pedido
        try
        {
         //Abrindo conexao
         conn.Open();
    
         //Variavel que vai guarda o ID do pedido que acabou de ser inserido
         int _idPedido = Convert.ToInt32(cmdPedido.ExecuteScalar());
    
         //Gravando itens do pedido, ja temos o id do pedido gravado na variavel
         try
         {
          //Vamos supor que voce tem uma lista com todos os pedidos
          List<ItensDePedido> listaDeItensDePedidos = new List<ItensDePedido>();
    
          //Chamando método para gravar os itens de pedido, não precisa abrir a conexao
          // pois a mesma ja esta aberta
          //Foi passado como parametro o obj connection ja instanciado, o id do pedido,
          //e a lista de itens do pedido a ser inserido
          InserirItensDePedidos(conn, _idPedido, listaDeItensDePedidos);
    
         }
         catch (Exception)
         {
    
          //Sua rotina para tratar erro ao inserir o itens de pedido
         }
        }
        catch (Exception)
        {
         //Sua rotina para tratar erro ao inserir o pedido
        }
       }
      }
    
      private static void InserirItensDePedidos(SqlConnection conn, int _idPedido, List<ItensDePedido> listaDeItensDePedidos)
      {
       //Query
       StringBuilder _queryItensPedido = new StringBuilder();
       _queryItensPedido.Append("INSERT INTO tbItensPedido (IdPedido, Produto, Quantidade, PrecoTotal) ");
       _queryItensPedido.Append("VALUES ");
       _queryItensPedido.Append("(@IdPedido,@Produto,@Quantidade,@PrecoTotal) ");
    
    
       for (int i = 0; i < listaDeItensDePedidos.Count; i++)
       {
        //Passando query a ser executada e instancia de SqlConnection
        using (SqlCommand cmdItensPedido = new SqlCommand(_queryItensPedido.ToString(), conn))
        {
         //Parametrizandro valores que vão para o insert
         cmdItensPedido.Parameters.Add("@IdPedido", SqlDbType.Int).Value = _idPedido;
         cmdItensPedido.Parameters.Add("@Produto", SqlDbType.VarChar).Value = listaDeItensDePedidos[i].Produto;
         cmdItensPedido.Parameters.Add("@Quantidade", SqlDbType.Int).Value = listaDeItensDePedidos[i].Quantidade;
         cmdItensPedido.Parameters.Add("@PrecoTotal", SqlDbType.Decimal).Value = listaDeItensDePedidos[i].PrecoTotal;
        }
       }
      }
     }
    }
    
     
    Vitor Mendes | Seu feedback é muito importante para todos!


    domingo, 31 de julho de 2011 23:56
  • entendi seu codigo mais o que estou querendo e assim e pegar o ultimo id +1 e colocar esse valor dentro de uma variavel.

     

    o restante do codigo eu ja tenho pronto falta isso... e alguns pontos que quero deixar para depois que resolver isso.

    segunda-feira, 1 de agosto de 2011 00:44
  • Wilson você poderia me responder uma coisa, a sua tabela esta com a propriedade Identity Specification habilitado (Yes) ou você esta utilizando o método de buscar o ultimo id + 1 ??

    Caso seja id + 1, segue o código, mais cuidado que esse tipo de método pode te trazer problema, erro do tipo id duplicado caso a operação para inserir itens de pedido demore muito e outro pedido esteja sendo cadastrado ao mesmo tempo:

    SELECT TOP 1 (id + 1) AS 'ID somando mais 1', id as 'ID sem soma'
    FROM Tabela1 ORDER BY id DESC
    

    Bom  seria trabalhar com auto-incremento, fica a dica:
    http://www.devmedia.com.br/post-17974-TRABALHANDO-COM-CAMPOS-AUTO-INCREMENTO--IDENTITY-NO-SQL-SERVER.html 
    Vitor Mendes | Seu feedback é muito importante para todos!
    segunda-feira, 1 de agosto de 2011 01:00
  • Valeu, sei que e melhor trabalhar com Auto-incremento, mas não estou vendo solucao, deixa eu ser mais claro, no outro post que vc me ajudou com o sistema de pedido, estou fazendo tenho que gravar o pedido antes dos itens, mas no itens tem o id do pedido com FK e ae tenho que gravar tudo de uma vez, a forma que falei id+1 foi a maneira que pensei, mas se você tiver uma solução meelhor para mim eu iria agradecer.
    segunda-feira, 1 de agosto de 2011 01:23
  • Valeu, sei que e melhor trabalhar com Auto-incremento, mas não estou vendo solucao, deixa eu ser mais claro, no outro post que vc me ajudou com o sistema de pedido, estou fazendo tenho que gravar o pedido antes dos itens, mas no itens tem o id do pedido com FK e ae tenho que gravar tudo de uma vez, a forma que falei id+1 foi a maneira que pensei, mas se você tiver uma solução meelhor para mim eu iria agradecer.
    Olá Wilson, então vou te explicar um sistema que fiz parecido e como fiz ele.

    Era uma sistema de questionário, quando eu gravasse uma questão eu já pegava o id dessa questão que acabou de ser inserida, e passo para um outro método que gravava as alternativas, que estão vinculada diretamente a questão (FK) é o mesmo contexto que o seu.

    Caso o seu campo (PK) da tabela pedido seja identity com o comando @@identity ele retorna o ultimo id da tabela pedido que acabou de ser inserido ,bom como você quer fazer tudo em um insert só, fiz um exemplo mais o insert com múltiplos valores só funciona no SQL 2008, tem dois método mostrado neste site que você pode usar tambem:

    http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row-constructor/

    Segue código SQL abaixo que utilizei:
    --Declarei a variavel para guarda o id do pedido
    DECLARE @idPedido INT
    
    --Inseri o pedido
    INSERT INTO tbPedido   
    VALUES
    ('Vitor Mendes')
    
    --Recuperei o id do pedido
    SET @idPedido = @@IDENTITY
    
    --Inserindo itens do pedido, e passando id do pedido
    INSERT INTO tbItensPedido
    (idPedido,produto,quantidade)
    VALUES
    (@idPedido,'Tomate',4),
    (@idPedido,'Alface',4),
    (@idPedido,'Banana',4),
    (@idPedido,'Abacaxi',4)
    
    --Exibindo valores selecionado
    SELECT * FROM tbPedido
    SELECT * FROM tbItensPedido
    

    Resultado:

    Vitor Mendes | Seu feedback é muito importante para todos!
    • Sugerido como Resposta Vitor Mendes segunda-feira, 1 de agosto de 2011 16:42
    segunda-feira, 1 de agosto de 2011 02:43
  • valeu, é isso que eu quero o problema é que meu banco de dados é MYsql, mas esto tentando adaptalo....
    terça-feira, 2 de agosto de 2011 14:12
  • valeu, é isso que eu quero o problema é que meu banco de dados é MYsql, mas esto tentando adaptalo....
    Wilson, tem com sim no MySql, segue dois links que possam te ajudar:
    http://www.electrictoolbox.com/mysql-insert-multiple-records/
    http://a-jason.blogspot.com/2005/12/identity-equivalent-in-mysql-getting.html 
    Vitor Mendes | Seu feedback é muito importante para todos!
    • Marcado como Resposta WILSONCX sexta-feira, 5 de agosto de 2011 22:50
    terça-feira, 2 de agosto de 2011 14:34
  • Valeu Vitor fez dessa forma como você falou  só adaptei para o MySql.
    sexta-feira, 5 de agosto de 2011 22:51