如何使用 SqlDataReader 获取浮点值?

新手上路,请多包涵

在我的数据库中,我将 NextStatDistanceTime 值作为浮点数。当“ float time = reader.GetFloat(0); ”行被执行时,它给出了一个错误

系统无效转换异常

如何从这段代码中的 sql 命令获取浮点值?

这是我的代码:

 using (SqlConnection conn = new SqlConnection(@"<myconnectionstring>"))
{
    float totaltime = 0;
    for (int i = startStationIndex; i < endStationIndex; i++)
    {
        SqlCommand command = new SqlCommand("SELECT NextStatDistanceTime FROM [MetroDatabase].[dbo].[MetroStation] WHERE StationIndex = " + i + "", conn);
        try
        {
            conn.Open();
            command.ExecuteNonQuery();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    float time = reader.GetFloat(0);
                    totaltime = totaltime + time;
                    conn.Close();
                }
            }
        }
        catch (Exception ex)
        {
            result = ex.Message;
            Console.WriteLine(ex.Message);
        }
    }

}

原文由 basakes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我想是时候换一张小桌子了。

T-SQL 类型名称.NET 等效C# 类型名称DataReader 方法FLOATSystem.DoubledoubleIDataReader.GetDouble()REALSystem.SinglefloatIDataReader.GetFloat()

请注意 GetFloat 有错误的名称 - 它应该是 GetSingle ,因为 float 是 C# 特定的名称。例如,它在 VB.NET 中毫无意义。

因此,如果您的数据库列的类型为 FLOAT ,请使用 GetDouble 读取它,而不是 GetFloat 。数据读取器方法 执行转换;有一个通用的 GetValue 方法可以将值作为 object 然后您可以进一步转换。

顺便说一句,这不是唯一的微妙之处——.NET 浮点类型支持 非规范化值,而 T-SQL 类型不支持,因此在 .NET 代码中可能有浮点数不能成功存储在数据库中,即使类型匹配。

原文由 Jeroen Mostert 发布,翻译遵循 CC BY-SA 4.0 许可协议

正如您可以 在此处 阅读的,sql-server float 映射到 .NET double,因此您需要使用 GetDouble

 double totaltime = 0;  // necessary, double is wider than float
// ...

while (reader.Read())
{
    double time = reader.GetDouble(0);
    totaltime = totaltime + time;
    // conn.Close(); no, not in this loop, should be closed in the finally or via using-statement
}

原文由 Tim Schmelter 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进