Получение байтов rowversion (метки времени) для корректного отображения значения из БД?

Вопрос или проблема

Получение байтов rowversion (метки времени) для корректного отображения значения из БД?

Я ищу решение для извлечения Hex, который я храню в столбце VersionNum своей базы данных, который имеет тип (timestamp, not null). Я использую базу данных MSSQL:

VersionNum(timestamp, not null)
0x0000000000007DA1

Мой класс Model:

     public class Message : BoBase
    {
        public int MessageId { get; set; }

        public string MessageText { get; set; }

        public int OrderBy { get; set; }

        public DateTime BeginDate { get; set; }

        public DateTime EndingDate { get; set; }

        public bool IsModal { get; set; }
        
        public byte[] VersionNum { get; set; }
}

Мой метод DataObject GetMessages:

{
        List<Message> messages = new List<Message>();
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = conn.CreateCommand())
            {
                conn.Open();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "uspMessages_GetList";
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        messages.Add(new Message
                        {
                            MessageId = Convert.ToInt32(dr["MessageId"].ToString()),
                            MessageText = dr["Message"].ToString(),
                            OrderBy = Convert.ToInt32(dr["orderBy"].ToString()),
                            IsModal = Convert.ToBoolean(dr["IsModal"]),
                            BeginDate = Convert.ToDateTime(dr["BeginDate"]),
                            EndingDate = Convert.ToDateTime(dr["EndingDate"]),
                            VersionNum = (byte[])dr["VersionNum"]
                        });
                    }
                }
            }
        }
        return messages;
    }

Когда этот запрос возвращает данные, он возвращает только ‘{byte[8]}’ для столбца VersionNum вместо hex (0x0000000000007DA1), который там хранится.

Я задаюсь вопросом, правильно ли я назначаю его в своем DataReader или есть метод, который я упускаю, чтобы правильно получить значение столбца типа timestamp?

Ответ или решение

Для решения вашей проблемы с отображением значения столбца типа timestamp (или rowversion) в вашем классе модели Message, необходимо сделать несколько шагов. Ваша проблема заключается в том, что при извлечении из базы данных, вы получаете массив байтов (byte[8]), а не строковое значение в формате шестнадцатеричного представления.

Для правильного отображения значения VersionNum, вам потребуется преобразовать массив байтов в строку в шестнадцатеричном формате. Вот как это можно сделать:

  1. Метод преобразования: Добавьте метод, который будет преобразовывать массив байтов в строку в шестнадцатеричном формате.
public static string ByteArrayToHexString(byte[] bytes)
{
    return BitConverter.ToString(bytes).Replace("-", "");
}
  1. Модификация кода в вашем методе: В вашем методе GetMessages, после того как вы присвоили значение для VersionNum, преобразуйте его в шестнадцатеричную строку и сохраните в новом свойстве, например VersionNumHex.

Вот как будет выглядеть обновленный код:

public class Message : BoBase
{
    public int MessageId { get; set; }
    public string MessageText { get; set; }
    public int OrderBy { get; set; }
    public DateTime BeginDate { get; set; }
    public DateTime EndingDate { get; set; }
    public bool IsModal { get; set; }

    public byte[] VersionNum { get; set; }
    public string VersionNumHex => ByteArrayToHexString(VersionNum); // Свойство для отображения в Hex
}

// ... ваш метод

public static string ByteArrayToHexString(byte[] bytes)
{
    return BitConverter.ToString(bytes).Replace("-", "");
}

public List<Message> GetMessages()
{
    List<Message> messages = new List<Message>();
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        using (SqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "uspMessages_GetList";
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    messages.Add(new Message
                    {
                        MessageId = Convert.ToInt32(dr["MessageId"].ToString()),
                        MessageText = dr["Message"].ToString(),
                        OrderBy = Convert.ToInt32(dr["orderBy"].ToString()),
                        IsModal = Convert.ToBoolean(dr["IsModal"]),
                        BeginDate = Convert.ToDateTime(dr["BeginDate"]),
                        EndingDate = Convert.ToDateTime(dr["EndingDate"]),
                        VersionNum = (byte[])dr["VersionNum"]
                    });
                }
            }
        }
    }
    return messages;
}

Теперь, когда вы будете получать список сообщений, значение VersionNumHex будет содержать строку с шестнадцатеричным представлением значения VersionNum, например, 0000000000007DA1, и вы сможете выводить его в нужном формате.

Таким образом, вы сможете корректно отображать значения, хранящиеся в столбце timestamp вашей базы данных.

Оцените материал
Добавить комментарий

Капча загружается...