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
.
Questo chiarisce le cose. A proposito, grazie per SimplyVBUnit;) –