web-dev-qa-db-fra.com

Impossible de convertir l'objet de type 'System.Int32' en 'System.String' dans DataReader.GetString ()

J'essayais d'ajouter des données d'une base de données à acombobox.

        try
        {
            SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con);
            SqlCeDataReader dr = com.ExecuteReader();
            while(dr.Read()){
                string name = dr.GetString(1);
                cmbProductCategory.Items.Add(name);
            }
        }
        catch(Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

Je reçois l'exception suivante:

Impossible de convertir l'objet de type 'System.Int32' en 'System.String'

Qu'est-ce que j'oublie ici?

7
Kamal

De toute évidence, votre colonne n'a pas le type string. Apparemment, c'est int. Alors utilisez:

dr.getInt32(1).ToString()

ou même

dr.GetValue(1).ToString()

ce qui devrait être plus approximatif pour taper les changements dans la base de données.

En tant que conseil général, j'essaie au moins de suivre:

  • Sélectionnez uniquement ce dont vous avez besoin. Cela tient principalement aux performances et à la raison pour laquelle vous devez énoncer explicitement les noms de colonne, ce qui entraîne au moins une erreur sensible si vous modifiez votre schéma de manière incompatible.
  • Accédez aux champs en utilisant leurs noms, par exemple.

    dr.GetGuid(dr.GetOrdinal("id"))
    

    Une telle chose peut également être résolue avec une méthode d'extension:

    public T GetFieldValue<T>(this DbDataReader reader, string columnName)
    {
        return reader.GetFieldValue<T>(reader.GetOrdinal(columnName));
    }
    

Note latérale: L'inclusion de traces de pile (ou au moins d'indiquer la ligne de l'exception dans votre code) peut être utile aux autres personnes qui essaient de vous aider. Comme vous pouvez le voir d'après les suppositions sauvages, ce que le coupable pourrait être. J'imagine que la trace de la pile ressemble à ceci:

SqlDataReader.GetString
YourCode.YourMethod

et que GetString ressemble plus ou moins à ceci:

public string GetString(int index)
{
    return (string) GetValue(index);
}
19
Joey

Votre colonne ne semble pas avoir le type int. Pour éviter des choses comme celle-ci, vous pouvez utiliser les noms de colonnes au lieu d'index. 

try
{
    SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con);
    SqlCeDataReader dr = com.ExecuteReader();
    while(dr.Read()){
        string name = dr["yourColumnName"].ToString();
        cmbProductCategory.Items.Add(name);
    }
}
catch(Exception ex)
{
    System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
1
Koen

OK OK. C'est résolu .... 

Voici le code ..

        try
        {
            SqlCeCommand com = new SqlCeCommand("select CategoryName from Category_Master", con);
            SqlCeDataReader dr = com.ExecuteReader();
            while(dr.Read()){
                string name = dr.GetString(0);
                cmbProductCategory.Items.Add(name);
            }
        }
        catch(Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

J'ai changé la commande sql en une valeur unique et changé le numéro de colonne de dr.getstring () en 0 .. cela a fonctionné. Merci les gars pour l'aide .. J'attends plus parce que je ne suis qu'à mi-chemin dans mon projet ..

0
Kamal