2013-10-25 35 views
6

Ich habe versucht, Daten aus einer Datenbank zu Acombobox hinzuzufügen.Kann Objekt vom Typ 'System.Int32' nicht umwandeln, um 'System.String' in DataReader.GetString() einzugeben

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

Ich erhalte die folgende Ausnahme:

Konnte nicht das Objekt des Typs 'System.Int32' werfen auf den Typ 'System.String'

Was soll ich hier fehlt?

+4

Welche Ausnahme erhalten Sie ?? versuche, 'Konvertieren 'zu verwenden.ToString (Wert) 'eher der' value.ToString() ' – Ravi

+0

Objekt des Typs 'System.Int32' kann nicht in den Typ 'System.String' umgewandelt werden. – Kamal

+0

Ich habe dr.GetString (1) .ToString() geändert, aber der Fehler ist immer noch derselbe. – Kamal

Antwort

15

Offensichtlich hat Ihre Spalte nicht den Typ string. Anscheinend ist es int. So verwenden:

dr.getInt32(1).ToString() 

oder sogar

dr.GetValue(1).ToString() 

die mehr roubst Änderungen geben in der Datenbank enthalten sein sollte.

als eine Art allgemeiner Beratung versuche ich zumindest zu folgen:

  • Wählen Sie nur das, was Sie brauchen. Dies hat meist Performance-Gründe und der Grund, dass Sie die Spaltennamen explizit angeben müssen, damit zumindest ein sinnvoller Fehler erhalten, wenn Sie Ihr Schema inkompatibel ändern.
  • Greifen Sie auf die Felder mit ihren Namen zu, z.

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

    Eine solche Sache auch durch eine Erweiterung Methode gut gelöst werden können:

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

Randbemerkung: Einschließlich Stack-Traces (oder zumindest sagen die Linie im Code der Ausnahme kommt von) kann hilfreich für andere sein, die versuchen, Ihnen zu helfen. Wie Sie von den wilden Vermutungen sehen können, was der Täter sein könnte. Meine Vermutung wäre, dass der Stack-Trace sieht etwas wie folgt aus:

SqlDataReader.GetString 
YourCode.YourMethod 

und dass GetString sieht mehr oder weniger wie folgt aus:

public string GetString(int index) 
{ 
    return (string) GetValue(index); 
} 
+0

@AndreasNiedermair Ja, es ist _zero-based_. Deshalb, wenn Sie 'GetString (1)' sagen, sucht es in der zweiten Spalte in seiner Tabelle. –

+0

ja, erste Spalte ist ID und zweite Spalte ist CategoryName, die in Nvarchar – Kamal

+0

Ich habe das gleiche getan, aber nichts geändert. – Kamal

1

Ihre Spalte scheint nicht den Typ int zu haben. Um solche Dinge zu vermeiden, können Sie die Spaltennamen anstelle von Indizes verwenden.

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

das ist nicht gültig Grund!! Mit ordinal können Sie typisierte Dinge tun, wie 'GetString',' GetInt32' ... mit dem String-Indexer können Sie auf den 'object' (untypisierten) Wert zugreifen –

+0

Richtig, aber zumindest wissen Sie genau, welche Spalte Sie sind Adressierung. – Koen

+0

ihr ist "Identifier Missing" Fehler bei "dr. [" – Kamal

0

Ok OK. Seine gelöst ....

Hier ist der 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); 
     } 

Ich habe die sqlcommand auf einen einzelnen Wert und geänderten Spaltennummer für dr.getstring() auf 0 .. es funktionierte. Danke Jungs für die Hilfe .. Ich erwarte mehr, weil ich nur zur Hälfte in meinem Projekt bin ..

Verwandte Themen