一千萬個為什麽

搜索

使用帶有Null Recordset字段的Str()時“無效使用Null”,但Str(Null)工作正常

我正在敲打這個墻上的頭。我正在查看一些用VB6編寫的舊數據庫報告代碼,並且遇到了這一行(代碼將數據從“源”數據庫移動到報告數據庫中):

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

rsSource!VehYearNull 時,上面的行會生成“無效使用Null”運行時錯誤。如果我在上面的行中斷並在“立即”窗格中鍵入以下內容:

?rsSource!VehYear

它輸出 Null 。很好,這很有道理。接下來,我嘗試重現錯誤:

?Str(rsSource!VehYear)

我得到“無效使用空”錯誤。

但是,如果我在立即窗口中鍵入以下內容:

?Str(Null)

我沒有收到錯誤。它只輸出 Null

如果我用 Trim()而不是 Str()重復相同的實驗,一切正常。 ?Trim(rsSource!VehYear)返回 Null?Trim(Null)。沒有運行時錯誤。

所以,我的問題是,當 Str(Null)沒有時, Str(rsSource!VehYear)怎麽可能拋出“無效使用Null”錯誤,當我知道 rsSource!VehYear 等於 Null


Update: If I type the following in the Immediate window, it works as expected (no error occurs):

?Str(rsSource!VehYear.Value)

這輸出 Null 。現在,我知道 rsSource!VehYear 實際上是一個 ADODB.Field 實例,但 Value 是它的默認屬性,所以 Str 應該在 Value 屬性上運行(這是 Null )。甚至錯誤消息(“無效使用空”)表明 Str 正在接收 Null 參數,但它如何以不同方式處理 Null 一個案子而不是另一個案子?

我唯一的猜測是 Str()的內部實現在某種程度上無法獲取默認屬性,並且“無效使用Null”錯誤發生的原因不同(除了參數之外的其他原因) “無效使用Null”,可能是在嘗試從 Field 對象中檢索默認屬性時。

有沒有人對這裏發生的事情有更詳細的技術解釋?

簡而言之:

?Str(rsSource!VehYear)

rsSource!VehYearNull 時拋出“無效使用Null”錯誤,但是

?Str(rsSource!VehYear.Value)

返回 Null

但是, Trim(rsSource!VehYear)Trim(rsSource!VehYear.Value)都返回 Null

最佳答案

如果您需要一個字符串以外的值,請嘗試使用IsNull:

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

'註0是默認值

轉載註明原文: 使用帶有Null Recordset字段的Str()時“無效使用Null”,但Str(Null)工作正常