私はこれで壁に頭をぶつけています。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!VehYear
Null
更新:イミディエイト ウィンドウに次のように入力すると、期待どおりに動作します (エラーは発生しません)。
?Str(rsSource!VehYear.Value)
これは を出力しますNull
。rsSource!VehYear
これで、実際にはADODB.Field
インスタンスであることがわかりましたValue
が、そのデフォルト プロパティであるため、プロパティ (つまり) をStr
操作する必要があります。エラー メッセージ (「無効な Null の使用」) でさえ、パラメーターを受け取っていることを示唆していますが、ある場合と別の場合ではどのように異なる扱いをするのでしょうか?Value
Null
Str
Null
Null
私の唯一の推測は、の内部実装Str()
がどういうわけかデフォルト プロパティを取得できず、別の理由で「Null の無効な使用」エラーが発生しているということです (パラメータ以外の何かが「Null の無効な使用」を引き起こしている可能性があります)。オブジェクトからデフォルト プロパティを取得しようとしていField
ます)。
ここで実際に何が起こっているかについて、より詳細で技術的な説明を持っている人はいますか?
要するに:
?Str(rsSource!VehYear)
が の場合、「無効な Null の使用」エラーをスローしますrsSource!VehYear
がNull
、
?Str(rsSource!VehYear.Value)
戻りますNull
。
ただし、 と の両方Trim(rsSource!VehYear)
がTrim(rsSource!VehYear.Value)
返されNull
ます。