Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Danilo Abranches

Gerar PK int com c#

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

23*60*60 + 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.