2010-02-04 16 views
12

Sto riscontrando un errore "Cast specificato non valido". Applicazione del modulo Windows in C#. Sto cercando di recuperare un valore da un tavolo. Il valore è o un piccolo, o un valore numerico (ho provato entrambi i campi, entrambi mi danno lo stesso errore), e cerco di memorizzarlo in una variabile int.Errore "cast specificato non valido" nel programma di moduli di finestre C#

ecco la fonte:

using (SqlDataReader rdr = cmd.ExecuteReader()) //"select * from table where fieldname = " + value 
{ 

while (rdr.Read()) 
{ 
    int number = (int)rdr["quantity"]; // error is here 
+0

avete provato convert.toint16 (RDR [ "quantità"]; – David

risposta

18

rdr["quantity"] sta per essere un qualcosa in scatola. Se non si tratta di un int, non è possibile annullarlo direttamente su un int (che è ciò che si sta tentando di fare) poiché è necessario innanzitutto annullarlo al tipo appropriato (ad esempio, short). Ma questo è troppo ingombrante così per chiarezza è meglio dire

Convert.ToInt32(rdr["quantity"]); 
+1

questo funziona. thx – jello

0

Provare una delle due opzioni.

int number = rdr.getInt32(rdr.GetOrdinal("quantity")); 

o

int number = int.parse(rdr["quantity"].ToString()); 
+0

La prima opzione non è un sovraccarico di validità, il secondo non verrà compilato – statenjason

+0

Ops, fisso il mio topos, scriveva da. memoria –

+0

sì la seconda risposta modificata è giusta. thx – jello

5
if(rdr["quantity"].GetType() != typeof(int)) 
    throw new InvalidOperationException(
     "quantity is a " + rdr["quantity"].GetType()); 
    int number = (int)rdr["quantity"]; // error is here 
+0

Non vedo come questo assegni la quantità nella variabile numero. logicamente, dovrei ancora ottenere un errore, se ho ragione – jello

+1

@jello Farò un'eccezione che ti dice con esattezza che tipo rdr ["quantità"] è. Senza saperlo, tutte queste risposte stanno pisciando nel vento.Per tutti sappiamo che "quantità" è un array di byte friggen. Inseriscilo nel tuo codice ed eseguilo. – Will

+0

BTW, quando dico "eseguirlo" non intendo eseguirlo in modalità di rilascio. Eseguilo in modalità di debug da Visual Studio. – Will

0

Hai provato

int number=convert.toint16(rdr["quantity"]); 
+0

dovrebbe funzionare anche. grazie – jello

1

Scommetto quantity è NULL, che non è un numero intero.

+0

no non è nullo. grazie comunque – jello

-1

Provate ad usare del SqlDataReader GetInt32()

rdr.GetInt32(rdr.GetOrdinal("quantity")); 
+0

ho provato quello. non funziona grazie comunque – jello

2

suggerimento sciocco, forse - ma hai considerato provare questo - afferrare il risultato dalla tua SqlDataReader come un esempio di object e poi controllando che tipo è? Nessuno può dirti meglio che cos'è in realtà rispetto al sistema di tipo CLR! :-)

using (SqlDataReader rdr = cmd.ExecuteReader()) 
{ 
    while (rdr.Read()) 
    { 
     object obj = rdr["quantity"]; 

     if(obj != null) 
     { 
      string objType = obj.GetType().FullName; 
     } 
    } 
} 

Se si vuole ricevere un valore indietro, si può controllare che tipo è e si spera convertirlo conseguenza, a seconda dei risultati.

0

Dal momento che hai detto che sai quale dovrebbe essere il valore perché hai creato il database ... Puoi controllare che rdr ["quantità"] abbia un valore quindi eseguire un try parse su di esso?

if(rdr["quantity"] != null) { 
    int? number = null; 
    if(int.TryParse(rdr["quantity"].ToString(), out number)) { 
     Console.WriteLine("Hurray, I have an int. Up vote Coov!"); 
    } 
} 
0
sl_id = Convert.ToInt32(lblintroducerid.Text.ToString()); 
sl_rank = Convert.ToInt32(lblassorank.Text.ToString()); 
Problemi correlati