2010-05-06 13 views
5

Sto sbattendo la testa contro il muro su questo. Stavo guardando un po 'di vecchio codice di report di database scritto in VB6 e sono imbattuto in questa riga (il codice è in movimento i dati da un database di "fonte" in un database di report):"Uso non valido di Null" quando si utilizza Str() con un campo Null Recordset, ma Str (Null) funziona correttamente

rsTarget!VehYear = Trim(Str(rsSource!VehYear)) 

Quando rsSource!VehYear è Null, la riga sopra genera un errore di runtime "Uso non valido di null". Se rompo sulla linea superiore e digitare quanto segue nella finestra Immediata:

?rsSource!VehYear 

emette Null. Bene, questo ha un senso. Avanti, cerco di riprodurre l'errore:

?Str(rsSource!VehYear) 

ottengo un "utilizzo non valido di null" errore.

Tuttavia, se si digita quanto segue nella finestra immediata:

?Str(Null) 

non ottengo un errore. Emette semplicemente Null.

Se ripeto lo stesso esperimento con Trim() anziché Str(), tutto funziona correttamente. ?Trim(rsSource!VehYear) restituisce Null, così come ?Trim(Null). Nessun errore di runtime.

Quindi, la mia domanda è, come può Str(rsSource!VehYear) forse gettare un "utilizzo non valido di null" quando Str(Null) non, quando ho sanno che rsSource!VehYear è uguale a Null?


Aggiornamento: Se scriv quanto segue nella finestra immediata, funziona come previsto (si verifica nessun errore):

?Str(rsSource!VehYear.Value) 

Questo uscite Null. Ora, so che rsSource!VehYear è in realtà un'istanza ADODB.Field, ma Value è la sua proprietà predefinita, quindi Str dovrebbe essere operativo sulla proprietà Value (che è Null). Anche il messaggio di errore ("Uso non valido di Null") suggerisce che Str riceve un parametro Null, ma come può trattare lo Null in modo diverso in un caso e non nell'altro?

mia unica ipotesi è l'implementazione interna di Str() è in qualche modo riesce a ottenere la proprietà di default, e "l'uso non valido di null" Errore sta accadendo per una ragione diversa (qualcosa di diverso il parametro è la causa del "utilizzo non valido di Null ", forse quando tenta di recuperare la proprietà predefinita dall'oggetto Field.

Qualcuno ha una spiegazione tecnica più dettagliata di ciò che sta effettivamente accadendo qui?

In breve:

?Str(rsSource!VehYear) 

genera un "utilizzo non valido di null" quando rsSource!VehYear è Null, ma

?Str(rsSource!VehYear.Value) 

rendimenti Null.

Tuttavia, sia Trim(rsSource!VehYear) e Trim(rsSource!VehYear.Value) restituiscono Null.

risposta

5

La funzione Str controllerà specificamente se un valore Null viene passato e gestito di conseguenza. Quando si passa un oggetto tenta di convertire il risultato di un metodo predefinito in una stringa. Il risultato del metodo predefinito non viene passato al metodo Str, ma l'oggetto Field è, quindi un controllo per il Null iniziale avrà esito negativo. La funzione Str continuerà a controllare il tipo di parametro per i tipi di dati che supporta quando si accorge di avere un oggetto, tenterà di recuperare il valore predefinito. Non tenta nuovamente di gestire il valore predefinito come ha fatto con l'argomento passato, quindi il tentativo di restituire un valore Null come stringa avrà esito negativo. Sembra che MS non si aspettasse che un valore predefinito fosse Nullo o qualsiasi altro valore non valido per Str. Ad esempio, Str non supporta neanche una stringa vuota.

+0

Questo chiarisce le cose. A proposito, grazie per SimplyVBUnit;) –

0

Dalla memoria, i campi di database null sono Nothing (o eventualmente vbNull), a cui non sono applicate le stesse regole come Null. Si dovrebbe solo essere in grado di fare un rapido controllo:

If (rsSource!VehYear Is Nothing) Then 
    ' Null 
Else 
    ' Not null 
End If 
+0

buon suggerimento, ma il campo è sicuramente uguale a 'null'. Ho controllato passando il mouse sopra l'IDE e stampandolo nella finestra Immediata. –

1

Questa era la mia soluzione in VB6 giorni:

rsTarget!VehYear = Trim(Str(rsSource!VehYear & "")) 

il & "" farà in modo che non v'è allways almeno stringa vuota con cui lavorare.

+0

So che posso aggirare il problema, e in questo caso posso effettivamente rimuovere le chiamate a 'Trim' e' Str' del tutto poiché il campo del database è in realtà un campo numerico. Sono più interessato ai motivi tecnici per cui il codice nella domanda non funziona come previsto. –

6

Se avete bisogno di un valore diverso da una stringa, provare a utilizzare IsNull invece:

rsTarget!VehYear = IIf(IsNull(rsSource!VehYear), 0, rsSource!VehYear) 

'Nota 0 è il valore predefinito

Problemi correlati