Usuário com melhor resposta
Fazer um contador de registros numa Tabela SQL Server no Cadastro de Clientes

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.
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
- Editado Leandro dos Santos Ferreira terça-feira, 5 de junho de 2018 01:50
- Sugerido como Resposta Felipe Duarte (FD) quarta-feira, 6 de junho de 2018 17:09
- Marcado como Resposta F.oliveirarocha segunda-feira, 13 de agosto de 2018 12:02
-
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- Marcado como Resposta Filipe B CastroModerator sexta-feira, 22 de junho de 2018 19:24
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
- Sugerido como Resposta Felipe Duarte (FD) quarta-feira, 6 de junho de 2018 17:09
-
-
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.
-
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
- Editado Leandro dos Santos Ferreira terça-feira, 5 de junho de 2018 01:50
- Sugerido como Resposta Felipe Duarte (FD) quarta-feira, 6 de junho de 2018 17:09
- Marcado como Resposta F.oliveirarocha segunda-feira, 13 de agosto de 2018 12:02
-
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.
-
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
-
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.
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_IDSqlConnection
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 6 Invalid token '(' in class, struct, or interface member declaration D:\Flávio_Pessoal\UltimoID\Ultimo_ID\Ultimo_ID\Clientes.cs 25 Ultimo_ID
-
-
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.
-
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.
-
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
- Editado Leandro dos Santos Ferreira sexta-feira, 8 de junho de 2018 18:11
-
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.
-
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.
-
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 -
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
-
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- Marcado como Resposta Filipe B CastroModerator sexta-feira, 22 de junho de 2018 19:24
-
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.