在我的数据库中,我将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);
}
}
}
答案 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);