私のデータベースでは、フロートとして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);
}
}
}
小さなテーブルの時間だと思います。
T-SQL type name | .NET equivalent | C# type name | DataReader method
----------------+-----------------+--------------+------------------------
FLOAT | System.Double | double | IDataReader.GetDouble()
REAL | System.Single | float | IDataReader.GetFloat()
GetFloat
はC#固有の名前であるため、GetSingle
の名前は間違っています。float
である必要があります。たとえば、VB.NETでは意味がありません。
したがって、データベース列のタイプがFLOAT
の場合は、GetDouble
ではなくGetFloat
を使用して読み取ってください。データリーダーメソッドは変換を実行しない。値をGetValue
として取得する汎用のobject
メソッドがあり、さらに変換できます。
ちなみに、これは唯一の微妙な問題ではありません。NET浮動小数点型では 非正規化値 がサポートされていますが、T-SQL型ではサポートされていないため、に浮動小数点数を含めることができます。タイプが一致しても、データベースに正常に格納できないNETコード。
あなたが読むことができるように 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
}
私の推測では、データベースはdouble値を返していると思います。Double
として取得し、float
に変換してみてください(必要な場合)。
float time= (float) reader.GetDouble(0);
これを試して
convert.ToSingle(reader["NextStatDistanceTime"])
またはする
double value = (double)reader["NextStatDistanceTime"]
SQLのFloatはc#のdoubleに相当します。同様のマッピングを見ることができます here
おそらく、データベースタイプとc#タイプの精度が一致していません。 (float)reader.GetDouble(0);
のようにキャストしてみてください
あなたが試すことができます:
float time = float.Parse(reader[0].ToString());
また、実行する必要がないことに注意してください(ただし、Qとは関係ありません)。
command.ExecuteNonQuery();
while (reader.Read())
{
object initialTime = reader["NextStatDistanceTime"];
float time;
float.TryParse(initialTime.ToString(), out time);
totaltime = totaltime + time;
conn.Close();
}
これを試してください。これはデータベースから時間を取得し、それを浮動小数点数に変換します。reader["NextStatDistanceTime]
必要に応じてtryparseで使用しますが、より明確にするために、次のようにしています。
問題があれば教えてください