2013-06-27 22 views
1

我们正在处理遗留应用程序,其中来自c#的十进制数字作为varbinary类型存储在数据库(sqlserver)中。这(我认为)是为了保持数字的格式。将varbinary转换为tsql中的数字类型

现在的问题是我们无法搜索/索引数据库中的数字。它必须被恢复到应用程序中的c#十进制数,然后才有意义。

如何将varbinary转换为sqlserver中的十进制/数字类型?

我不介意创建一个新的列/表来存储从varbinary派生的数值和格式信息。

我知道在c#中可以通过给它一个int数组来创建一个十进制数。

下面是对c#如何解释int数组并将其转换为十进制类型的描述。 http://msdn.microsoft.com/en-us/library/aa326746(v=vs.71).aspx

一个十进制数的二进制表示由一个1位的标志,96位整数,用来划分整数和指定哪些部分是一个小数的缩放因子的。缩放因子隐含地是数字10,被提升到从0到28的指数。 位是32位有符号整数的四元素长阵列。 位[0],位1,位[2]包含96位整数的低位,中位和高位32位。 位[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

函数会很好,不知道如何使用Money完成此操作 – Ishpal

回答

相关问题