none
Retornar o id ao clicar no botão novo RRS feed

  • Pergunta

  • Olá pessoal estou com um problema, tenho um cadastro de pedido eu queria que quando o usuario clicar no botão novo automaticamente gerasse um codigo, e exibisse o mesmo.

    fiz o codigo mais esta dando erro de referencia. esse é o codigo.

    criei a classe para retornar o id.

    public int retornarID()

            {

                String conectar = @"Data Source=\Program Files\ATVENDAS\BancoDados.sdf;Password=root;";

                conexao = new SqlCeConnection(conectar);

                string objSql = "select max(idPedido) from Pedido";

                SqlCeConnection conn = new SqlCeConnection();

                SqlCeCommand objCmd = new SqlCeCommand(objSql, conn);

                object cod;

     

                try

                {

                    cod = objCmd.ExecuteScalar();

                    if (cod != DBNull.Value)

                    {

                        cod = objSql + 1;

                    }

                    else

                    {

                        cod = 1;

                    }

                }

                catch (Exception ex)

                {

                    MessageBox.Show("erro" + ex);

                }

     

            } 

     

    aqui é onde eu chamo a classe no botão novo.

     

     

     private void NovoPedido_Click(object sender, EventArgs e)

              {

                PedidoModel pedido = new PedidoModel();

                int id = 0;

                  try

                        {

                            id = pedidoDAO.retornarID();

                            pedido.Codigo = Convert.ToInt32(id);

                        }

                        catch (Exception ex)

                        {

                            MessageBox.Show("erro ao adicionar\n" + ex);

                        }

                    }

     

                desde já muito obrigado.

     

    quarta-feira, 16 de março de 2011 02:32

Respostas

  • @Olha Purga

    Eu fiz um teste, tu tens razao, nao traz nenhum valor. entao fiz desta forma, e ja funciona:

     private void pegar_Valor_Maximo()

            {

                SqlConnection conn = new SqlConnection(WindowsFormsApplication2010.Properties.Settings.Default.Connection);

                SqlCommand comando = new SqlCommand("Select Max(IDD) from Table_Copy", conn);

                conn.Open();

     

                SqlDataReader ler = comando.ExecuteReader();

     

                DataTable dt = new DataTable();

                dt.Load(ler);

     

                string pegar_Valor = Convert.ToString(dt.Rows[0][0].ToString());

     

                pegar_Valor += 1;

     

                MessageBox.Show(pegar_Valor.ToString());

                conn.Close();

            }

     

            private void button2_Click(object sender, EventArgs e)

            {

                pegar_Valor_Maximo();

            }


    Just Be Humble Malange!
    sexta-feira, 18 de março de 2011 23:19
    Moderador
  • Fiz um novo Teste e usei o While e funciona perfeitamente:

    private void pegar_Valor_Maximo()

            {

                SqlConnection conn = new SqlConnection(WindowsFormsApplication2010.Properties.Settings.Default.Connection);

                SqlCommand comando = new SqlCommand("Select Max(IDD) from Table_Copy", conn);

                conn.Open();

                SqlDataReader ler = comando.ExecuteReader();

                string pegar_Valor= string.Empty;

                while (ler.Read())

                {

                    pegar_Valor = Convert.ToString(ler.GetValue(0).ToString());

                }

                pegar_Valor += 1;

                MessageBox.Show(pegar_Valor.ToString());

               conn.Close();

            }

     

            private void button2_Click(object sender, EventArgs e)

            {

                pegar_Valor_Maximo();

            }

    Eu deveria ter testado antes. Desculpa.


    Just Be Humble Malange!
    sexta-feira, 18 de março de 2011 23:29
    Moderador

