OK, entonces tengo un campo de base de datos de tipo char (1) que tiene un número pequeño de posibles códigos de estado (por ejemplo, 'F' = Fallo, 'U' = Desconocido, etc.). Me gustaría tener una clase enum C# que corresponda a estos estados. Puedo hacer:¿Cómo implementar C# enum para el campo enumerado de la base de datos char (1)?
public enum StatusCode : byte {
Unknown = (byte) 'U',
Failure = (byte) 'F',
// etc.
}
Hasta ahora todo bien. Pero en la DataTable devuelta desde la base de datos, los valores de columna son instancias de System.Data.SqlTypes.SqlString. Obviamente, hay algunos problemas de conversión de una cadena C# (o incluso un carácter C#) a un byte C# (ya que C# char es realmente un punto de código UTF-16). Pero en este caso, sé que los valores están limitados a un conjunto pequeño, y el código debería arrojar una excepción si aparece un valor fuera de este conjunto.
Teniendo esto en cuenta, ¿cuál es la mejor manera de hacerlo? ¿Es seguro convertir un SqlString en un byte? ¿Sería mejor Convert.ToByte()? ¿Sería mejor simplemente usar una construcción de interruptor/caja para cruzar los valores en la enumeración?
Estoy buscando la "mejor" forma de hacerlo, no solo en términos de obtener los resultados correctos sino también por la claridad del código. Supongo que también podría usar algunas constantes como
public const char UnknownStatus = 'U';
public const char FailureStatus = 'F';
Pero prefiero usar una enumeración si es posible. ¿Alguna idea?
Editar: Para aclarar lo que quiero hacer con esto, espero utilizar estos valores con frecuencia a lo largo de mi código. Por ejemplo, quiero poder hacer cosas como:
public void DoSomething(StatusCode currentStatus) {
if(currentStatus == StatusCode.Failure) {
throw new SomeException();
}
switch(currentStatus) {
case StatusCode.Unknown:
// do something
break;
}
}
Y así sucesivamente. En particular, quiero evitar cosas como:
public void DoSomething(char currentStatus) {
if(currentStatus == 'F') {
// do something
}
}
Dado que en este caso estoy usando lo que equivale a "números mágicos" por todo el lugar. En particular, esto haría que la migración a algún otro sistema de bandera estatal sea prácticamente imposible. ¿Tiene sentido?
Véase también http://stackoverflow.com/questions/1167927/syncing-referential-integrity-tables-and-enums y http://stackoverflow.com/questions/1015058/enum-storage-in- database-field, y en general, http://stackoverflow.com/search?q=enum%20database&tab=newest –