Как мне преобразовать поле Int в SQL Server в BitVector32 в моей программе на C#?
Тотальный новичок прыгает в глубокий конец. Это мой первый пост здесь.
Я программист для мэйнфреймов, пытаюсь присоединиться к 1990-м годам и научиться некоторому объектно-ориентированному программированию (что в настоящее время мне нравится). Пожалуйста, прости мое простое объяснение ниже.
Я занимаюсь разработкой приложения, которое должно вести календарь доступности для людей на БД Sql Server. Поскольку у меня могло быть десятки тысяч (или более) рядов, я надеялся быть максимально эффективным и не тратить пространство.
Будучи полностью зеленым для C#, я наткнулся на BitVector 32 и понял, что если я просто проигнорирую 0 бит, у меня будет булево значение (True/False для описания доступности каждого человека) для каждого дня месяца (32 бита для 31 дней в месяце, с некоторыми оставшимися на февраль и т. д.).
BitVector32 availability = new BitVector32();
Это обрабатывает один месяц, но затем я мог бы создать массив из 12 значений bitvector32, и весь год был бы покрыт 48 байтами (bitvector32 использует 4 байта X 12 месяцев).
У меня нет проблем с созданием и заполнением структуры bitvector32 путем выделения отдельных битов. Затем я передаю доступность.data методу, чтобы записать его в таблицу сервера Sql, определенную как значение Int:
UpdateDB(key1, key2, availability.Data);
static void UpdateDB(int key1, int key2, Int32 avail)
{
using (SqlConnection connection = new SqlConnection etc etc etc)
{
connection.Open();
string selectString = @"Update VDB SET AVAILABILITYMONTH = @avail WHERE KEY1 = @key1 AND KEY2 = @key2";
SqlCommand cmd = new SqlCommand(selectString, connection);
cmd.Parameters.AddWithValue("@key1", key1);
cmd.Parameters.AddWithValue("@key2", key2);
cmd.Parameters.AddWithValue("@avail", avail);
cmd.ExecuteNonQuery();
connection.Close();
}
}
Моя проблема в моей следующей программе, где мне нужно прочитать это целочисленное значение и преобразовать или привести (?) Его обратно в формат Bitvector32.
Я пробовал это:
BitVector32 availability = new BitVector32();
availability = myReader.GetInt32(0);
но я получаю сообщение об ошибке "Не удается неявно преобразовать тип 'int' в 'System.Collections.Specialized.Bitvector32"
Я на грани приближения к этому процессу и подозреваю, что это простое ключевое слово или актерский состав, но я не смог его найти. Есть идеи?
Кроме того, это правильный подход? Я не хотел делать логический массив в течение всего года, который занимал бы лишнее пространство.
Любой вклад будет оценен.
2 ответа
Вы можете использовать BitVector32
конструктор, который принимает int
аргумент:
BitVector32 availability = new BitVector32(myReader.GetInt32(0));
Я думаю, что вы ищете это;
BitVector32 availability = new BitVector32(myReader.GetInt32(0));
BitVector32
имеет конструктор, который принимает Int32
Однако вы не можете просто назначить Int32
к BitVector32
потому что они не одного типа и C# не делают неявных преобразований, как это.