Вопрос или проблема
Получение байтов 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
, вам потребуется преобразовать массив байтов в строку в шестнадцатеричном формате. Вот как это можно сделать:
- Метод преобразования: Добавьте метод, который будет преобразовывать массив байтов в строку в шестнадцатеричном формате.
public static string ByteArrayToHexString(byte[] bytes)
{
return BitConverter.ToString(bytes).Replace("-", "");
}
- Модификация кода в вашем методе: В вашем методе
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
вашей базы данных.