Ya no almacenamos enumeraciones como valores ordinales numéricos; hace que la depuración y el soporte sean demasiado difíciles. Almacenamos el valor de enumeración real convertido a cadena:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
y luego vuelva a leer con:
Suit theSuit = Suit.valueOf(reader["Suit"]);
El problema estaba en el pasado mirando a Enterprise Manager y tratando de descifrar:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
versos
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
este último es mucho más fácil. El primero requería obtener el código fuente y encontrar los valores numéricos que se asignaron a los miembros de la enumeración.
Sí, ocupa más espacio, pero los nombres de los miembros de la enumeración son cortos y los discos duros son baratos, y vale mucho más la pena ayudar cuando tiene un problema.
Además, si usa valores numéricos, está atado a ellos. No puede insertar o reorganizar los miembros sin tener que forzar los valores numéricos antiguos. Por ejemplo, cambiando la enumeración Traje a:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
tendría que convertirse en:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
para mantener los valores numéricos heredados almacenados en la base de datos.
Cómo ordenarlos en la base de datos
Surge la pregunta: digamos que quería ordenar los valores. Algunas personas pueden querer ordenarlos por el valor ordinal de la enumeración. Por supuesto, ordenar las tarjetas por el valor numérico de la enumeración no tiene sentido:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Ese no es el orden que queremos, los queremos en orden de enumeración:
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
El mismo trabajo que se requiere si guarda valores enteros es necesario si guarda cadenas:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Pero ese no es el orden que queremos, los queremos en orden de enumeración:
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
Mi opinión es que este tipo de clasificación pertenece a la interfaz de usuario. Si está ordenando elementos según su valor de enumeración: está haciendo algo mal.
Pero si realmente quisiera hacer eso, crearía una Suits
tabla de dimensiones:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
De esta manera, cuando quieras cambiar tus cartas para usar Kissing Kings New Deck Order , puedes cambiarlo con fines de visualización sin tirar todos tus datos:
| 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 |
Ahora estamos separando un detalle de programación interno (nombre de enumeración, valor de enumeración) con una configuración de visualización destinada a los usuarios:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder