15 votes

Retourner une seule ligne

Je suis en train d'essayer de retourner une seule ligne d'une base de données :

using (connection = new SqlConnection(ConfigurationManager.AppSettings["connection"]))
{
    using (command = new SqlCommand(@"select top 1 col_1, col_2 from table1", connection))
    {
        connection.Open();

        using (reader = command.ExecuteReader())
        {
            reader.Read();
            return reader["col_1"];
        }
    }
}

Mais je reçois le message d'erreur suivant :

Message d'erreur du compilateur : CS0266: Impossible de convertir implicitement le type 'object' en 'string'. Une conversion explicite existe (avez-vous oublié un cast?)
Ligne 90 : return reader["col_1"];

Je suis sûr de faire une erreur vraiment évidente, mais je ne trouve pas d'exemples de ligne unique, tous les exemples que je trouve sont pour plusieurs lignes retournées en utilisant une boucle while.

26voto

Matt Whitfield Points 3816

reader["col_1"] renvoie object.

Vous voulez quelque chose comme reader.GetString(reader.GetOrdinal("col_1")).

Modifier -> Je voulais juste ajouter une note ici que, en plus des préoccupations soulevées par d'autres, un SELECT TOP sans ORDER BY peut vous donner des résultats aléatoires basés sur des changements de schéma et/ou des analyses en cercle.

13voto

Adam Houldsworth Points 38632

C'est ainsi que je styliserais (et corrigerais) le code :

using (var connection = new SqlConnection(ConfigurationManager.AppSettings["connection"]))
using (var command = new SqlCommand(@"select top 1 col_1, col_2 from table1", connection))
{
    connection.Open();

    using (var reader = command.ExecuteReader())
    {
        if (reader.Read()) // Ne supposez pas que nous avons des lignes.
        {
            int ord = reader.GetOrdinal("col_1");
            return reader.GetString(ord); // Gère les valeurs nulles et les chaînes vides.
        }

        return null;
    }
}

Utiliser l'index reader[] vous donnera des types object, qui doivent être convertis. Cependant, j'évite presque toujours ce style et je préfère l'utilisation légèrement plus verbeuse, mais plus robuste des ordinaux et demandant des types de manière fortement typée.

Si vous avez seulement besoin de la valeur dans la première colonne de la première ligne, vous pouvez utiliser ExecuteScalar à la place, cela renvoie également un objet qui peut être converti et n'a pas besoin d'un lecteur :

using (var connection = new SqlConnection(ConfigurationManager.AppSettings["connection"]))
using (var command = new SqlCommand(@"select top 1 col_1, col_2 from table1", connection))
{
    connection.Open();

    var result = command.ExecuteScalar();
    return result == null ? "" : (string)result;
}

5voto

Jim Points 4285

Le problème est le type de retour. La méthode dans laquelle vous vous trouvez attend de vous que vous retourniez une chaîne de caractères, mais reader["col_1"] est un objet. Je suggère de retourner reader["col_1"].ToString() ou Convert.ToString(reader["col_1"]).

5voto

yan.kun Points 4054

À mon avis, il semble que vous ne voulez pas une seule ligne, seulement une seule valeur :

SqlConnection sqlConnection = new SqlConnection("Votre chaîne de connexion");
SqlCommand cmd = new SqlCommand();
Object returnValue;

cmd.CommandText = "SELECT TOP 1 col_name FROM Customers";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection1;

sqlConnection.Open();

returnValue = cmd.ExecuteScalar();

sqlConnection.Close();

return returnValue.ToString(); //Notez que vous devez le convertir en votre type de données souhaité

4voto

Mahmoud Gamal Points 46598

Au lieu de :

 using (reader = command.ExecuteReader())
 {
      reader.Read();
      return reader["col_1"];
 }

Vous devez convertir reader["col_1"] en chaîne, soit reader["col_1"].ToString() ou reader.GetString(0) comme suit :

return reader.GetString(0);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X