Nós não armazenar enumerações como valores ordinais numéricas mais; torna a depuração e o suporte muito difíceis. Armazenamos o valor real da enumeração convertido em string:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
e depois leia novamente com:
Suit theSuit = Suit.valueOf(reader["Suit"]);
O problema estava no passado, encarando o Enterprise Manager e tentando decifrar:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
versos
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
o último é muito mais fácil. O primeiro exigia obter o código-fonte e localizar os valores numéricos atribuídos aos membros da enumeração.
Sim, é preciso mais espaço, mas os nomes dos membros da enumeração são curtos e os discos rígidos são baratos, e vale muito a pena ajudar quando você está tendo um problema.
Além disso, se você usar valores numéricos, estará vinculado a eles. Você não pode inserir ou reorganizar os membros sem precisar forçar os valores numéricos antigos. Por exemplo, alterando a enumeração Suit para:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
teria que se tornar:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
para manter os valores numéricos herdados armazenados no banco de dados.
Como classificá-los no banco de dados
A pergunta surge: digamos que eu queria ordenar os valores. Algumas pessoas podem querer classificá-las pelo valor ordinal da enumeração. Obviamente, ordenar os cartões pelo valor numérico da enumeração não tem sentido:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Essa não é a ordem que queremos - queremos em ordem de enumeração:
SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
WHEN 4 THEN 0 --Unknown first
WHEN 1 THEN 1 --Heart
WHEN 3 THEN 2 --Club
WHEN 2 THEN 3 --Diamond
WHEN 0 THEN 4 --Spade
ELSE 999 END
O mesmo trabalho necessário se você salvar valores inteiros será necessário se você salvar seqüências de caracteres:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Mas essa não é a ordem que queremos - queremos em ordem de enumeração:
SELECT Suit FROM Cards
ORDER BY CASE Suit OF
WHEN 'Unknown' THEN 0
WHEN 'Heart' THEN 1
WHEN 'Club' THEN 2
WHEN 'Diamond' THEN 3
WHEN 'Space' THEN 4
ELSE 999 END
Minha opinião é que esse tipo de classificação pertence à interface do usuário. Se você estiver classificando itens com base no valor de enumeração: está fazendo algo errado.
Mas se você realmente quiser fazer isso, eu criaria uma Suits
tabela de dimensões:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
Dessa forma, quando você desejar alterar suas cartas para usar o Kissing Kings New Deck Order, poderá alterá-las para fins de exibição sem jogar fora todos os seus dados:
| Suit | SuitID | Rank | Color | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown | 4 | 0 | NULL | NULL |
| Spade | 0 | 1 | Black | 1 |
| Diamond | 2 | 2 | Red | 1 |
| Club | 3 | 3 | Black | -1 |
| Heart | 1 | 4 | Red | -1 |
Agora, estamos separando um detalhe de programação interno (nome da enumeração, valor da enumeração) com uma configuração de exibição destinada aos usuários:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder