Usuário com melhor resposta
recuperar id antes de ser gravado

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.
Respostas
-
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
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!
-
-
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! -
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.
-
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
-
-
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
-