В настоящее время мы имеем дело с унаследованным приложением, в котором десятичные числа из C# хранятся в базе данных (sqlserver) как типы varbinary. Это (я думаю) было сделано, чтобы сохранить форматирование с номером.Преобразование varbinary в числовой тип в tsql
Проблема в том, что мы не можем искать/индексировать номер в базе данных. Он должен быть восстановлен до десятичного числа C# в приложении, и только тогда это имеет смысл.
Как преобразовать varbinary в десятичный/числовой тип в sqlserver?
Я не против создания новой таблицы/таблицы для хранения числового значения и информации форматирования, полученной из varbinary.
Я знаю, что в C# вы можете создать десятичное число, указав ему массив ints.
Вот описание того, как C# интерпретирует и преобразует массив int в десятичный тип. http://msdn.microsoft.com/en-us/library/aa326746(v=vs.71).aspx
Двоичное представление десятичного числа состоит из 1-битного знака, 96-разрядного целого числа, а коэффициент масштабирования используется, чтобы разделить целое число и определить, какую часть этого является десятичной дробью. Масштабирующий коэффициент неявно равен числу 10, увеличенному до экспоненты в диапазоне от 0 до 28. бит - это четырехэлементный длинный массив из 32-разрядных целых чисел. бит [0], биты 1, а биты [2] содержат младшие, средние и высокие 32 бита 96-битного целочисленного числа. бит [3] содержит масштабный коэффициент и знак и состоит из следующих частей: Биты от 0 до 15, нижнее слово, не используются и должны быть равны нулю. Биты с 16 по 23 должны содержать показатель между 0 и 28, который указывает мощность 10 для деления целочисленного числа. Биты 24-30 не используются и должны быть равны нулю. Бит 31 содержит знак; 0 означает положительный, а 1 означает отрицательный. Числовое значение может иметь несколько возможных двоичных представлений; все они одинаково действительны и численно эквивалентны. Обратите внимание, что представление битов различает отрицательный и положительный ноль. Эти значения считаются равными во всех операциях.
Помощь приветствуется.
Вот некоторые Примеры данных
Name DecimalValue NumericValue
-----------------------------------------------------------------------------
Number2_4 0x14E20100000000000000000000000200 1234.12
Number1 0xCF040000000000000000000000000100 123.1
Number5 0xD9299549000000000000000000000500 12345.12345
Number4 0xF24FBC00000000000000000000000400 1234.1234
код C# для преобразования между типами
======================= ================
byte[] GetBytes (decimal? value)
{
if (value == null)
{
return null;
}
byte[] bytes = new byte[16];
int[] bits = Decimal.GetBits ((decimal) value);
Array.Copy (BitConverter.GetBytes (bits[0]), 0, bytes, 0, 4);
Array.Copy (BitConverter.GetBytes (bits[1]), 0, bytes, 4, 4);
Array.Copy (BitConverter.GetBytes (bits[2]), 0, bytes, 8, 4);
Array.Copy (BitConverter.GetBytes (bits[3]), 0, bytes, 12, 4);
return bytes;
}
decimal? ToDecimal (byte[] value)
{
if (value == null)
{
return null;
}
int[] bits = { BitConverter.ToInt32 (value, 0), BitConverter.ToInt32 (value, 4), BitConverter.ToInt32 (value, 8), BitConverter.ToInt32 (value, 12) };
return new decimal (bits);
}
Если создать пользовательскую функцию, которая преобразует этот двоичный файл в деньги будет исправить вашу проблему? –
функция будет большой, не уверен, как это сделать, используя деньги – Ishpal