如何使用SqlDataReader获取浮点值?

时间:2016-05-20 10:22:06

标签: c# sql casting reader

在我的数据库中,我将NextStatDistanceTime值作为float。当" 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);
        }
    }

}

7 个答案:

答案 0 :(得分:22)

我认为这是一张小桌子的时间。

T-SQL type name | .NET equivalent | C# type name | DataReader method
----------------+-----------------+--------------+------------------------
FLOAT           | System.Double   | double       | IDataReader.GetDouble()
REAL            | System.Single   | float        | IDataReader.GetFloat()

请注意,GetFloat名称错误 - 应为GetSingle,因为float是C#特定名称。例如,在VB.NET中没有任何意义。

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

顺便说一句,这不是唯一的细微之处 - .NET浮点类型支持denormalized values,而T-SQL类型则不支持,因此可以在.NET中使用浮点数即使类型匹配,也无法成功存储在数据库中的代码。

答案 1 :(得分:3)

正如您可以阅读here 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
}

答案 2 :(得分:2)

我的猜测是数据库返回双倍值,尝试将其设为Double并将其转换为float(如果需要)。

float time= (float) reader.GetDouble(0);

答案 3 :(得分:0)

你可以尝试:

float time = float.Parse(reader[0].ToString());

还要注意(虽然与您的Q无关)您不需要运行

command.ExecuteNonQuery();

答案 4 :(得分:0)

 while (reader.Read())
 {
     object initialTime = reader["NextStatDistanceTime"];
     float time;
     float.TryParse(initialTime.ToString(), out time);

     totaltime = totaltime + time;
     conn.Close();
 }

试试这个,这将从数据库中获取时间,然后将其转换为浮点数,如果你愿意,你可以将reader["NextStatDistanceTime]放在tryparse中,但为了更清楚,我已经这样做了。< / p>

任何问题让我知道

答案 5 :(得分:0)

试试这个

convert.ToSingle(reader["NextStatDistanceTime"])

或做

double value = (double)reader["NextStatDistanceTime"]

浮点数的sql相当于c#的两倍,你可以看到类似的映射here

答案 6 :(得分:0)

数据库类型和c#类型之间可能存在精度不匹配。 尝试像(float)reader.GetDouble(0);

一样投射