SqlDataReader Чтение битового типа данных из SQL Server 2008?

Я использую SQL Server 2008 в программе asp.net/С#. Я пытаюсь использовать SqlDataReader для извлечения данных из базы данных, но я не уверен, что использовать для типа данных «бит».

//these are the assemblies i added manually
using System.Web.Script.Services;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

SqlConnection conn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["ucsConnectionString"].ConnectionString);
SqlDataReader rdr2 = null;
conn2.Open();

SqlCommand cmder = new SqlCommand("usp_Device_GetBy_DeviceID", conn2);
cmder.Parameters.AddWithValue("@ID", id);
cmder.CommandType = CommandType.StoredProcedure;
rdr2 = cmder.ExecuteReader();
rdr2.Read();

*insert datatype & var* = rdr2.GetSqlBit(rdr2.GetOrdinal("Line_Name"));

Я нашел пару сайтов, которые ссылались на вышеупомянутый «GetSqlBit», но, по-видимому, он не является частью используемых мной сборок. Любые предложения, как я могу прочитать этот «битовый» тип данных из SQL?

Я нашел аналогичный тип данных, используя «GetSqlBinary», но я не совсем понимаю, как он работает и подходит ли он для этой ситуации?

Постоянная помощь каждого приветствуется!


person ImGreg    schedule 13.07.2011    source источник


Ответы (5)


Бит, хранящийся в базе данных, может фактически иметь три состояния, а не только два: 0, 1 и NULL. По этой причине вам нужен тип Nullable<bool> или сокращение bool?.

Однако похоже, что вам нужен метод .GetBoolean(). Этот метод требует, чтобы вы проверяли значение null перед вызовом метода. Код может выглядеть так:

bool? Line_Name = rdr2.IsDBNull(rdr2.GetOrdinal("Line_Name"))?null:rdr2.GetBoolean(rdr2.GetOrdinal("Line_Name"));
if (Line_Name != null && Line_Name.Value)
{
    //...
}
person Joel Coehoorn    schedule 13.07.2011
comment
Мне нужно разрешить нули (больше только для тестирования..). Однако я получаю сообщения об ошибках при использовании 'bool?' тип данных. Я использую его в операторе if, и он говорит, что не может преобразовать из 'bool?' 'буль'. Должен ли я делать что-то другое, чтобы использовать этот тип данных? - person ImGreg; 13.07.2011
comment
@ Джоэл Коегоорн, спасибо. Это похоже на то, что мне нужно. Определенно нужно, чтобы isDBNull также. Хорошая вещь. - person ImGreg; 13.07.2011
comment
логическое значение не может быть нулевым. Используйте Nullable‹bool› или Nullable‹Boolean›. В sql бит имеет 3 состояния: {1,0,NULL}. Вы также можете использовать false или true вместо null в зависимости от логики. - person Guillaume Massé; 13.07.2011

bool это то, что вы ищете. В зависимости от того, допускает ли таблица базы данных нулевое значение, это будет bool или bool? для типа, допускающего значение NULL.

(если битовый столбец допускает нули - это можно сделать многими способами)

bitValue = reader["MyBitColumn"] as bool? ?? null;

если нет, то:

bitValue = (bool)reader["MyBitColumn"];
person Bryan Crosby    schedule 13.07.2011

Бит можно извлечь и сохранить в логическом значении. Я использую бит (0 или 1), чтобы указать, активна ли запись. Когда я извлекаю его в свое приложение C#, я сохраняю его в логической переменной. Это ты спрашиваешь?

person Grant Winney    schedule 13.07.2011
comment
Я предполагаю, что вы используете метод GetBoolean() для извлечения значения из БД? - person ImGreg; 13.07.2011

Просто хотел добавить кое-что к ответу Джоэла ... вам нужно привести нулевое значение к логическому? или вы получаете ошибки с этим утверждением:

var myvar = reader.IsDBNull(reader.GetOrdinal("field_name")) 
            ? (bool?)null
            : reader.GetBoolean(reader.GetOrdinal("field_name"));
person Brandon    schedule 13.06.2014

Логического типа данных достаточно для чтения битового типа данных с сервера sql 2008.

person GURU    schedule 15.11.2013