none
Fazer um contador de registros numa Tabela SQL Server no Cadastro de Clientes RRS feed

  • Pergunta

  • Bom dia pessoal,

    Estou iniciando agora no C# e tenho dúvidas como criar um contador para a chave primária de uma tabela de clientes, sendo que o nome da chave primaria é Cod_Cliente e a Tabela Clientes. Ainda não possui registros. Não fiz a identação das tabelas para que os números não fiquem errados após a fase de testes. Prefiro o contador, coloco no Form_Load correto ? Ou no botão salvar?

    Nome do banco de Dados : SGF  - Nome da Tabela: Clientes - Chave Primária Cod_Cliente (int).

    Preciso da função da leitura do ultimo registro no banco de dados na tabela , e o incremento.  Vou colocar esta função em outras tabelas tbm, pois estou usando a mesma metodologia.

    Obrigado pela ajuda.

    Flávio Rocha.

    sábado, 2 de junho de 2018 13:56

Respostas

  • Olá! :)

    Sim, pode usar tanto diretamente no Sql Server (Management) quanto em um objeto SqlCommand do C#.

    Você já tem o código para conexão com o banco de dados?

    Se não, faça um teste neste código:

                SqlConnection conexao = new SqlConnection("Sua ConnectionString");
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;
    
                cmd.CommandText = "SELECT isnull(IDENT_CURRENT('Clientes') + IDENT_INCR('Clientes'),1) as ProximoId";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conexao;
    
                conexao.Open();
    
                // variável com o próxmo id, só atribuir no campo desejado
                var proximoId = cmd.ExecuteScalar();
    
                conexao.Close();

    Se o campo não for do tipo Identity você poderia fazer desta maneira:

                SqlConnection conexao = new SqlConnection("Sua ConnectionString");
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;
    
                cmd.CommandText = "SELECT MAX(Cod_Cliente) FROM Cliente";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conexao;
    
                conexao.Open();
    
                var retorno = cmd.ExecuteScalar();
    
                int proximoid = (int) retorno + 1;
    
                conexao.Close();

    Não testei, deve funcionar, precisaria de um tratamento.

    O problema de utilizar este último exemplo é que pode ocorrer algum erro de concorrência, quando existe  acesso simultâneo ao sistema. 

    []´s


    Leandro Ferreira - LinkedIn



    terça-feira, 5 de junho de 2018 01:39
  • Jóia, lhe mandei um e-mail!

    Estou no computador praticamente o dia todo, posso lhe ajudar sim!

    E podemos postar o que foi alterado aqui para ajudar futuros colegas com a mesma dúvida.

    []´s


    Leandro Ferreira
    Desenvolvedor .Net

    Skype: leandro.vipsolucoes
    GitHub: github.com/leandrovip
    leandro@vipsolucoes.com

    quinta-feira, 14 de junho de 2018 19:33

