我们目前正在处理遗留应用程序,其中来自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 );
}
答案 0 :(得分:1)
这个问题由Lamprey解决了!在sqlteam论坛上。请访问
查看答案