2012-04-23 170 views
0

我使用下面的SQL針對一個SQLServer後端ADO記錄集在VB6:更新ADO記錄集計算字段

select c.name, taxid= 
    case when exists(select 1 from sometable where fld='abc') 
    then c.SSN else null end 

當我試圖記錄中更新本地一排taxid場ADO抱怨錯誤「多步驟操作產生的錯誤,檢查每個狀態值。」我認爲這是困擾於taxid字段來自計算字段而不是原始表列的事實。爲了我的目的,我永遠不會將這些更改持久化回數據庫,所以我正在尋找一種方法來告訴ADO無意保留更改,以便它可以讓我在本地更改數據。

+0

我所期望的一個錯誤,因爲taxid是不是一個真正的列。輸出爲'taxid = c.name + c.SSN'時出現同樣的錯誤。就我個人而言,我不會在VB6中使用記錄集來將更新持久化回數據庫,而是使用存儲過程並將參數化調用發送到該存儲過程。當然,該過程需要寫入,以允許輸入可更新列。我不知道是否有辦法讓ADO服從底層定義。 – 2012-04-23 19:43:50

+0

thx @Aaron但我沒有堅持更新回數據庫。我只是試圖改變記錄集中的值以滿足本地需求。有沒有辦法配置記錄集,以便ADO不會「擔心」永遠不會發生的持久性問題? – sisdog 2012-04-23 20:09:04

+2

你試過斷開記錄集嗎?設置rst.ActiveConnection = Nothing。 – HK1 2012-04-24 00:34:49

回答

1

我認爲@ HK1的建議是一個很好的建議,不過我不確定你的能力是否改變記錄集中的任何值,無論你試圖更新的列是否被計算。自從我使用經典的ADO以來,這已經很長時間了,但是如果記錄集斷開連接,它可能只會在此時被讀取。

但是,如果您對使用記錄集執行更新沒有興趣,並且您需要本地更改值,那麼您可能應該首先考慮將結果存儲在本地數組中?這樣,您可以最小化記錄集的鎖定和遊標選項,並立即關閉記錄集並釋放這些資源。現在

rs.Open cmd, conn, adOpenForwardOnly, adLockReadOnly 

Dim MyArray 
MyArray = rs.GetRows() 

rs.Close: set rs = nothing 

你可以操縱不過你想要的......

+0

這是錯誤地downvoted,然後我接到一個電話。現在,除非您進行編輯,否則不會讓我撤消它。 – Bob77 2012-04-24 08:00:37

+0

Downvote恢復! – Bob77 2012-04-24 17:44:18

+0

糟糕,完成了。在衝浪時,我需要在這裏下車! – Bob77 2012-04-24 17:51:03