Todas as Respostas

  • Olá!

    Você tem a opção de criar um campo auto incremental no Sql Server utilizando a propriedade IDENTITY. Para criar uma tabela utilizando esta opção utilize como exemplo:

    CREATE TABLE Clientes
    (
    Cod_Cliente int IDENTITY(10,1),
    Nome VARCHAR(50),
    )

    Ps. Sendo que 10 seria o número inicial.

    Para buscar o último número registrado no banco de dados, pode utilizar esta instrução:

    SELECT IDENT_CURRENT('Clientes')

    Ou esta caso queira retornar o próximo id:

    SELECT isnull(IDENT_CURRENT('Clientes') + IDENT_INCR('Cod_Cliente'),1) as ProximoId

    Espero que lhe ajude!

    []´s


    Leandro Ferreira - LinkedIn

    sábado, 2 de junho de 2018 17:08
  • Leandro, boa noite,

    Obrigado pela atenção. Vou fazer o teste e lhe informo se funcionou. 

    Grande abraço.

    segunda-feira, 4 de junho de 2018 00:19
  • Leandro boa noite,

    A sua resposta é para ser executada no SQL Server, mas não é isso que estou querendo.

    Preciso do Código em C#   para pegar o ultimo registro da tabela (que é a chave primaria Cod_Cliente  - int),

    passar para uma variável  "contador" adicionar +1  e passar  o resultado  para a chave novamente.

    É um numerador (feito em código C#) 

    Banco de dados: SGF

    Chave Primária : Cod_Cliente

    Tabela: Cliente

    Pode me ajudar nisso?

    Abraço e obrigado pela atenção.

    terça-feira, 5 de junho de 2018 01:01
  • Olá! :)

    Sim, pode usar tanto diretamente no Sql Server (Management) quanto em um objeto SqlCommand do C#.

    Você já tem o código para conexão com o banco de dados?

    Se não, faça um teste neste código:

                SqlConnection conexao = new SqlConnection("Sua ConnectionString");
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;
    
                cmd.CommandText = "SELECT isnull(IDENT_CURRENT('Clientes') + IDENT_INCR('Clientes'),1) as ProximoId";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conexao;
    
                conexao.Open();
    
                // variável com o próxmo id, só atribuir no campo desejado
                var proximoId = cmd.ExecuteScalar();
    
                conexao.Close();

    Se o campo não for do tipo Identity você poderia fazer desta maneira:

                SqlConnection conexao = new SqlConnection("Sua ConnectionString");
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;
    
                cmd.CommandText = "SELECT MAX(Cod_Cliente) FROM Cliente";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conexao;
    
                conexao.Open();
    
                var retorno = cmd.ExecuteScalar();
    
                int proximoid = (int) retorno + 1;
    
                conexao.Close();

    Não testei, deve funcionar, precisaria de um tratamento.

    O problema de utilizar este último exemplo é que pode ocorrer algum erro de concorrência, quando existe  acesso simultâneo ao sistema. 

    []´s


    Leandro Ferreira - LinkedIn



    terça-feira, 5 de junho de 2018 01:39
  • Leandro boa noite,

    vou testar e lhe informo. Muito obrigado pela atenção.

    Estou iniciando na programação em C#, o SQL já fiz um curso há 10 anos, então já viu, vou fazer uma revisão.

    A 2ª opção me parece mais fácil. O Banco já está conectado. 

    Eu criei um arquivo .DAL e outro .DBML para fazer a conexão. Está ok, sem erro.

    Agora preciso do contador das chaves, pois são mais de 13 tabelas, se não conseguir terei que refazer tudo.

    grande abraço.

    quinta-feira, 7 de junho de 2018 01:23
  • Olá!

    Sim, sem problemas!

    O sistema será acessado por mais de uma pessoa? Lembre-se que se utilizar a segunda opção pode-se ocorrer erro de concorrência, ou seja, se N pessoas cadastrar ao mesmo tempo :)

    Poste aqui se deu certo!

    []´s


    Leandro Ferreira - LinkedIn

    quinta-feira, 7 de junho de 2018 16:45
  • Leandro boa noite,

    Não deu certo, está faltando alguma biblioteca ou .dll  para chamar ? O sistema está dando vários erros de interpretação:

    não está encontrando os comandos ou as declarações:

    Usei a sua conexão (1ª) e deletei os meus Sistema.DAL e Sistema.dbml  

    Como faço agora? 

    abçs.

    SqlConnection

    Error 8 The type or namespace name 'SqlConnection' could not be found (are you missing a using directive or an assembly reference?) d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 9 Ultimo_ID

    Error 13 'Ultimo_ID.Clientes.cmd' is a 'field' but is used like a 'type' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 13 Ultimo_ID

    Error 17 'Ultimo_ID.Clientes.conexao' is a 'field' but is used like a 'type' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 30 Ultimo_ID
    Error 15 'System.Data.CommandType.Text' is a 'field' but is used like a 'type' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 43 Ultimo_ID
    Error 6 Invalid token '(' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 25 Ultimo_ID

    sexta-feira, 8 de junho de 2018 01:21
  • Leandro boa noite,

    Desculpe-me mas desconsidere as mensagens acima. 

    Fiz um build e rebuild, e as mensagens sumiram. 

    ficou somente no sinal de 

    sexta-feira, 8 de junho de 2018 01:40
  • Continuando...

    Ficou no sinal de ´=´ (igual) a seguinte mensagem:

    Error 6 Invalid token '(' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 25 Ultimo_ID
    Error 7 Invalid token '(' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 26 Ultimo_ID
    Error 1 Invalid token '=' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 29 Ultimo_ID

    Seis mensagens mas somentenos sinais de igual  nas linhas do cmd e na última linha (deve ser devido aos erros superiores)

    veja onde está: 

     cmd.CommandText = "SELECT isnull(IDENT_CURRENT('Clientes') + IDENT_INCR('Clientes'),1) as ProximoId";
     cmd.CommandType = CommandType.Text;
     cmd.Connection = conexao;

     conexao.Open(); (no primeiro parenteses)

    conexao.Close();

    Eu não tenho "ConnectionString"  deve ser isso? 

    Abraços.

    sexta-feira, 8 de junho de 2018 01:54
  • Leandro, boa noite,

    Fiz a Connection String e continuou dando erro. 

    Segue abaixo o código e as mensagens:

     public partial class Clientes : Form
        {
           
            SqlConnection conexao = new SqlConnection("Data Source=DESKTOP-3O98051;Initial Catalog=UltimoID;Integrated Security=True");
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;

                cmd.CommandText = "SELECT isnull(IDENT_CURRENT('Clientes') + IDENT_INCR('Clientes'),1) as ProximoId";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conexao;

                conexao.Open();

                // variável com o próxmo id, só atribuir no campo desejado
                var proximoId = cmd.ExecuteScalar();

                conexao.Close();

    Erros: 5 tipos diferentes.

    Error 1 Invalid token '=' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 29 Ultimo_ID
    Error 2 Invalid token '=' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 29 Ultimo_ID
    Error 10 'System.Data.CommandType.Text' is a 'field' but is used like a 'type' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 43 Ultimo_ID
    Error 12 'Ultimo_ID.Clientes.conexao' is a 'field' but is used like a 'type' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 30 Ultimo_ID
    Error 15 A field initializer cannot reference the non-static field, method, or property 'Ultimo_ID.Clientes.cmd' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 29 Ultimo_ID
    Error 8 'Ultimo_ID.Clientes.cmd' is a 'field' but is used like a 'type' d:\flávio_pessoal\ultimoid\ultimo_id\ultimo_id\clientes.cs 13 Ultimo_ID

    Abraços.

    sexta-feira, 8 de junho de 2018 02:09
  • Olá!

    Creio que não deve haver nada de errado com esta parte do código em específico, mas precisamos analisar por um todo.

    Posta todo o código desta classe, pode ser falta de referência ou má formatação.

    []´s


    Leandro Ferreira


    sexta-feira, 8 de junho de 2018 18:10
  • Boa noite Leandro,

    Vou refazer a conexão com as Classes .DAL e .DBML (Linq) e lhe enviarei o código.

    Antes vou verificar se está carregando o primeiro record da tabela. Estando tudo certo, partiremos desta etapa.

    Grande abraço.

    Obrigado pela ajuda.

    terça-feira, 12 de junho de 2018 00:49
  • Leandro, boa tarde,

    Refiz a conexão, está tudo ok. O formulário carrega os dados da tabela, os botões de salvar,  cancelar e novo estão funcionando beleza. tudo testado.

    No botão novo abre um novo registro (record), porém a chave não muda, fica "0" (zero) pois não há o contador, nem identação. 

    Só preciso do código para colocar no botão "novo" para adicionar +1 na chave primária que é Cod_Cliente, Tabela Clientes. Só fiz um cliente (1 registro) para verificar se está tudo ok, e ficou tudo OK. Já tenho o primeiro registro.

    Qual o código que incluo no botão novo ????

     ---------xxxxxx--------xxxxxx----------xxxxxxxxx----------------

    segue abaixo a classe Sistema.DAL que faz a conexão ao banco. "DataContextFactory" 

    No arquivo Sistema.dbml estão as tabelas. no formulário Clientes está o clientesBindingSource.

    Os campos estão ligados, salvando e etc.

    namespace Sistema.DA
    {
          public class DataContextFactory 
        {
            private static SistemaDataContext dataContext;
            public static SistemaDataContext DataContext {
                  get{
                       if(dataContext == null)
                     dataContext = new SistemaDataContext();
                      return dataContext;
     
                }
              }

         }
    }

    grande abraço.

    terça-feira, 12 de junho de 2018 16:45
  • Olá!

    Certo, consegue passar o código que faz as chamadas no banco de dados?

    Você acessa desta maneira? 

    DataContextFactory.DataContext.Clientes.ToList()

    Se sim, você pode utilizar o método SqlQuery para utilizar o comando que passei na outra resposta.

    Caso tenha dificuldades pode me contactar que lhe ajudo remotamente.

    []´s


    Leandro Ferreira
    Desenvolvedor .Net

    Skype: leandro.vipsolucoes
    GitHub: github.com/leandrovip
    leandro@vipsolucoes.com

    terça-feira, 12 de junho de 2018 17:24
  • Leandro,

    Segue o código do Form_Load:

      private void Clientes_Load(object sender, EventArgs e)
            {
                this.clientesBindingSource.DataSource = DataContextFactory.DataContext.Clientes;

    Carrega os dados da tabela no formulário. 

    Vamos combinar um dia, para vc acessar remotamente com Team Viewer  OK?

    Qual seria a sua melhor disponibilidade? 

    Abraços e obrigado pela atenção.

    Email: f.oliveirarocha@hotmail.com

    quinta-feira, 14 de junho de 2018 03:22
  • Jóia, lhe mandei um e-mail!

    Estou no computador praticamente o dia todo, posso lhe ajudar sim!

    E podemos postar o que foi alterado aqui para ajudar futuros colegas com a mesma dúvida.

    []´s


    Leandro Ferreira
    Desenvolvedor .Net

    Skype: leandro.vipsolucoes
    GitHub: github.com/leandrovip
    leandro@vipsolucoes.com

    quinta-feira, 14 de junho de 2018 19:33
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 22 de junho de 2018 19:24
    Moderador