在sql中将varbinary转换为数字类型

时间:2013-06-27 14:29:30

标签: c# tsql decimal numeric varbinary

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

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

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

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

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

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

十进制数的二进制表示由1位符号,96位整数和用于除以整数的比例因子组成,并指定它的哪个部分是小数。缩放因子隐含地为数字10,增加到范围从0到28的指数。 bits是一个四元素长的32位有符号整数数组。 位[0],位1和位[2]包含96位整数的低,中和高32位。 bits [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 );
    }

1 个答案:

答案 0 :(得分:1)

这个问题由Lamprey解决了!在sqlteam论坛上。请访问

查看答案

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=186457