2013-06-27 2 views
1

В настоящее время мы имеем дело с унаследованным приложением, в котором десятичные числа из 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); 
    } 
+0

Если создать пользовательскую функцию, которая преобразует этот двоичный файл в деньги будет исправить вашу проблему? –

+0

функция будет большой, не уверен, как это сделать, используя деньги – Ishpal

ответ