2014-09-04 139 views
0

我嘗試過,但無法編輯ADODB記錄集中的記錄,我使用SQL填充(Original Question。因此,我決定採用舊式(低效率)方式並將記錄集複製到新的。一個記錄被記錄使用循環複製ADO記錄集

我通過設置相同的字段屬性(數據類型和大小)開始,因爲我想確保我得到正確的數據匹配。然而,我遇到兩個錯誤:

「非 - 不可空列不能更新爲空「

「多步操作產生錯誤。檢查每個狀態值」

(而這正是我試圖避免循環!)

下面是代碼:

'Create recordset 
Set locRSp = New ADODB.Recordset 

'Copy fields (same data type, same size and all updateable (which is the final goal) 
For Each Field In locRS.Fields 
    locRSp.Fields.Append Field.Name, Field.Type, Field.DefinedSize, adFldUpdatable 
Next 

'Copy records 
locRSp.Open 
locRS.MoveFirst 
'Loop original recordset 
Do While Not locRS.EOF 
    locRSp.AddNew 
    'Loop all fields 
    For Each Field In locRS.Fields 
     locRSp.Fields(Field.Name) = locRS.Fields(Field.Name) 
    Next 
    locRS.MoveNext 
Loop 

什麼我不明白的是:

如果我複製原始字段屬性(大小和類型),爲什麼會給數據錯誤!?

是否還有其他一些我需要查看的財產?怎麼樣?

回答

0

對於第一個問題:簡單地說,如果你想存儲空值,你需要設置屬性爲「adFldIsNullable」

所以對於我的例子,我改變了追加呼籲:

locRSp.Fields.Append Field.Name, Field.Type, Field.DefinedSize, adFldIsNullable 

對於第二個問題:當查詢被下載到原始記錄集時,根據數據本身設置字段屬性。但是,在這種情況下,我去一一調查那是什麼東西,發現問題列設置爲:

數據類型adNumeric

這就需要有一個精確度和規模來定義。當精度爲你要多少數字,規模小數

的數量,以便在我的情況下,我增加了一個IF的循環,副本中的字段:

If Field.Type = 131 Then '131 is the constant value for adNumeric 
    'Define Scale 
    locRSp.Fields(Field.Name).NumericScale = 0 
    'Define Precision 
    locRSp.Fields(Field.Name).Precision = 4 
End If