none
adicionar dados na tabela através Chave estrangeira em C# RRS feed

  • 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á.



    segunda-feira, 16 de julho de 2012 13:00

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

    terça-feira, 17 de julho de 2012 15:04
  • 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

    terça-feira, 17 de julho de 2012 19:56
  • 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);
    Ou
    Session["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

    segunda-feira, 23 de julho de 2012 17:57

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

    segunda-feira, 16 de julho de 2012 14:07
  • É, eu acho que não entendi muito bem, se não for muito chato,

    você não poderia me dar um exemplo?

    segunda-feira, 16 de julho de 2012 20:23
  • 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.br


    Dennes - 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

    segunda-feira, 16 de julho de 2012 21:28
  • 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.

    terça-feira, 17 de julho de 2012 14:16
  • 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

    terça-feira, 17 de julho de 2012 15:04
  • Olá Danilo, 

    então, até ai eu entendi, mas como eu farei para utilizar o id para fazer inserts na tabela de ordem de serviço?


    terça-feira, 17 de julho de 2012 17:45
  • 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

    terça-feira, 17 de julho de 2012 19:56
  • Bom, eu não consegui aqui,

    como eu colocarei o retorno em uma variável? 

    e como eu sei que está dando o valor correto no retorno?

    quinta-feira, 19 de julho de 2012 19:40
  • 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

    segunda-feira, 23 de julho de 2012 14:31
  • 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");
    
                
            }

    segunda-feira, 23 de julho de 2012 17:40
  • 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);
    Ou
    Session["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

    segunda-feira, 23 de julho de 2012 17:57
  • Nossa, funcionou perfeitamente!! 

    Obrigado, me ajudou muito mesmo!

    segunda-feira, 23 de julho de 2012 18:11