Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fala galera!
Preciso gerar um valor inteiro (em c#) para ser usado em chaves primárias de tabelas de banco de dados, com base na data e hora do sistema. Alguém tem idéia de como fazer?
>
Faça:
int pk = DateTime.Now.GetHashCode();
este GetHashCode gera números negativos, queria apenas números positivos, sabe como fazer?
Se for negativo, multiplica por -1, hehe.
Mas assim, precisa ser um número inteiro?
Eu geralmente uso Guid quando preciso ter um único valor.
Fica assim:
Guid pk = Guid.NewGuid();Esse valor é único globalmente, é impossível alguem conseguir um valor igual a este que você acabou de gerar. (Pelo menos na teoria).Será que não te serve? No SQLServer esse campo se chama uniqueidentifier.
até daria, mas ai teria que ser uma chave string e nao tenho certeza se perderei performance no bd mysql (acho que não, mas terei que testar)
Alguns sistemas utilizam o tipo TimeStamp. Não serveria?
Alguns sistemas utilizam o tipo TimeStamp. Não serveria?
poderia, mas queria usar um int pra ser mais facil de depurar e tal
pensei no seguinte
tenho q usar hora, minuto, segundo, milisegundo, dia, mes, ano
por exemplo, o maximo concatenando tudo seria (considerando o ano como 5000 hein)
23595999931125000 (bigint)
h.m.s.ms.d.m.a
outra maneira poderia ser
236060 + 59*60 + 59 || 5000 + 31 + 12 || 999
teria algo assim
863995043999
1º = 23595999931125000
2º = 863995043999 (bem melhor, mas ainda um bigint)
bem, estou errado ou a segunda opção é garantida?
pessoal, qual a melhor alternativa para uma chave primária?
nao posso usar auto incremento, pois preciso usar a chave em outros lugares na hora da gravação.
ja vi que int nao vai dar certo.
Com.CommandText = "select TOP 1 CHAVE from tabela order by CHAVE desc";
int x = Com.ExecuteScalar();
x++;
Tenta assim.
Flw
--
edit:
esquece, não usa data/hora
Por que você precisa de um campo int, como chave e baseda na data/hora ?
Não pode colocar um campo inteiro como chave e como CandidateKey coloca esse campo data/hora ?
Acho que até da para colocar como unique.
Que banco usa ?
Flw
Perae, você diz que não pode usar auto incremento porque precisa do valor?
Seus problemas acabaram :D
Usa SELECT @@IDENTITY, assim você consegue pegar o último valor que foi inserido pelo campo auto incremento.
scorpio e Oenning, do jeito que vcs falaram
Com.CommandText = "select TOP 1 CHAVE from tabela order by CHAVE desc";
int x = Com.ExecuteScalar();
x++;
SELECT @@IDENTITY
nao posso fazer, e se eu tiver fazendo dois cadastros ao mesmo tempo? pode acontecer de pegar o mesmo valor>
scorpio e Oenning, do jeito que vcs falaram
Com.CommandText = "select TOP 1 CHAVE from tabela order by CHAVE desc";
int x = Com.ExecuteScalar();
x++;
SELECT @@IDENTITY
nao posso fazer, e se eu tiver fazendo dois cadastros ao mesmo tempo? pode acontecer de pegar o mesmo valor
As chances disso acontecer são extremamente pequenas.
Se pegar o mesmo valor vai lançar uma exception.
Vamos lá.. não temos muita informação aqui mas tudo bem.
Você tem uma tabela AQUI(tabela1), e outro MONTE DE TABELAS AQUI(tabelaN).
Você grava o valor na tabela1 e depois vai gravando nas outras tabelas ?
É isso ?
Não entendi ainda.
Se o problema é gerar chaves iguais, faça assim.
Crie uma tabela auxiliar, com dois campos
ID | NUMERO
O ID é a chave da tabela, assim que resgatar o valor com o @@IDENTITY você grava nessa tabela junto com o ID. Antes de gravar verifica se não existe um NUMEOR já.
Quando for gravar nas outras você busca por esse ID que gerou e pega o registro.
entre usar um bigint e criar outra tabela pra controle de chaves, prefiro usar um bigint.
Valeu pelas respostas!
O @@IDENTITY é só para sua sessão, veja um exemplo:
Usuário 1 abre conexão no banco e insere um cliente. (O banco gerou o código 3)
Se o usuário 1 usar @@IDENTITY o banco vai retornar código 3.
Usuario 2 abre conexão no banco e insere um cliente. (O banco gerou o código 4)
Se o usuário 2 usar @@IDENTITY o banco vai retornar código 4.
Se o usuário 1 usar @@IDENTITY o banco vai continuar retornando o código 3.
Faça:
int pk = DateTime.Now.GetHashCode();