2012-05-22 95 views
1

我們有一箇舊網站給我們提供了一個錯誤。它使用VBScript和數據庫是SQL Server 2005中行處理涉及刪除的行或標記爲刪除的行

下面是代碼:

set oNotes = server.CreateObject("SCRIPTING.DICTIONARY") 

openSQL "SELECT * FROM v_client_notes WHERE contact_id = " &_ 
    my_contactID & " ORDER BY client_notes_duedate ASC" 

do while rs.eof = false 
    set temp = server.CreateObject("SCRIPTING.DICTIONARY") 
    load_rs temp, rs 
    set oNotes(trim(rs("client_notes_id"))) = temp 
    rs.movenext'error on this line 
loop 

錯誤:

Microsoft OLE DB Provider for SQL Server error '80040e23'

Row handle referred to a deleted row or a row marked for deletion.

這個錯誤不會發生的事情,只是返回記錄集與某些contact_id的。無法找出那些工作和那些沒有工作的差異。

正如你可以看到rs.movenext發生錯誤。

我確定表中有一個主鍵(client_notes_id)。

謝謝你的幫助!

編輯

這裏是load_rs代碼:

function load_rs(dict,Byref record) 
    for each thing_record in record.fields 
     dict(thing_record.name) = trim(thing_record.value) 
    next 
end function 

這裏是更新腳本。這是一個單獨的頁面,我發佈到(有點AJAX風格)上:

If request("client_notes") <> "" then 
     client_notes_subject = request("client_notes_subject") 
     client_notes_postedby = session("user") 
     client_notes_duedate = request("client_notes_duedate") 
     if client_notes_duedate = "" then 
      client_notes_duedate = NULL 
     end if 
     client_notes_date_entered = request("client_notes_date_entered") 
     client_notes = request("client_notes") 
     if isnumeric(request("contactID")) then contact_id = request("contactID") 
     if clientnotes_id="" then clientnotes_id="0" 
     openSQL("SELECT * FROM client_notes WHERE client_notes_id=" & clientnotes_id) 
     if rs.EOF then 
      openSQL("SELECT newid()") 
      client_notes_guid = rs(0) 
      openSQL("select * from client_notes") 
      rs.addnew 
     else 
      client_notes_guid = rs("guid") 
      rs.update 
     end if 

     rs("contact_id") = contact_id 
     rs("client_notes_subject") = client_notes_subject 
     rs("client_notes_postedby") = session("user") 
     'if client_notes_duedate <> Null then 
     rs("client_notes_duedate") = client_notes_duedate 
     'end if 
     rs("client_notes_date_entered") = client_notes_date_entered 
     rs("client_notes") = client_notes 
     rs("guid")=client_notes_guid 
     rs.update 

     'if client_notes_duedate = Null then 
     ' sqlSetNullnotes = "UPDATE client_notes SET client_notes_duedate = NULL WHERE client_notes_id=" & clientnotes_id 
     ' opensql sqlSetNullnotes 
     'end if 

     next_due_date = request("next_due_date") 
     if next_due_date = "" then 
      next_due_date = NULL 
     end if 

     openSQL("SELECT * FROM " & MainContactsDB & " WHERE Contact_ID=" & contactID) 
     rs("Last_Contact_Date") = client_notes_date_entered 
     rs("Next_Contact_Date") = next_due_date 
     rs.update 
    end if 

於OpenSQL方法:

Set rs = Server.CreateObject("ADODB.Recordset") 
function openSQL(SQLrs) 
    if rs.state = 1 then rs.close 
    'response.write sqlRS 
    rs.Open SQLrs, conn, 3, 3 
end function 
+0

什麼'load_rs'做什麼呢?你也確定行號是準確的嗎? –

+0

@Aaron Bertrand,我用load_rs的代碼更新了我的問題。我已將rs.movenext移動到diff行,包括在其周圍添加條件,並且錯誤行與該代碼保持一致。 – UpHelix

+0

既然你說這是一箇舊網站,我認爲它一直工作得很好,直到最近。那麼改變了什麼?另外,你能告訴我們這個函數到底在做什麼(例如'client_notes_id'列是如何改變的)?我確信這可以用一個簡單的'UPDATE'語句來完成,而不需要記錄集,循環,字典對象的開銷 - 它可能比解決這個遺留代碼更快速的重寫... –

回答

1

好吧,我能解決這個問題。

我對連接2個表的視圖運行查詢。

問題是,有時一個筆記提交時沒有用戶標識,所以從一個表到另一個表的連接不起作用,導致用戶標識爲空。我將我的查詢修改爲以下內容:

"SELECT * FROM v_client_notes WHERE contact_id = " & my_contactID & " AND user_id IS NOT NULL ORDER BY client_notes_duedate ASC" 

現在錯誤不會回來,它只是排除未分配給某人的備註。所以現在開始解決爲什麼筆記沒有分配給某人。

謝謝!

1

您目前有這樣的:

openSQL("SELECT * FROM " & MainContactsDB & " WHERE Contact_ID=" & contactID) 
rs("Last_Contact_Date") = client_notes_date_entered 
rs("Next_Contact_Date") = next_due_date 
rs.update 

爲什麼沒有處理爲rs.EOF?也許這就是代碼死去的地方?

+0

「rs」在這一點上是一個單一的音符和對象屬性已更改,所以我運行更新,我沒有在這裏循環。我可以對此進行調教,但在這一點上我並未處於循環中。保存時不會發生問題。有時在我爲客戶端加載一些筆記以及從它不喜歡的數據庫返回的內容後,有時會發生問題。 – UpHelix

0

應該有一個表的主鍵上,你想採取行動,在這之後沒有任何問題,以更新表