2016-06-11 9 views
-5

einzugeben Ich bekomme diesen Fehler weiterhin. Dieser Fehler tritt auf, wenn er in die while-Schleife der Variable invoiceNum übernommen wird. Kannst du mir bitte sagen, was ich falsch mache?Kann Objekt des Typs 'System.Int32' nicht umwandeln, um 'System.String' Fehler

string selectSqlQuery = "SELECT * FROM Invoice"; //WHERE invoice_no=" + 1 + ""; 
       //Create a command in C# to perform the sql Query 
       SqlCommand mySelectCommand = new SqlCommand(selectSqlQuery, myDBconnection); 
       //Creating the process for performing the command 
       SqlDataReader performCommand = mySelectCommand.ExecuteReader(); 
       //Executing the command or running the command 
      // performCommand.Read(); 

       while (performCommand.Read()) 
       { 

        invoiceNum = Convert.ToInt16(performCommand.GetString(0)); 
        pcBarcode = Convert.ToInt16(performCommand.GetString(1)); 
        customerID = Convert.ToInt16(performCommand.GetString(2)); 
        probDescr = performCommand.GetString(3); 
        empID = Convert.ToInt16(performCommand.GetString(4)); 
        currentDate = Convert.ToDateTime(performCommand.GetString(5)); 
        solution = performCommand.GetString(6); ; 
        partsID = Convert.ToInt16(performCommand.GetString(7)); 
        labourPrice = Convert.ToInt16(performCommand.GetString(8)); 
        totalPrice = Convert.ToInt16(performCommand.GetString(9)); 
        // invoiceClass = new Invoice(invoiceNum, pcBarcode, customerID, probDescr, empID, currentDate, solution, partsID, labourPrice, totalPrice); 
       } 
       //Closing the execution of the command 
       performCommand.Close(); 
       //Closing the connection 
       myDBconnection.Close(); 
      } 
+0

Wie lautet die Definition der Rechnungsnummer und die erste Spalte in der Definition der Rechnungstabelle? – piotrwest

+0

beide sind vom Typ int – noor

Antwort

1

Ändern Sie die Zeile mit Rechnungsnummer zu:

invoiceNum = performCommand.GetInt16(0); 
+0

Ich bekomme diesen Fehler: System.InvalidCastException: Angegebene Cast ist nicht gültig. – noor

+0

es funktionierte, als ich es änderte in fakturennummer = performCommand.GetInt32 (0); Sie haben seit 2 stunden damit gekämpft..Danke viel – noor

+0

Wie über invoiceNum = performCommand.GetInt32 (0); ? – piotrwest

0

solche Fehler zu beheben Sie ToString Methode für Ihre ganze Zahl nennen muss:

int i = 0; 
string s = i.ToString(); 

Auch, wenn Ihr Typ implementiert IConvertible Sie folgendes tun:

int i = 0; 
string s = Convert.ToString(i); 
0

Sieht aus wie invoiceNum ist eine 32-Bit-Ganzzahl, so dass Sie es lesen müssen wie eins mit der GetInt32 Methode des Lesers. Der Leser führt keine automatische Übersetzung zwischen den Typen durch. GetString funktioniert nur, wenn das zugrundeliegende Feld als Text eingegeben wird und der Casting-Fehler, der gerade auftritt, genau besagt, dass: die ganze Zahl nicht in eine Zeichenfolge konvertiert werden kann. Siehe die Bemerkungen Abschnitt GetString documentation, der sagt:

No conversions are performed; therefore, the data retrieved must already be a string.

Call IsDBNull to check for null values before calling this method.

Sie sollten die Zeile neu schreiben:

invoiceNum = Convert.ToInt16(performCommand.GetString(0)); 

stattdessen zu lesen:

invoiceNum = Convert.ToInt16(performCommand.GetInt32(0)); 

Sie sollten die übrigen Feldlesen überprüfen Zeilen basierend auf den korrekten zugrunde liegenden Typen.

Wenn Sie den Großteil Ihres Codes unverändert lassen möchten, sollten Sie stattdessen GetValue verwenden, da dies einen object zurückgibt, dessen Laufzeittyp den Feldtyp widerspiegelt. Sie können das dann an eine der Methoden Convert (wie Sie jetzt haben) senden, und es wird die Konvertierung durchführen, vorausgesetzt es unterstützt eine zwischen der Quelle und dem angeforderten Typ. Ändern Sie einfach alle Ihre GetString Anrufe am Leser zu GetValue.

Verwandte Themen