在 SQL Server 中保存时,是否可以保留 C# 十进制类型的原始尾随零

本文关键字:类型 十进制 原始 保留 Server SQL 保存 是否 | 更新日期: 2023-09-27 18:36:30

我想找到一种简单的方法来在保存在SQL Server中时保留C#十进制类型的尾随零。例:

    5.3
  • 并保存,重新加载后系统应显示5.3。
  • 05.30并保存,系统应显示5.30
  • 5.300
  • 并保存,重新加载后系统应显示 5.300。

C# 十进制类型似乎做得很好,但 SQL 服务器十进制类型却不行。例如,我将 SQL Server 列定义为十进制 (9,3),所有 3 个值都将另存为 5.300。

当然,我可以转换为字符串,但我只是想知道如果在这个领域需要任何计算,是否有任何更优雅的解决方案。

在 SQL Server 中保存时,是否可以保留 C# 十进制类型的原始尾随零

我认为混合DB和UI层不是一个好主意。SQL 存储数据的方式是数据库问题,如何向用户显示类型是 UI 问题。

C# 以以下格式存储十进制,使用基数为 10:

http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx

内部代表:

1m      : 0x00000001 0x00000000 0x00000000 0x00000000
1.0000m : 0x000186a0 0x00000000 0x00000000 0x00050000

AFAIK,MSSQL 中十进制的内部表示形式没有记录。并且,如果使用以下浮点格式 http://en.wikipedia.org/wiki/IEEE_754-1985那就不可能了。

但是,MSSQL 中有一些小数点的参数,例如精度和小数位数。可以尝试使用 ADO.NET 在代码中操作此参数,如下所示:

var cmd = new SqlCommand("command", new SqlConnection("connection"));
cmd.Parameters.Add("@p1", SqlDbType.Decimal,18);
cmd.Parameters["@p1"].Precision = 18;
cmd.Parameters["@p1"].Scale = 8;

然后,这是可能的,但是,无论如何它是一种真正的黑客方法,您不应该在生产中使用它

如果您希望数值的有效数字(或精度,如果这就是您感兴趣的全部内容)逐行变化,则需要有一个单独的列来存储该数字,因为单个数字列不会存储该信息。

如果所有行的有效数字数(或精度)一致,则只需将数据以数据库支持的精度存储在数据库中,然后将其转换回应用程序中应有的值,然后再将其呈现给用户。

可以将

SQL Server 的列类型定义为 sql_variant

当您通过 SqlParameter 将十进制 (C#) 的值设置为该列时,SQL Server 会保留元数据,包括值的小数位数。