2015-08-26 3 views
5

Conversione non riuscita durante la conversione del valore varchar 'DADE' nel tipo di dati int.Errore quando i dati sono vincolati nella tabella dati o gridview

comando SQL che uso è questo:

SELECT * FROM p_details 
WHERE LOWER(name) LIKE '%has%ln%' 
AND 
    CODE = 13 
AND 
    T_CODE='H' 

il mio codice è:

SqlDataReader drr = com4.ExecuteReader(); 
DataTable dt = new DataTable(); 
dt.Load(drr); <--error line 
GridView7.DataSource = dt; 
GridView7.DataBind(); 
+0

prega inserire altro codice non dovrebbe venire quell'errore perché non si sta convertendo DADE – wiretext

+1

Questa è l'unica cosa che sto avendo, ottenere dati dal database e chiudere la connessione. Nella tabella del database tutte le colonne come varchar, ma non so perché si sta convertendo in int. – krishnakumar

+2

Prova ad usare un 'SqlDataAdapter' invece:' usando (var da = nuovo SqlDataAdapter (sql, con)) da.Fill (dt); ' –

risposta

4

In un commento è affermare che tutte le colonne sono varchar e non vi convertirete niente per int ma il tuo sql è WHERE CODE = 13.

Quindi code è anche un varchar. Confrontandolo con lo int 13 non si converte 13 in varchar ma viceversa, si converte ogni valore in code in un int.

Perché? A causa della data type precedence regola:

  • il tipo di dati con precedenza inferiore viene convertito nel tipo di dati con la più alta priorità

int ha una precedenza maggiore così tutti varchar valori sono convertiti in int. Presumo che tu abbia un valore 'DADA' in quella colonna che non può essere convertito in int.

Quindi la soluzione è semplice, ne fanno un varchar utilizzando '13' invece di 13:

SELECT * FROM p_details 
WHERE LOWER(name) LIKE '%has%ln%' 
AND 
    CODE = '13' 
AND 
    T_CODE = 'H' 

A parte che si dovrebbe sempre utilizzare parametri SQL per evitare che SQL-injection:

SELECT * FROM p_details 
WHERE LOWER(name) LIKE @lowname 
AND 
    CODE = @code 
AND 
    T_CODE = @tCode 

com4.Parameters.Add("@lowname", SqlDbType.VarChar).Value = "%" + name.ToLower() + "%"); 
com4.Parameters.Add("@code", SqlDbType.VarChar).Value = code; 
com4.Parameters.Add("@tCode", SqlDbType.VarChar).Value = tCode; 
+0

Ha funzionato come un incantesimo, stavo pensando in qualche modo che convertirà int a varchar accecante senza pensare alla precedenza del tipo di dati, grazie. – krishnakumar

+1

@krishnakumar: si vede quanto sia importante utilizzare sempre il tipo corretto ed evitare conversioni implicite. –

+1

Sì signore, una grande lezione appresa all'inizio della mia carriera da voi. Grazie. – krishnakumar