저기 질문 올린사람인데요 ^^; 좀 의문가는 점이 있어서요
아래 함수들은 제가 디버깅 할때 쓰는건데요. 다른거와 섰여있습니다.
두가지 상황에 따라서 결과가 틀려서요? 초보라서 잘모릅니다. 위에글 읽기도 힘들어요;; ㅠㅜ
◆참고
asp 에서 사용되는 db 핸들입니다
◆소스
- ▲함수 1
'필드명과 값만확인할대 :: 개발용
Function RunSQLReturnGR_fieldName(strSQL,maxLength)
On Error Resume Next
Dim Rs , Cmd
Set Rs = Server.CreateObject("ADODB.Recordset")
Set Cmd = Server.CreateObject("ADODB.Command")
Cmd.ActiveConnection = Conn
Cmd.CommandText = strSQL
Cmd.CommandType = adCmdText
Cmd.Prepared = True
Rs.CursorType = adOpenForwardOnly
Rs.CursorLocation = adUseClient
Rs.LockType = adLockReadOnly
Rs.Open Cmd
Call ViewParam(Cmd,maxLength)
Set Cmd = Nothing
If Err.Number <> 0 Then
Call errorLog_write("RunSQLReturnGR_fieldName",strSQL)
End if
End function
- ▲함수 2
'레코드셋 필드명과 내용함께 출력하기(아웃풋용) :: 개발용
Sub ViewParam(byref objCmd,maxLength)
'On Error Resume Next
Redim strOutputParamName(objCmd.Parameters.Count) , execStr(objCmd.Parameters.Count)
Dim param , i , j
i = 0 : j = 0
If maxLength = true Or maxLength = false Then
If objCmd.CommandType = adCmdStoredProc Then
Response.Write "<table border=1><tr><td><b>속성</b></td><td><b>값</b></td><td><b>사이즈</b></td><td><b>입력타입</b></td><td><b>변수타입</b></td><td><b>정밀도</b></td></tr>"
For Each Param In objCmd.Parameters
If Param.Name <> "@RETURN_VALUE" Then
If (GetParameterDirectionEnum(Param.Direction) = adParamOutput) OR (GetParameterDirectionEnum(Param.Direction) = adParamInputOutput) Then
strOutputParamName(j) = Param.Name
execStr(i) = "''"
j = j + 1
Else
execStr(i) = "'"& Param.Value &"'"
Response.Write "<tr><td><font color=orange>"& i &"번째 "& Param.Name &"</font></td><td>"& Param.Value &"</td><td>"& Param.Size &"</td><td>"& GetParameterDirectionEnum(Param.Direction) &"</td><td>"& GetDataTypeEnum(Param.Type) &"</td><td>"& Param.Precision &"</td></tr>"
End if
i = i + 1
End if
Next
Response.Write "<tr><td colspan=6><font color=red><b>아웃풋</b></font></td>"
For j = 0 To j - 1
Response.Write "<tr><td><font color=orange>"& j &"번째 "& strOutputParamName(j) &"</font></td><td>"& objCmd.Parameters(strOutputParamName(j)).Value &"</td><td>"& objCmd.Parameters(strOutputParamName(j)).Size &"</td><td>"& GetParameterDirectionEnum(objCmd.Parameters(strOutputParamName(j)).Direction) &"</td><td>"& GetDataTypeEnum(objCmd.Parameters(strOutputParamName(j)).Type) &"</td><td>"& objCmd.Parameters(strOutputParamName(j)).Precision &"</td></tr>"
Next
Response.Write "<tr><td colspan=6><font color=red><b>프로시저 실행문</b></font></td></tr>"
Response.Write "<tr><td colspan=6><font color=orange>Exec "& Mid(objCmd.CommandText, Instr(objCmd.CommandText,"call ")+5 , Instr(objCmd.CommandText,"(") - (Instr(objCmd.CommandText,"call ")+5) ) &"</font> "& arrFormat(execStr,","," ") &"</td></tr>"
Response.Write "</table><br>"
End if
End if
Dim Rs
Set Rs = Server.CreateObject("ADODB.RecordSet")
Rs.CursorType = adOpenForwardOnly
Rs.CursorLocation = adUseClient
Rs.LockType = adLockReadOnly
Rs.Open objCmd
Response.Write Rs_fieldName(Rs,maxLength)
If objState(Rs.State) = "adStateOpen" Then <=================== 이 부분
Rs.Close
Set Rs = Nothing
End if
If Err.Number <> 0 Then
Call errorLog_write("ViewParam",Mid(objCmd.CommandText, Instr(objCmd.CommandText,"call ")+5 , Instr(objCmd.CommandText,"(") - (Instr(objCmd.CommandText,"call ")+5) ))
Set objCmd = Nothing
Else
Set objCmd = Nothing
End if
End Sub
- ▲함수 3
'레코드셋 필드명과 내용함께 출력하기 :: 개발용
Function Rs_fieldName(objRecordSet , maxLength)
Dim Field , tempStr , i , j , k
If maxLength = false Then
Exit function
End if
tempStr = ""
Dim objRecordSet_temp
Set objRecordSet_temp = objRecordSet
Do Until objRecordSet_temp Is nothing
i = 0 : j = 0 : k = 0
tempStr = tempStr &"<table border=1><tr>"
For Each Field in objRecordSet_temp.Fields
tempStr = tempStr &"<td><b>"& Field.name &" <br><font color=red>"& i &"열</font></b></td>"
i = i + 1
Next
tempStr = tempStr &"</tr>"
If objState(objRecordSet_temp.State) = "adStateClosed" Then
tempStr = tempStr &"</table>"
Rs_fieldName = tempStr
Exit function
End if
If objRecordSet_temp.Eof OR objRecordSet_temp.Bof Then
tempStr = tempStr &"<tr><td colspan="& i &"><b>결과없음</b></td></tr>"
Else
Do Until objRecordSet_temp.Eof
tempStr = tempStr &"<tr>"
For Each Field in objRecordSet_temp.Fields
tempStr = tempStr &"<td valign=top><font color=orange>"& j &"행 "& k &"열</font><br><br>"& Field &"</td>"
k = k + 1
next
tempStr = tempStr &"</tr>"
objRecordSet_temp.MoveNext
j = j + 1
k = 0
If isNumeric(maxLength) Then
If Cint(j) = Cint(maxLength) Then Exit do
End if
Loop
objRecordSet_temp.MoveFirst
End if
tempStr = tempStr &"</table><br><br>"
Set objRecordSet_temp = objRecordSet_temp.NextRecordset
Loop
Rs_fieldName = tempStr
End function
- ▲함수 4
'레코드셋 필드명과 내용함께 출력하기 :: 개발용
Function Rs_fieldName(byVal objRecordSet , maxLength)
Dim Field , tempStr , i , j , k
If maxLength = false Then
Exit function
End if
tempStr = "<table cellpadding=0 cellspacing=0 border=1><tr>"
i = 0 : j = 0 : k = 0
For Each Field in objRecordSet.Fields
tempStr = tempStr &"<td><b>"& Field.name &"</b><br><font color=red>"& i &"열</font></td>"
i = i + 1
Next
tempStr = tempStr &"</tr>"
If objRecordSet.State = 0 Then
tempStr = tempStr &"</table>"
Rs_fieldName = tempStr
Exit function
End if
If objRecordSet.Eof Then
tempStr = tempStr &"<tr><td colspan=100>자료가 없습니다</td></tr>"
Else
Do Until objRecordSet.Eof
tempStr = tempStr &"<tr>"
For Each Field in objRecordSet.Fields
tempStr = tempStr &"<td valign=top><font color=orange>"& j &"행 "& k &"열</font><br><br>"& Field &"</td>"
k = k + 1
next
tempStr = tempStr &"</tr>"
objRecordSet.MoveNext
j = j + 1
k = 0
If isNumeric(maxLength) Then
If Cint(j) = Cint(maxLength) Then Exit do
End if
Loop
objRecordSet.MoveFirst
End if
tempStr = tempStr &"</table>"
Rs_fieldName = tempStr
End function
◆요약
rs 를 제가 원하는 식으로 출력후 rs 를 원상 복귀 시키는거조 그래서야 정상적인 값이 나올테니까요
◆질문 1
함수 1을 사용해서 결과를 출력하면 잘됩니다;;
그런데 함수 3을 사용하면
ADODB.Recordset error '800a0e78'
개체가 닫혀있으면 작업이 허용되지 않습니다.
ㅌㅌㅌㅌ.asp, line 591
그래서
함수 3대신 함수 4를 쓰면
잘됩니다;; 왜 그런걸까요?
sql = sql & "ORDER BY IDX DESC "
Function rs_open(sql)
Set rs = Server.CreateObject("Adodb.Recordset")
rs.open sql, db, 1
End Function
Call rs_open(sql)
'print dbs.RunSQLReturnGR_fieldName(sql,true) <--------------- 정상 ( 이건 새로운 rs 를 생성하니 그럴수도 있다 생각은 됩니다.)
'print Rs_fieldName(rs,true) <--------------- 정상(이건 왜 그럴까요?)
response.write dbs.rs_fieldName(rs,true) <--------------- 비정상
rs.pagesize = pSize
IntArecord = rs.recordcount <------ 이부분에서 요류가 나내요
IntApage = rs.pagecount
◆질문 2
더 이상한건 함수 3의 상화에 따라서 함수 2의 개체 처리 부분이 이상합니다. 아직 개념이 안서서 ^^
If objState(Rs.State) = "adStateOpen" Then <=================== 이 부분
Rs.Close
Set Rs = Nothing
End if
' If Not(Rs is nothing) Then
' Rs.Close
' Set Rs = Nothing
' End if
두개의 처리 구문이 서로 다른 결과를 나타 냅니다.
[최초 등록일: ]
[최종 수정일: 5/16/2007]