Tengo un método que se está conectando a una base de datos a través de Odbc. El procedimiento almacenado que estoy
llamando tiene un valor de retorno que partir de la base de datos secundarios es un ‘Char’. Ahora mismo me estoy agarrando
que valor devuelto como una cadena y su uso en una simple declaración de si. En realidad no me gusta la idea
de la comparación de una cadena como esta cuando sólo dos valores se puede volver de la base de datos, el 0 y el 1.

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 adecuada de manejar esta situación. He tratado de » Convertir.ToBoolean ()’, que parecía
como la respuesta obvia, pero me encontré con la ‘Cadena no se reconoció como válido el valor Booleano.’ excepción. Me estoy perdiendo algo
aquí, o hay otra forma de hacer ‘1’ y ‘0’ actuar como verdadero y falso?

Gracias!

InformationsquelleAutor Chris | 2010-04-15

9 Comentarios

  1. 137

    Cómo sobre:

    return (returnValue == "1");

    o como se sugiere a continuación:

    return (returnValue != "0");

    La correcta dependerá de lo que usted está buscando como un resultado correcto.

    • La correcta? De Verificación; Conciso? De Verificación; Elegante? De verificación. +1.
    • Me gustaría recomendar el uso de return (returnValue!="0"). Sería más natural que 0 es false y cada número que no sea cero es true. Por supuesto, aquí tenemos el caso donde Chris utiliza cadenas en lugar de números, así que este comentario es sólo parcialmente válida 😉
    • Siempre es un debate. 0 también significa ERROR_SUCCESS lo que significa que todo ha ido bien. Pero estoy de acuerdo con Gacek que es más natural.
    • Agradable y concisa.
    • No se olvide de comprobar nulos: !de la cadena.IsNullOrEmpty(returnValue) && (returnValue == «1»)
    • ¿por qué no Convertir.ToBoolean(1)? Se hace lo mismo, y usted está utilizando el marco para la verificación. Me gusta la respuesta anterior, pero que uno es mejor ser utilizado?

  2. 96

    En una sola línea de código:

    bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
    • no tan conciso como la aceptación de la respuesta.
    • Me gusta tu versión de Chris porque como la pregunta indicada, permite el uso booleano en lugar de comparar cadenas.
    • Yo también prefiero la versión porque transmite la intención más claramente.
    • Es adecuado sólo para el «1» o «0». Para cualquier otro de la cadena de valor de retorno no es determinista, por ejemplo, «101» es cierto, y así sucesivamente…
  3. 12

    Si desea la conversión a siempre tener éxito, probablemente la mejor manera de convertir la cadena sería considerar la posibilidad de "1" como true y nada más, ya false (como Kevin lo hace). Si quería que el error en la conversión si de otra cosa que de "1" o "0" se devuelve, entonces, la siguiente sería suficiente (se podría poner en un método helper):

    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.");
    }
    • Buena idea coger el reconocido valor. No estoy seguro de que quiere ir por ese camino, pero sigue siendo una buena idea.
  4. 5

    Conjunto de retorno de tipo numérico – usted no necesita un char (así que no lo use); un valor numérico (0/1) puede ser convertido con Convertir.ToBoolean(num)

    Lo contrario: el uso de Kevin respuesta

    • Me gustaría que pudiéramos cambiar el tipo de retorno. Pero estamos estancados con lo que es.
    • Convert.ToBoolean solo acepta Verdadero/Falso/verdadero/falso cadenas
  5. 3

    Puede usar que el formulario:

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

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

    return returnValue.Equals("1");
    • Acaba de perder el «? true : false» bit. Es totalmente innecesario. Dejar en { return returnValue.Equals(«1») }
  6. 1

    O si el valor Booleano no se ha devuelto, usted puede hacer algo como esto:

    bool boolValue = (returnValue == "1");
  7. 0

    Mi solución (vb.net):

    Private Function ConvertToBoolean(p1 As Object) As Boolean
        If p1 Is Nothing Then Return False
        If IsDBNull(p1) Then Return False
        If p1.ToString = "1" Then Return True
        If p1.ToString.ToLower = "true" Then Return True
        Return False
    End Function
  8. -1

    Si usted no desea convertir.Solo uso;

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

    Tal vez usted va a devolver los valores como desee.

Dejar respuesta

Please enter your comment!
Please enter your name here