Dans ma base de données, j'ai la valeur NextStatDistanceTime comme flottant. Lorsque la ligne "float time = reader.GetFloat(0);
" est exécutée, cela donne une erreur de
exception de conversion non valide du système
Comment puis-je obtenir la valeur flottante de la commande sql dans ce code?
Voici mon code:
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);
}
}
}
Il est temps pour une petite table, je pense.
T-SQL type name | .NET equivalent | C# type name | DataReader method
----------------+-----------------+--------------+------------------------
FLOAT | System.Double | double | IDataReader.GetDouble()
REAL | System.Single | float | IDataReader.GetFloat()
Notez que GetFloat
a le mauvais nom - il doit être GetSingle
, car float
est un nom spécifique à C #. Cela n'a aucun sens dans VB.NET, par exemple.
Donc, si votre colonne de base de données est de type FLOAT
, lisez-la en utilisant GetDouble
, pas GetFloat
. Les méthodes du lecteur de données n'effectuent pas des conversions; il existe une méthode générique GetValue
pour obtenir la valeur sous forme de object
que vous pouvez ensuite convertir davantage.
Soit dit en passant, ce n'est pas la seule subtilité - les types à virgule flottante .NET prennent en charge valeurs dénormalisées , contrairement aux types T-SQL, il est donc possible d'avoir des nombres à virgule flottante dans votre. Code NET qui ne peut pas être stocké avec succès dans la base de données, même si les types correspondent.
Comme vous pouvez le lire ici un flotteur sql-server est mappé sur un double .NET, vous devez donc utiliser 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
}
Je suppose que la base de données renvoie une valeur double, essayez de l'obtenir en tant que Double
et convertissez-la float
(si nécessaire).
float time= (float) reader.GetDouble(0);
Essaye ça
convert.ToSingle(reader["NextStatDistanceTime"])
ou faire
double value = (double)reader["NextStatDistanceTime"]
Float de sql équivaut au double de c #, vous pouvez voir le mappage similaire ici
Il y a probablement un décalage de précision entre le type de base de données et le type c #. Essayez de lancer comme (float)reader.GetDouble(0);
tu peux essayer:
float time = float.Parse(reader[0].ToString());
notez également (bien que cela ne soit pas lié à votre Q) que vous n'avez pas besoin d'exécuter
command.ExecuteNonQuery();
while (reader.Read())
{
object initialTime = reader["NextStatDistanceTime"];
float time;
float.TryParse(initialTime.ToString(), out time);
totaltime = totaltime + time;
conn.Close();
}
Essayez ceci, cela obtiendra l'heure de la base de données puis convertissez-la en un flottant, vous pouvez simplement mettre le reader["NextStatDistanceTime]
dans le tryparse si vous voulez mais pour le rendre plus clair, je l'ai fait comme ça.
Tous les problèmes me le font savoir