Todas as Respostas

  • Que erro de referência esta acontecendo?
    quarta-feira, 16 de março de 2011 12:05
  • Só aparece isso.

    erro ao adicionar.

    System.NullReferenceException  

    quarta-feira, 16 de março de 2011 20:43
  • Só aparece isso.

    erro ao adicionar.

    System.NullReferenceException  

    String  cod = objCmd.ExecuteScalar().ToString();
    Just Be Humble Malange!
    quarta-feira, 16 de março de 2011 22:45
    Moderador
  • Por favor alguém pode olhar esse código e me dizer o por que ele não me retorna o id do banco ?



    public int retornarID()
            {
                    //chama o método conectar
                    String conectar = @"DataSource=\ProgramFiles\ATVENDAS\BancoDados.sdf;Password=root;";
                    conexao = new SqlCeConnection(conectar);
                    SqlCeConnection conn = new SqlCeConnection();
                    object idPedido;
                    idPedido = 0;
                    conn.Open();

                    string objSql2 = "select max(idPedido + 1) AS codigo from Pedidos"; 
                    SqlCeCommand cmd = new SqlCeCommand(objSql2, conn);
                    try
                    {
                        
                        String reader = cmd.ExecuteReader().ToString();
                                          
                        if (idPedido != DBNull.Value)
                        {
                            idPedido = reader;
                        }
                        else
                        {
                            idPedido = 1;
                        }
                    }
                    catch (Exception ex)
                    {

                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                    return  Convert.ToInt32(idPedido);


                }

    Desde já muito obrigado.
    quinta-feira, 17 de março de 2011 04:12
  • Amigo,

    Como não sei qual db vc está utilizando vou postar uma solução que funciona no SQL Server.

    public int retornarID()
        {
            //chama o método conectar
            String conectar = @"DataSource=\ProgramFiles\ATVENDAS\BancoDados.sdf;Password=root;";
            conexao = new SqlCeConnection(conectar);
            SqlCeConnection conn = new SqlCeConnection();
            object idPedido;
            idPedido = 0;
            conn.Open();
    
            string objSql2 = "select top 1 idPedido AS codigo from Pedidos order by idPedido desc"; 
            SqlCeCommand cmd = new SqlCeCommand(objSql2, conn);
            try
            {
              
              String reader = cmd.ExecuteReader().ToString();
                       
              if (idPedido != DBNull.Value)
              {
                idPedido = reader+1;
              }
              else
              {
                idPedido = 1;
              }
            }
            catch (Exception ex)
            {
    
              throw ex;
            }
            finally
            {
              conn.Close();
            }
            return Convert.ToInt32(idPedido);
    
    
          }
    
    Espero ter ajudado.


    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"
    quinta-feira, 17 de março de 2011 04:43
  • Lucas Vantor obrigado pela dica mais não Funcionou.

    quinta-feira, 17 de março de 2011 22:25
  • Lucas Vantor obrigado pela dica mais não Funcionou.

     try
                    {
                        
                        SqlCeDataReader dr = cmd.ExecuteReader();
                        dr.Read();                                 
                           
                        if (dr["codigo"] != DBNull.Value)
                        {
                            idPedido = Convert.ToInt32(dr["codigo"]);
                        }
                        else
                        {
                            idPedido = 1;
                        }
                    }
                    catch (Exception ex)
                    {
    
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                    return  idPedido;
    
    Tenta assim e veja se funciona
    
    sexta-feira, 18 de março de 2011 00:37
  • Esta dando erro nesta linha

     

    SqlCeDataReader dr = cmd.ExecuteReader();
     dr.Read();          

    sexta-feira, 18 de março de 2011 13:46
  • Purga tente isso:

    int seuID = 0;

    string Conectar = "sua Conexo";

     

    SqlConnection conexao = new SqlConnection(Conectar);

    conexao.Open();

     

    string Comando = "SELECT MAX (idPedido) FROM Pedido";

     

    SqlCommand cmd = new SqlCommand(Comando, conexao);

     

    SqlDataReader dr = cmd.ExecuteReader();

     

    if (dr.Read())

    {

    seuID =

    int.Parse(dr[0].ToString());

    }

    Não sei se era isso que você estava precisando mas com esse código ele captura o valor do ID (claro se ele conseguir ler) ^^. Espero que ajude...

     

    EDIT: Se está dando erro nessa linha então não seria problema no código SQL??

    • Editado Rás sexta-feira, 18 de março de 2011 14:25 Observação...
    sexta-feira, 18 de março de 2011 14:23
  • Usa o codigo que passei no teu codigo e retira esta linha select max(idPedido + 1 retira isto) AS codigo from Pedidos"; 

     ireader+=reader;
    



    Just Be Humble Malange!
    sexta-feira, 18 de março de 2011 17:41
    Moderador
  •  Esse codigo que eu fiz debugging linha por linha certinho  mais não esta me retornando o id, alguem pode dar uma olhada. 

     

    String conectar = @"Data Source=\Program Files\ATVENDAS\BancoDados.sdf;Password=root;";

                  using (SqlCeConnection conn = new SqlCeConnection(conectar))

                  conexao = new SqlCeConnection(conectar);

                  conexao.Open();

                  PedidoModel pedido = new PedidoModel();

                  object id;

                  id = 0;              

                  string objSql = "select max(idPedido) from Pedidos";              

                  SqlCeCommand cmd = new SqlCeCommand(objSql, conexao);

                  SqlCeDataReader dr = cmd.ExecuteReader();

                  if (dr.Read())

                      try

                      {

                          id = Int32.Parse(dr[0].ToString() + 1);

                      }

                      catch (Exception ex)

                      {

                          MessageBox.Show("erro" + ex);

                      }                 

                      finally

                      {

                         conexao.Close();

                      }

     

                  conexao = new SqlCeConnection(conectar);

                  SqlCeConnection conn2 = new SqlCeConnection();

                  try

                  {

                    if (MessageBox.Show("Deseja efetuar um novo Pedido?", "Novo",

                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)

                    {

                        SqlCeCommand comando = new SqlCeCommand();

                        try

                        {                        

                            string objSql2 = "insert into Pedidos (idPedido) values ('')";

                            SqlCeCommand cmd2 = new SqlCeCommand(objSql2, conn2);                      

                        }

                        catch (Exception ex)

                        {

                            MessageBox.Show("erro ao adicionar\n" + ex);

                        }

                        pedido.Codigo = Convert.ToInt32(id);                    

                     }              

                }

                catch (Exception ex)

                {

                    MessageBox.Show("erro" + ex);

                }

                finally

                {

                    conn2.Close();

                }                      

            }           

    sexta-feira, 18 de março de 2011 22:36
  •   Aqui faz assim:

    id = Int32.Parse(dr["idPedido].ToString() + 1);

    ou

    id = Convert.ToInt32(dr["idPedido].ToString() + 1);

     

    Se nao funcionar faz com dataset. 


    Just Be Humble Malange!
    sexta-feira, 18 de março de 2011 22:46
    Moderador
  • @Olha Purga

    Eu fiz um teste, tu tens razao, nao traz nenhum valor. entao fiz desta forma, e ja funciona:

     private void pegar_Valor_Maximo()

            {

                SqlConnection conn = new SqlConnection(WindowsFormsApplication2010.Properties.Settings.Default.Connection);

                SqlCommand comando = new SqlCommand("Select Max(IDD) from Table_Copy", conn);

                conn.Open();

     

                SqlDataReader ler = comando.ExecuteReader();

     

                DataTable dt = new DataTable();

                dt.Load(ler);

     

                string pegar_Valor = Convert.ToString(dt.Rows[0][0].ToString());

     

                pegar_Valor += 1;

     

                MessageBox.Show(pegar_Valor.ToString());

                conn.Close();

            }

     

            private void button2_Click(object sender, EventArgs e)

            {

                pegar_Valor_Maximo();

            }


    Just Be Humble Malange!
    sexta-feira, 18 de março de 2011 23:19
    Moderador
  • Fiz um novo Teste e usei o While e funciona perfeitamente:

    private void pegar_Valor_Maximo()

            {

                SqlConnection conn = new SqlConnection(WindowsFormsApplication2010.Properties.Settings.Default.Connection);

                SqlCommand comando = new SqlCommand("Select Max(IDD) from Table_Copy", conn);

                conn.Open();

                SqlDataReader ler = comando.ExecuteReader();

                string pegar_Valor= string.Empty;

                while (ler.Read())

                {

                    pegar_Valor = Convert.ToString(ler.GetValue(0).ToString());

                }

                pegar_Valor += 1;

                MessageBox.Show(pegar_Valor.ToString());

               conn.Close();

            }

     

            private void button2_Click(object sender, EventArgs e)

            {

                pegar_Valor_Maximo();

            }

    Eu deveria ter testado antes. Desculpa.


    Just Be Humble Malange!
    sexta-feira, 18 de março de 2011 23:29
    Moderador
  •  

    Alguem poderia me explicar por que nesse codigo da erro NullRferenceException???

     

     

    private void pegar_Valor_Maximo()

            {

                SqlConnection conn = new SqlConnection(WindowsFormsApplication2010.Properties.Settings.Default.Connection);

                SqlCommand comando = new SqlCommand("Select Max(IDD) from Table_Copy", conn);

                conn.Open();

                SqlDataReader ler = comando.ExecuteReader();

                string pegar_Valor= string.Empty;

                while (ler.Read())

                {

                    pegar_Valor = Convert.ToString(ler.GetValue(0).ToString());

                }

                pegar_Valor += 1;

                MessageBox.Show(pegar_Valor.ToString());

               conn.Close();

            }

    sexta-feira, 25 de março de 2011 04:57
  • Só uma dica, já que trará apenas um valor e uma coluna utiliza o ExecuteScarlar, creio ter mais performance em situações com esta.

    Abs

    SqlConnection conn = new SqlConnection(WindowsFormsApplication2010.Properties.Settings.Default.Connection);
    
    			SqlCommand comando = new SqlCommand("Select Max(IDD) from Table_Copy", conn);
    
    			string valor = null;
    			try 
    			{	
    				conn.Open();
    				var retorno = comando.ExecuteScalar();
    				valor = retorno == null ? null : retorno.ToString();
    			}
    			catch (Exception e)
    			{
    				throw(e);
    			}
    			finally
    			{
    				conn.Close();
    				comando.Dispose();
    			}
    


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 25 de março de 2011 10:54
  • E porque esta vazio o que estas a tentar pegar, entoa faz tratamento se estiver null entao faz alguma coisa.

     


    Just Be Humble Malange!
    sexta-feira, 25 de março de 2011 13:07
    Moderador
  • Peguei o modelo acima e deu certo muito obrigado, só que a hora de inserir ele da esse erro

    #### Um valor duplicado não pode ser inserido em um único índice.[Nome da tabela = Pedidos, Nome da restrição PK_Pedidos =] ####

     

    o codigo é esse

     

     

      PedidoModel pedido = new PedidoModel();

                SqlCeConnection conn = new SqlCeConnection(@"Data Source=\Program Files\ATVENDAS\BancoDados.sdf;Password=root;");

                string objSql2 = "insert into Pedidos (idPedidos) values (@idPedidos)";

                conn.Open();

                SqlCeCommand cmd = new SqlCeCommand(objSql2,conn);

                cmd.Parameters.Add("@idPedidos", pedido.Codigo);

                cmd.ExecuteNonQuery();

     

                cmd.Parameters.Clear();

                SqlCeCommand comando = new SqlCeCommand("Select Max(idPedidos) from Pedidos", conn);

     

                SqlCeDataReader ler = comando.ExecuteReader();

                string retornaId = string.Empty;

                while (ler.Read())

                {

                    retornaId = Convert.ToString(ler.GetValue(0).ToString());

                    TextidPedido.Text = Convert.ToString(retornaId);

                }

                retornaId += 1;

                MessageBox.Show(retornaId.ToString());

                conn.Close();

     

    segunda-feira, 28 de março de 2011 04:32
  • O que esta ocorrendo é que vc esta tentando inserir um registro com o id do pedido já existente. Quando tenta inserir, vc deveria verificar se existe o registro antes.
    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    segunda-feira, 28 de março de 2011 11:39
  • O que esta ocorrendo é que vc esta tentando inserir um registro com o id do pedido já existente. Quando tenta inserir, vc deveria verificar se existe o registro antes.
    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa

    Complementando, não sei como esta sua estrutura, mas não seria mais interessante vc já validar essa entrada de registro dentro do seu bd? tipo define o pedido como chave primária, habilitando a identidade em seed 1, step 1, assim toda vez que for inserido ele gera esse registro de forma automática.

    Abs,


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    segunda-feira, 28 de março de 2011 12:55
  • E ai beleza Ricardo segui sua dica mais e agora como fica o comando sql do insert ?

     

    eu nunca fiz esse tipo de insert.

    segunda-feira, 28 de março de 2011 20:40
  • Fala Purga,

    Então, vamos lá, agora que vc determinou que a chave primária como identity na sua coluna do ID do pedido, então podes inserir sem a necessidade de levar o ID do pedido, neste caso, acredito que vc precisa levar outros atributos de sua tabela de PEDIDOS não?

    Vc precisa que logo após a inserção seja retornado o valor do ID do pedido?

    Abs,


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    segunda-feira, 28 de março de 2011 21:04
  • Fala Purga,

    Então, vamos lá, agora que vc determinou que a chave primária como identity na sua coluna do ID do pedido, então podes inserir sem a necessidade de levar o ID do pedido, neste caso, acredito que vc precisa levar outros atributos de sua tabela de PEDIDOS não?

    Vc precisa que logo após a inserção seja retornado o valor do ID do pedido?

    Abs,


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    Como esta a estrutura da sua tabela pedidos? vc só precisa gravar o ID lá?
    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    segunda-feira, 28 de março de 2011 21:26
  • Então Ricardo
    Isso que estou tentando fazer é um pedido onde tenho que  gravar o id do pedido , Nome do cliente e os produtos desse pedido.
    Tem alguma ideia?
    terça-feira, 29 de março de 2011 02:11
  • Fala Purge, então o mesmo procedimento que usastes para inserir o código do pedido, será para vc inserir o restante dos atributos que precisa, tipo:

     PedidoModel pedido = new PedidoModel();

                SqlCeConnection conn = new SqlCeConnection(@"Data Source=\Program Files\ATVENDAS\BancoDados.sdf;Password=root;");

                string objSql2 = "insert into Pedidos (idCliente, idProdutou) values (@idCliente, @idProdutos)";

                conn.Open();

                SqlCeCommand cmd = new SqlCeCommand(objSql2,conn);

                 cmd.Parameters.Add("@idCliente", pedido.ClienteID);

    cmd.Parameters.Add("@idProdutos", pedido.ProdutoID);

                cmd.ExecuteNonQuery();

    Creio que seja isso que vc esteja precisando.

    A forma de gravação é esta aí, supondo que contenha essas propriedades na sua classe PedidoModel


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    quarta-feira, 30 de março de 2011 13:11
  •  

    Ricardo obrigado pela dica foi muito util, outra pergunta como posso fazer uma gridmodel igual a J

    TABLE do java, onde eu possa adicionar os produtos nessa grid antes de salvar no bando.

     

    Desde ja muito obrigado. 

    sexta-feira, 1 de abril de 2011 03:03
  • Vc teria que inputar os dados num datatable na memória. http://www.dotnetperls.com/datatable

     

    Abs


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    • Sugerido como Resposta Ricardo D. Beck sexta-feira, 1 de abril de 2011 19:54
    sexta-feira, 1 de abril de 2011 12:04
  • Obrigado pela dica  mais, mais ele não salva string só em double dentro da tabela?  

     

    Desde ja muito obrigado. 


    segunda-feira, 4 de abril de 2011 04:36