7

私はこれで壁に頭をぶつけています。VB6 で記述された古いデータベース レポート コードを調べていたところ、次の行に出くわしました (このコードは、データを「ソース」データベースからレポート データベースに移動しています)。

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

rsSource!VehYearがの場合Null、上記の行は「無効な Null の使用」実行時エラーを生成します。上記の行を中断し、イミディエイト ペインに次のように入力すると:

?rsSource!VehYear

を出力しますNull。いいですね、それは理にかなっています。次に、エラーの再現を試みます。

?Str(rsSource!VehYear)

「無効な Null の使用」エラーが発生します。

ただし、イミディエイト ウィンドウに次のように入力すると、次のようになります。

?Str(Null)

エラーは発生しません。単純に出力しますNull

Trim()の代わりに同じ実験を繰り返すとStr()、すべてうまくいきます。?Trim(rsSource!VehYear)戻りNullます?Trim(Null)。実行時エラーはありません。

だから、私の質問は、それが等しいことがわかっているのに、そうでないStr(rsSource!VehYear)ときに「Nullの無効な使用」エラーをどのようにスローできるのでしょうか?Str(Null)rsSource!VehYearNull


更新:イミディエイト ウィンドウに次のように入力すると、期待どおりに動作します (エラーは発生しません)。

?Str(rsSource!VehYear.Value)

これは を出力しますNullrsSource!VehYearこれで、実際にはADODB.FieldインスタンスであることがわかりましたValueが、そのデフォルト プロパティであるため、プロパティ (つまり) をStr操作する必要があります。エラー メッセージ (「無効な Null の使用」) でさえ、パラメーターを受け取っていることを示唆していますが、ある場合と別の場合ではどのように異なる扱いをするのでしょうか?ValueNullStrNullNull

私の唯一の推測は、の内部実装Str()がどういうわけかデフォルト プロパティを取得できず、別の理由で「Null の無効な使用」エラーが発生しているということです (パラメータ以外の何かが「Null の無効な使用」を引き起こしている可能性があります)。オブジェクトからデフォルト プロパティを取得しようとしていFieldます)。

ここで実際に何が起こっているかについて、より詳細で技術的な説明を持っている人はいますか?

要するに:

?Str(rsSource!VehYear)

が の場合、「無効な Null の使用」エラーをスローしますrsSource!VehYearNull

?Str(rsSource!VehYear.Value)

戻りますNull

ただし、 と の両方Trim(rsSource!VehYear)Trim(rsSource!VehYear.Value)返されNullます。

4

4 に答える 4

8

文字列以外の値が必要な場合は、代わりにIsNullを使用してみてください。

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

'注0がデフォルト値です

于 2012-02-19T22:54:31.637 に答える
6

The Str function will specifically check if a Null value is passed in and deal with it accordingly. When you pass in an object it attempts to convert the result of a default method to a String. The result of the default method is not passed into the Str method, but Field object is, so a check for the initial Null will fail. The Str function will continue to check the parameter type for datatypes that it supports when it realizes that it has an object, it will attempt to retrieve the default value. It doesn't re-attempt to deal with the default value as it did with the passed in argument, so the attempt to return a Null as a String will fail. It seems MS didn't expect a default value to be Null or any other invalid value for Str. For instance Str doesn't support an empty string either.

于 2010-05-11T13:51:54.053 に答える
1

これは、vb6-days での私の回避策でした。

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

& ""は、少なくとも空の文字列が常に存在することを確認します。

于 2010-05-06T23:13:55.157 に答える
0

メモリから、null データベース フィールドはNothing(またはおそらくvbNull) であり、 と同じルールが適用されていませんNull。簡単なチェックを行うことができるはずです:

If (rsSource!VehYear Is Nothing) Then
    ' Null
Else
    ' Not null
End If
于 2010-05-06T22:47:44.313 に答える