2010-05-06 5 views
5

Ich hämmere meinen Kopf gegen die Wand auf diesem. Ich war in einem alten Datenbank Reporting Code suche in VB6 geschrieben und kam in dieser Zeile (die Codedaten von einer „Quelle“ Datenbank in eine Berichtsdatenbank bewegen):"Ungültige Verwendung von Null" bei Verwendung von Str() mit einem Null Recordset-Feld, aber Str (Null) funktioniert gut

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

Wenn rsSource!VehYearNull ist, die über die Linie generiert einen Laufzeitfehler "ungültige Verwendung von Null". Wenn ich auf der oberen Zeile brechen und die folgenden in dem Direkt-Bereich ein:

?rsSource!VehYear 

Es gibt Null. Gut, das macht Sinn. Als nächstes versuche ich, den Fehler zu reproduzieren:

?Str(rsSource!VehYear) 

Ich bekomme einen Fehler "ungültige Verwendung von Null".

Allerdings, wenn ich die folgenden in das Direktfenster ein:

?Str(Null) 

ich keinen Fehler. Es gibt einfach Null aus. Wenn ich das gleiche Experiment mit Trim() anstelle von Str() wiederhole, funktioniert alles gut. gibt Null zurück, ebenso wie ?Trim(Null). Keine Laufzeitfehler.

Also, meine Frage ist, wie kann Str(rsSource!VehYear) möglicherweise eine „Ungültige Verwendung von Null“ Fehler aus, wenn Str(Null) nicht, wenn ich weiß, dass rsSource!VehYear-Null gleich ist?


Update: Wenn ich folgendes in das Direktfenster ein, es wie erwartet funktioniert (kein Fehler auftritt):

?Str(rsSource!VehYear.Value) 

Diese gibt Null. Jetzt weiß ich, dass rsSource!VehYear ist eigentlich eine ADODB.Field Instanz, aber Value ist seine Standardeigenschaft, so Str sollte auf der Value-Eigenschaft (die Null ist) betrieben werden. Selbst die Fehlermeldung ("Ungültige Verwendung von Null") deutet darauf hin, dass Str einen Null Parameter empfängt, aber wie kann es Null unterschiedlich in einem Fall und nicht anders behandeln?

Meine einzige Vermutung ist die interne Implementierung von Str() ist irgendwie fehlgeschlagen, um die Standardeigenschaft zu erhalten, und der Fehler "ungültige Verwendung von Null" passiert aus einem anderen Grund (etwas anderes als der Parameter verursacht die "ungültige Verwendung von Null ", möglicherweise, wenn es versucht, die Standardeigenschaft vom Objekt Field abzurufen.

Hat jemand eine detailliertere, technische Erklärung dafür, was hier eigentlich passiert?

Kurz:

?Str(rsSource!VehYear) 

eine "Ungültige Verwendung von Null" Fehler auslöst, wenn rsSource!VehYearNull, aber

?Str(rsSource!VehYear.Value) 

kehrt Null.

Jedoch Trim(rsSource!VehYear) und Trim(rsSource!VehYear.Value) zurück Null.

Antwort

5

Die Str-Funktion wird speziell prüfen, ob ein Null-Wert übergeben wird und entsprechend damit umgehen. Wenn Sie ein Objekt übergeben, versucht es, das Ergebnis einer Standardmethode in einen String zu konvertieren. Das Ergebnis der Standardmethode wird nicht an die Str-Methode übergeben, sondern an das Field-Objekt, so dass eine Überprüfung auf Null fehlschlägt. Die Str-Funktion überprüft weiterhin den Parametertyp für Datentypen, die unterstützt werden, wenn er erkennt, dass ein Objekt vorhanden ist, und versucht, den Standardwert abzurufen. Es wird nicht erneut versucht, den Standardwert wie beim übergebenen Argument zu behandeln, daher schlägt der Versuch fehl, eine Null als String zurückzugeben. Es scheint, dass MS nicht erwartet hat, dass ein Standardwert Null oder ein anderer ungültiger Wert für Str ist. Zum Beispiel unterstützt Str keine leere Zeichenfolge.

+0

Das klärt die Dinge auf. Übrigens danke für SimplyVBUnit;) –

0

Aus dem Speicher sind null Datenbankfelder Nothing (oder möglicherweise vbNull), die nicht die gleichen Regeln wie Null gelten. Sie sollten nur in der Lage sein, eine schnelle Überprüfung zu tun:

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

Guter Vorschlag, aber das Feld ist auf jeden Fall gleich 'Null'. Ich habe es überprüft, indem ich in der IDE darüber geblättert und es in das Direktfenster ausgedruckt habe. –

1

Dies war meine Abhilfe in den VB6-Tage:

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

die & „“ wird sicherstellen, dass durchweg mindestens eine dort leere Zeichenfolge, mit der gearbeitet werden soll.

+0

Ich weiß, dass ich das Problem umgehen kann, und in diesem Fall kann ich eigentlich nur die Aufrufe von "Trim" und "Str" entfernen, da das Datenbankfeld eigentlich ein numerisches Feld ist. Ich interessiere mich mehr für die technischen Gründe, warum der Code in der Frage nicht wie erwartet funktioniert. –

6

Wenn Sie einen anderen Wert als eine Zeichenfolge benötigen, versuchen IsNull anstelle:

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

'Anmerkung 0 ist der Standardwert

Verwandte Themen