2010-04-15 26 views
67

Tengo un método que se conecta a una base de datos a través de Odbc. El procedimiento almacenado que tengo llamada tiene un valor de retorno que desde el lado de la base de datos es un 'Char'. En este momento estoy agarrando que devuelven valor como una cadena y usándolo en una simple declaración if. Realmente no me gusta la idea de comparar una cadena como esta, cuando sólo dos valores pueden volver de la base de datos, 0 y 1.Cómo convertir "0" y "1" a falso y verdadero

OdbcCommand fetchCommand = new OdbcCommand(storedProc, conn); 

fetchCommand.CommandType = CommandType.StoredProcedure; 
fetchCommand.Parameters.AddWithValue("@column ", myCustomParameter); 
fetchCommand.Parameters.Add("@myReturnValue", OdbcType.Char, 1) 
      .Direction = ParameterDirection.Output; 
fetchCommand.ExecuteNonQuery(); 

string returnValue = fetchCommand.Parameters["@myReturnValue"].Value.ToString(); 
if (returnValue == "1") 
{ 
    return true; 
} 

¿Cuál sería la forma correcta de manejar esta situación. He intentado con 'Convert.ToBoolean()' que parecía como la respuesta obvia, pero me encontré con 'String no se reconoció como un booleano válido. 'excepción lanzada. ¿Me falta algo aquí, o hay otra forma de hacer que '1' y '0' actúen como verdadero y falso?

Gracias!

Respuesta

121

¿Qué tal:

return (returnValue == "1"); 

o como se sugiere a continuación:

return (returnValue != "0"); 

la correcta dependerá de lo que busca como resultado el éxito.

+7

¿Correcto? Comprobar; ¿Conciso? Comprobar; ¿Elegante? Comprobar. +1. – Earlz

+6

Yo recomendaría usar 'return (returnValue! =" 0 ")'. Sería más natural que '0' sea' falso' y que cada número que no sea cero sea 'verdadero'.Por supuesto, aquí tenemos el caso donde Chris usa cadenas en lugar de números, por lo que este comentario solo es parcialmente válido;) – Gacek

+0

Siempre es un debate. 0 también significa ERROR_SUCCESS lo que significa que todo salió bien. Pero estoy de acuerdo con Gacek en que es más natural. –

5

Establezca el tipo de devolución en numérico; no necesita un carácter (por lo tanto, no lo use); un valor numérico (0/1) se puede convertir con Convert.ToBoolean (num)

lo contrario: utilizar la respuesta de Kevin

+0

Ojalá pudiéramos cambiar el tipo de devolución. Pero estamos atrapados con lo que es. – Chris

+5

'Convert.ToBoolean' solo acepta cadenas True/true/false/false – Yaro

12

Si desea que la conversión pueda realizarse siempre, probablemente la mejor manera de convertir la cadena sería considerar "1" como true y cualquier otra cosa como false (como Kevin lo hace). Si quería la conversión a fallar si se devuelve distinta "1" o "0" nada, entonces sería suficiente la siguiente (se puede poner en un método de ayuda):

if (returnValue == "1") 
{ 
    return true; 
} 
else if (returnValue == "0") 
{ 
    return false; 
} 
else 
{ 
    throw new FormatException("The string is not a recognized as a valid boolean value."); 
} 
+0

Buena idea para capturar el valor no reconocido. No estoy seguro de querer ir por ese camino, pero sigue siendo una buena idea. – Chris

74

En una sola línea de código:

bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue)) 
+1

no es tan conciso como la respuesta aceptada. – BrianK

+2

Me gusta su versión Chris porque como dice la pregunta, usemos boolean en lugar de comparar cadenas. – Svet

1

o si no se ha devuelto el valor booleano, puede hacer algo como esto:

bool boolValue = (returnValue == "1"); 
-1
(returnValue != "1" ? false : true); 
+1

Desafortunadamente, esta solución devuelve una cadena, no un booleano – Drakes

+1

¿Cómo devolvería esto una cadena? editar: no importa. Noté la edición. Lo siento por eso. –

2

Puede utilizar ese formulario:

return returnValue.Equals("1") ? true : false; 

o más simplemente (gracias a Jurijs Kastanovs):

return returnValue.Equals("1"); 
+5

Solo pierde el bit "? True: false". Es totalmente innecesario. Déjelo en {return returnValue.Equals ("1")} –

-1

Si no desea utilizar convert.Just;

bool _status = status == "1" ? true : false; 

Tal vez regrese los valores que desee.

Cuestiones relacionadas