我們有一箇舊網站給我們提供了一個錯誤。它使用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
什麼'load_rs'做什麼呢?你也確定行號是準確的嗎? –
@Aaron Bertrand,我用load_rs的代碼更新了我的問題。我已將rs.movenext移動到diff行,包括在其周圍添加條件,並且錯誤行與該代碼保持一致。 – UpHelix
既然你說這是一箇舊網站,我認爲它一直工作得很好,直到最近。那麼改變了什麼?另外,你能告訴我們這個函數到底在做什麼(例如'client_notes_id'列是如何改變的)?我確信這可以用一個簡單的'UPDATE'語句來完成,而不需要記錄集,循環,字典對象的開銷 - 它可能比解決這個遺留代碼更快速的重寫... –