Читать логические значения из БД? - PullRequest
15 голосов
/ 09 мая 2011

В C #, используя SqlDataReader, есть ли способ прочитать логическое значение из БД?

while (reader.Read())
{
    destPath = reader["destination_path"].ToString();
    destFile = reader["destination_file"].ToString();
    createDir = reader["create_directory"].ToString();
    deleteExisting = Convert.ToBoolean(reader["delete_existing"]);
    skipIFolderDate = reader["skipifolderdate"].ToString();
    useTempFile = reader["useTempFile"].ToString();
    password = reader["password"].ToString();
}

В приведенном выше коде delete_existing всегда равен 1 или 0 в БД.Я прочитал в MSDN, что Convert.ToBoolean () не принимает 1 или 0 в качестве допустимого ввода.Он принимает только истину или ложь.Есть ли альтернативный способ преобразования значения БД в bool?Или мне нужно сделать это вне SqlDataReader?

Кроме того, я не могу изменить значения БД, поэтому, пожалуйста, не отвечайте: «Измените значения БД с 1 и 0 на true и false».

Спасибо!

Ответы [ 5 ]

36 голосов
/ 09 мая 2011

Если тип delete_existing является битовым типом sqlserver, вы можете сделать:

var i = reader.GetOrdinal("delete_existing"); // Get the field position
deleteExisting = reader.GetBoolean(i);

или (но произойдет сбой, если delete_existing может быть DBNull)

deleteExisting = (bool)reader["delete_existing"];

или лучше, это нижеприведенное DBNull доказательство и возвращает false , если столбец DBNull

deleteExisting = reader["delete_existing"] as bool? ?? false;

В противном случае, если тип базы данных int:

deleteExisting = (reader["delete_existing"] as int? == 1) ? true : false;

или, если это varchar

deleteExisting = (reader["delete_existing"] as string == "1") ? true : false;
3 голосов
/ 09 мая 2011

Литейные работы: myVar = (bool) dataReader ["myColumn"];

1 голос
/ 14 ноября 2017

Если вы используете CASE в SELECT и хотите использовать GetBoolean, тогда используйте CAST, чтобы изменить столбец на бит перед чтением.

Например:

SELECT CAST((CASE WHEN [Condition] THEN 1 ELSE 0 END) as bit) FROM Table_Name

, тогда вы можете использовать

reader.GetBoolean(0)
1 голос
/ 10 мая 2011

Как насчет этого?

deleteExisting = (reader["delete_existing"] as int?) == 1;

Возможно, Boolean - это самый простой тип для преобразования чего-либо.Вот версия «Y», «N»:

deleteExisting = string.Equals(reader["delete_existing"] as string, "Y", StringComparision.OrdinalIgnoreCase);
0 голосов
/ 09 мая 2011
deleteExisting = reader.GetBoolean(reader["delete_existing"]);
...