Usuário com melhor resposta
adicionar dados na tabela através Chave estrangeira em C#

Pergunta
-
Bom Dia,
Estou me iniciando em ASP.net com C# e me deparei com alguns problemas durante a elaboração do meu programa.
Eu tenho uma tabela clientes e outra tabela ordemservico, unidas através de uma chave estrangeira, no banco de dados MYSQL.
O meu problema é o seguinte, eu preciso cadastrar o cliente com todas as informações necessárias, até ai tudo bem, cliente cadastrado, OK.
O que está me trazendo dificuldade é na hora de fazer a ordem de serviço do cliente, eu não acho uma solução para cadastrar a ordem de serviço no cliente.
eu tenho um form para cadastrar cliente e outro para cadastrar a ordem de serviço.
se precisarem de mais informações, é só pedir.
Eu preciso de ajuda, urgente, se alguém tiver um código fonte pronto, ou um programa, qualquer coisa para me ajudar,eu ficarei muito grato.
meu e-mail se quiserem me mandar mais informações ro_belmonte@hotmail.com.
Repito, é muito urgente.
Obrigado desde já.
- Editado Rodrigo Belmonte de Oliveira segunda-feira, 16 de julho de 2012 13:04
- Movido Levi DomingosModerator segunda-feira, 16 de julho de 2012 14:35 (De:C#)
Respostas
-
Simples, Rodrigo.
Depois do da instrução Insert você busca o último ID com um MAX(), exemplo:
insert tbCliente (campo1, campo2) values ('Valor1','Valor2');
select max(Id) from tbCliente
Com o retorno este select você tem o ID do cliente que acabou de inserir. Você utiliza ele pra fazer novos Inserts na tabela de Ordem de Serviço.
Mas cuidado! Isso pode gerar concorrência. Entre um Insert e um Select outra pessoa pode realizar um Insert e seu Select retornar o valor errado.
Por isso é aconselhável utilizar Procedure pra fazer tudo de uma vez.
[]'s
Danilo Oliveira www.coffeeandcodes.com.br
- Marcado como Resposta Rodrigo Belmonte de Oliveira segunda-feira, 23 de julho de 2012 18:12
-
Coloque o retorno do ExecuteScalar() em uma variável.
Depois disso utilize a variável para o próximo Insert.
[]'s
Danilo Oliveira www.coffeeandcodes.com.br
- Marcado como Resposta Rodrigo Belmonte de Oliveira segunda-feira, 23 de julho de 2012 18:12
-
Rodrigo, no lugar de:
cmd.CommandText = "SELECT LAST_INSERT_ID() ";
eu colocaria
cmd.CommandText = "select max(id) from clientes";
pra minimizar o problema de concorrência.
Depois de atribuir o valor de retorno em idRetorno você pode passar este valor por parâmetro ou por session pra NovaOs.aspx:
Response.Redirect("NovaOs.aspx?idRetorno=" + idRetorno);
OuSession["idRetorno"] = idRetorno; Response.Redirect("NovaOs.aspx");
E na NovaOs.aspx você resgata o valor. Se passar por parâmetro você resgata com Request.QueryString["idRetorno"], se for por session é só pegar o valor da session.
[]'s
Danilo Oliveira www.coffeeandcodes.com.br
- Marcado como Resposta Rodrigo Belmonte de Oliveira segunda-feira, 23 de julho de 2012 18:11
Todas as Respostas
-
Depois que cadastrar o cliente retorne o ID dele por um ExecuteScalar(). Com o ID dele retornado faça outro Insert para as ordens de serviço relacionadas.
Se você estiver utilizando Procedure no MySQL dá pra fazer isso de uma vez só.
[]'s
Danilo Oliveira MCTS - SQL Server 2008, Implementation and Maintenance Blog: www.coffeeandcodes.com.br
-
-
Oi, Rodrigo,
Faltou você explicar em mais detalhes em que ponto do desenvolvimento desta solução está com problemas.
Você comentou que tem 2 forms, mas isso é muito pouco :
- São dois formviews ?
- Em páginas diferentes ou na mesma página ?
- Alimentados por código ou via datasource ?
Enfim, faltam detalhes.
A resposta do Danilo resolve um problema típico deste cenário que é a inclusão de dados relacionados quando uma tabela possui campos identity, mas também não sabemos se é esse seu problema.
Abs,
Dennes
http://www.bufaloinfo.com.brDennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
-
Olá Dennes,
Então, eu tenho dois webforms, em páginas diferentes e alimentado por códigos.
Eu entendi um pouco sobre a resposta do Danilo, mas como não tenho muita experiência gostaria de saber um pouco mais sobre a parte do ID retornado, não entendi muito bem como funciona essa parte.
Obrigado pela atenção, abraços.
-
Simples, Rodrigo.
Depois do da instrução Insert você busca o último ID com um MAX(), exemplo:
insert tbCliente (campo1, campo2) values ('Valor1','Valor2');
select max(Id) from tbCliente
Com o retorno este select você tem o ID do cliente que acabou de inserir. Você utiliza ele pra fazer novos Inserts na tabela de Ordem de Serviço.
Mas cuidado! Isso pode gerar concorrência. Entre um Insert e um Select outra pessoa pode realizar um Insert e seu Select retornar o valor errado.
Por isso é aconselhável utilizar Procedure pra fazer tudo de uma vez.
[]'s
Danilo Oliveira www.coffeeandcodes.com.br
- Marcado como Resposta Rodrigo Belmonte de Oliveira segunda-feira, 23 de julho de 2012 18:12
-
-
Coloque o retorno do ExecuteScalar() em uma variável.
Depois disso utilize a variável para o próximo Insert.
[]'s
Danilo Oliveira www.coffeeandcodes.com.br
- Marcado como Resposta Rodrigo Belmonte de Oliveira segunda-feira, 23 de julho de 2012 18:12
-
-
Como você está inserindo os valores? Está usando procedure ou query direto no código?
Me mostra como você está fazendo que te mostro como pegar o valor e usá-lo pra inserir na tabela de Ordem de Serviço.
Danilo Oliveira www.coffeeandcodes.com.br
-
estou usando a query direto no código.
aqui está, se tiver algum erro, me corrija por favor :)
MySqlConnection conn = new MySqlConnection(conexao); MySqlCommand cmd = new MySqlCommand("Insert into clientes (nome_cli, email_cli, rg_cli, cpfcnpj_cli, endereco_cli, cep_cli," + "bairro_cli, telres_cli, telcom_cli, cel_cli, cidade_cli, estado_cli, data_cli, hora_cli)"+ "VALUES"+ "( '" + tbxNomeCli.Text + "','" + tbxEmailCli.Text + "','" + tbxRgCli.Text + "','" + tbxCpfcnpjCli.Text + "','" + tbxEnderecoCli.Text + "', " + "'" + tbxCepCli.Text + "','" + tbxBairroCli.Text + "','" + tbxTelResCli.Text + "', '" + tbxTelComCli.Text + "', '" + tbxCelCli.Text + "', " + "'" + tbxCidadeCli.Text + "', '" + dpdownEstadoCli.SelectedItem.Text + "', now(), now())"/* + "SELECT @@IDENTITY"*/, conn); conn.Open(); cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT LAST_INSERT_ID() "; int idRetorno = Convert.ToInt32(cmd.ExecuteScalar().ToString()); cmd.Dispose(); conn.Close(); Response.Redirect("NovaOs.aspx"); }
-
Rodrigo, no lugar de:
cmd.CommandText = "SELECT LAST_INSERT_ID() ";
eu colocaria
cmd.CommandText = "select max(id) from clientes";
pra minimizar o problema de concorrência.
Depois de atribuir o valor de retorno em idRetorno você pode passar este valor por parâmetro ou por session pra NovaOs.aspx:
Response.Redirect("NovaOs.aspx?idRetorno=" + idRetorno);
OuSession["idRetorno"] = idRetorno; Response.Redirect("NovaOs.aspx");
E na NovaOs.aspx você resgata o valor. Se passar por parâmetro você resgata com Request.QueryString["idRetorno"], se for por session é só pegar o valor da session.
[]'s
Danilo Oliveira www.coffeeandcodes.com.br
- Marcado como Resposta Rodrigo Belmonte de Oliveira segunda-feira, 23 de julho de 2012 18:11
-