web-dev-qa-db-fra.com

Comment obtenir une valeur flottante avec SqlDataReader?

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);
        }
    }

}
9
Basak Ebru Serit

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.

23
Jeroen Mostert

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
}
3
Tim Schmelter

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);
2
Hari Prasad

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

0
Ranjit Singh

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);

0
Kodre

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();
0
apomene
 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

0
Brendon