【问题标题】:ExecuteScalar returning a double when the SQL is returning a float当 SQL 返回浮点数时,ExecuteScalar 返回双精度
【发布时间】:2019-04-30 08:27:13
【问题描述】:

即使 SQL 的返回值是浮点数,在分配给浮点数时,我的 C# ExecuteScalar 命令也会从我的调用中抛出无效转换。于是我做了一个简单的测试如下:

            sqlCU = "select cast(1 as float)";
            using (SqlCommand command = new SqlCommand(sqlCU, con))
            {
                object cuP5300x = command.ExecuteScalar();
            }

返回的总是双倍。

所以要修复它,我必须做一些我认为相当愚蠢的事情:

float cuP5300x = (float)((double)command.ExecuteScalar())

因为如前所述

float cuP5300x = (float)command.ExecuteScalar();

导致无效的强制转换异常。

谁能解释为什么,我在 MS 文档中找不到任何东西说浮点数是双精度的,有没有更明智的方法...?

谢谢。

【问题讨论】:

  • 如果你使用real而不是float会发生什么?
  • 或者你可以简单地使用Convert.ToFloat(command.ExecuteScalar()) 并且不用担心返回的值类型。但是你仍然需要考虑 DbNull,尽管
  • 谢谢,Convert 看起来比我的双重演员更好,但顺便说一句,它是 ToSingle 而不是 ToFloat :)

标签: c# sql-server


【解决方案1】:

“谁能解释为什么,我在 MS 文档中找不到任何东西说浮点数是双精度的,有没有更明智的方法...?”

在文档中:SQL Server Data Type Mappings

具体来说,对于 SQL Server 数据库引擎类型Float,.NET Framework 类型是Double。此外,SqlDbType 枚举为Float,SqlDataReader SqlTypes 类型访问器为GetSqlDouble,DbType 枚举为Double,SqlDataReader DbType 类型访问器为GetDouble

SQL Server Database Engine type NET Framework type SqlDbType enumeration SqlDataReader SqlTypes typed accessor DbType enumeration SqlDataReader DbType typed accessor
------------------------------- ------------------ --------------------- ------------------------------------- ------------------ -----------------------------------
float                           Double             Float                 GetSqlDouble                          Double             GetDouble

【讨论】:

  • 啊,谢谢,我从来没有找到那个页面。看着它,我从未想过 SQL Server 中不存在“double”,因此可能是浮点数,而不仅仅是另一个“number(x,x)”
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多