Mam metodę, która łączy się z bazą danych przez Odbc. Wywoływana przeze mnie procedura składowana ma wartość zwracaną, która po stronie bazy danych to „Char”. W tej chwili chwytam tę wartość zwracaną jako ciąg i używam jej w prostej instrukcji if. Naprawdę nie podoba mi się pomysł porównywania takiego ciągu, gdy tylko dwie wartości mogą wrócić z bazy danych, 0 i 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;
}
Jaki byłby właściwy sposób rozwiązania tej sytuacji. Próbowałem `` Convert.ToBoolean () '', co wydawało się oczywistą odpowiedzią, ale natrafiłem na `` Ciąg nie został rozpoznany jako prawidłowy Boolean. 'wyjątek został wyrzucony. Czy coś mi tu brakuje, czy jest inny sposób, aby „1” i „0” zachowywały się jak prawda i fałsz?
Dzięki!
return (returnValue!="0")
. To byłoby bardziej naturalne, że0
jestfalse
, a każdy numer, który nie jest zerotrue
. Oczywiście mamy tutaj przypadek, w którym Chris używa ciągów znaków zamiast liczb, więc ten komentarz jest tylko częściowo ważny;)W jednej linii kodu:
bool bVal = Convert.ToBoolean(Convert.ToInt16(returnValue))
źródło
Jeśli chcesz konwersja zawsze uda, prawdopodobnie najlepszym sposobem przekonwertować ciąg byłoby rozważyć
"1"
jaktrue
i cokolwiek innego jakfalse
(podobnie jak Kevin). Jeśli chcesz, aby konwersja zakończyła się niepowodzeniem, jeśli zostanie zwrócona cokolwiek innego niż"1"
lub"0"
, wystarczyłoby następujące (możesz umieścić to w metodzie pomocniczej):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."); }
źródło
Ustaw typ powrotu na numeryczny - nie potrzebujesz znaku (więc nie używaj go); wartość liczbową (0/1) można przekonwertować za pomocą Convert.ToBoolean (num)
W przeciwnym razie: użyj odpowiedzi Kevina
źródło
Convert.ToBoolean
akceptuje tylko ciągi True / true / False / falseMożesz skorzystać z tego formularza:
return returnValue.Equals("1") ? true : false;
Lub prościej (dzięki Jurijsowi Kastanovsowi):
return returnValue.Equals("1");
źródło
Lub jeśli wartość logiczna nie została zwrócona, możesz zrobić coś takiego:
bool boolValue = (returnValue == "1");
źródło
Moje rozwiązanie (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
źródło
(returnValue != "1" ? false : true);
źródło
Jeśli nie chcesz konwertować, po prostu użyj;
bool _status = status == "1" ? true : false;
Być może zwrócisz wartości, jak chcesz.
źródło