2012-05-22 2 views
1

Google에 오류가 발생하는 이전 사이트가 있습니다. 그것은 VBScript를 사용하고 DB 여기에 SQL 서버 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)가 있는지 확인했습니다.

도움 주셔서 감사합니다.

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

업데이트 스크립트입니다 :

편집 여기

는 load_rs 코드입니다.

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

을 갱신 할 문제가 아니라 그 후, 작업을하고자하는에 테이블의 기본 키를 가지고해야 하는가? 또한 줄 번호가 정확합니까? –

+0

@Aaron Bertrand, load_rs 코드로 내 질문을 업데이트했습니다. 주위에 조건을 넣는 것을 포함하여 rs.movenext를 diff 행으로 옮겼습니다. 오류 줄은 그 코드와 일치합니다. – UpHelix

+0

이 사이트는 이전 사이트라고 했으므로 최근까지는 제대로 작동했다고 가정합니다. 그래서 무엇이 바뀌 었습니까? 또한 함수가 수행중인 작업을 정확하게 표시 할 수 있습니까 (예 :'client_notes_id' 열이 어떻게 변경됩니까?)?이 모든 레코드 집합, 루프, 사전 개체의 오버 헤드없이 간단한 UPDATE 문을 사용하여 수행 할 수 및 아마도이 레거시 코드 문제 해결 것보다 더 빨리 다시 작성 될 것이라고 확신합니다 ... –

답변

1

좋아,이 문제를 해결할 수있었습니다.

2 개의 테이블을 조인하는 뷰에 대해 쿼리를 실행하고 있습니다.

문제는 사용자 ID없이 메모가 제출되어 한 테이블에서 다른 테이블로 조인 할 때 사용자 ID가 null 인 경우 작동하지 않는 것이 문제였습니다. 내 쿼리를 다음과 같이 수정했습니다 :

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

이제 오류가 다시 발생하지 않고 누군가에게 할당되지 않은 메모가 제외됩니다. 그래서 메모가 누군가에게 배정되지 않은 이유를 고쳐야합니다.

감사합니다.

1

당신은이있다 : 이것은 내가 (좀 AJAX 스타일)에 게시 별도의 페이지에

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

는 해당 테이블`load_rs` 정확히 어떻게 무엇을