Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

ASP의 레코드셋 명령어 이해하기

ASP에서 보통 레코드셋을 사용할 때

Rs.Open sql, con, 3, 1

와 같이 써주고 사용한다.(물론 위에서 레코드셋을 생성해 주어야 겠지..) 무슨 말인지도 모르면서 그냥 사용하고 있기는 하지만 왜 이렇게 사용하는 지를 아는 것은 꽤나 중요하다고 생각한다. 어느 랭귀지 에서나....

이걸 풀어쓰면....

Rs.Open Source, ActiveConnection, CursorType, LockType, Options

이다. Source는 실행할 SQL문을 뜻하고 ActiveConnection은 사용할 커넥션이다. 그렇게 보면 3은 CursorType이고 1은 LockType라는 뜻이다. 그럼 이게 뭔데 3,1로 사용하냐는 거지... ㅎ

아래는 C:/Program Files/Common Files/System/ado/adovbs.inc 파일을 오픈한 것이다. 이곳에 커서타입과 락타입의 값들이 상수로 정의 되어 있고 이에 근거하며 3과 1이라는 숫자를 사용한 것이다.

CursorType

Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3

커서는 레코드셋의 한 Row를 가르키는 커서(?)이다. 이 커서의 성격을 정해주는 것이다. adOpenForwardOnly는 커서가 앞으로만 갈 수 있고 adOpenKeyset는 동적으로 움직일 수 있지만 변경한 내용에는 접근할 수 없다.

adOpenDynamic는 원하는대로 이동이 가능하고 변경된 내용도 접근이 가능하기 때문에 중간에 다른 사용자가 수정한 데이터도 문제없이 확인이 가능하다. adOpenStatic은 앞뒤로 이동이 가능하다.


레코드셋의 사용용도에 따라 커서를 결정해 주면 성능을 향상 시킬수 있다.

LockType

Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4

락타입은 레코드셋을 잠그는 타입을 지정하는 옵션이다. 즉, 레코드셋을 가져온 클라이언트쪽(서버)에서 데이터의 수정에 대한 부분을 결정하게 된다.

adLockReadOnly는 읽기만이 가능하며, adLockPessimistic은 레코드셋을 통한 업데이트가 가능하고 사용하는 동안 다른 사용자가 변경을 할 수가 없으며 adLockOptimistic은 레코드셋을 통한 업데이트는 가능하지만 데이터를 잠그지는 않고 오직 Update를 실행하는 순간에만 잠그게 된다. adLockBatchOptimistic은 여러개의 레코드를 업데이트될 경우에만 잠그게 된다.


이렇게 보면 보통 사용하는 3, 1은 앞뒤로 이동가능한 커서타입에 리드온니로 레코드셋을 사용한다는 뜻이다.


맨위에 써 놓았듯이 여기서도 명령어 맨뒤에 Option을 사용할 수 있고 이 옵션은 지난 번 포스팅에서 설명한 옵션과 동일하다.  즉 일반적인 sql문으로 레코드셋을 연다면

Rs.Open sql, con, 3, 1, adCmdText

라고 써주는 것도 가능하고 숫자대신 명시적으로 문자열로 지정하는 것도 가능하다..

Rs.Open sql, con, adOpenStatic, adLockReadOnly

라고 작성해도 동일하다.

2007/11/11 22:23 2007/11/11 22:23

ASP에서 SQL문을 실행할 때 옵션 설정

ASP에서 Insert, Update, Delete등 반환값이 없는 SQL문을 실행할 때 보통

con.Execute sql

위와같이 사용한다. sql에 실행할 SQL문을 스트링으로 저장하고 커넥션을 이용해서 실행한다. 하지만 이 뒤에 옵션을 붙힐 수 있는데 옵션을 붙힐 경우 성능을 향상 시킬 수 있다.

con.Execute sql, , adCmdText + adExecuteNoRecords

예를 들어 위와같이 사용하면 실행 성능을 더 향상 시킬 수 있다. 뒤에 붙는 인자는 CommandTypeEnum과 ExecuteOptionEnum에 대한 값이다.

CommandTypeEnum은 sql문의 타입을 명시적으로 밝혀 주는 것이다.

adCmdUnspecified : 명령 타입을 지정하지 않는다.(사용X)
adCmdText : SQL쿼리 등 텍스트 문자열
adCmdTable : 테이블 이름
adCmdStoredProc : 스토어드 프로시저
adCmdUnknown : (기본값) CommanText를 알수 없는 값으로 지정(부하 많음)
adCmdFile : 저장된 레코드셋의 파일 이름
adCmdTable Direct : 테이블 이름


ExecuteOptionEnum : 명령의 실행 방식이다.

adAsyncExecute : 비동기식으로 실행
adAsyncFetch : 앞의 행을 가져온 이후에 비동기식으로 실행
adAsyncFetchNonBlocking : adAsyncFetch와 비슷하지만 레코드들을 가져오는 작업으로 인해 명령이 방해되지 않음
adExecuteNoRecords : 레코드를 리턴하지 않는다.
adOptionUnspecified : 명령이 명시되지 않음


그래서

con.Execute sql, , adCmdText + adExecuteNoRecords

위의 문은 sql문이 텍스트 문자열이고 레코드를 반환하지 않는 다는 것을 명시하고 있으며 이렇게 사용함으로써 퍼포먼스를 늘릴 수 있다.

추가적으로 위의 명령을 보면 콤마(,)가 2개 사용된것을 볼 수 있는데 LngRecs라는 명령어가 사용되지 않아서 그렇다.

con.Execute sql, LngRecs, adCmdText

이 명령어를 사용하면 LngRecs라는 변수에 쿼리문으로 실행된 갯수가 넘어온다. Update문으로 5개행이 변환되었다면(쿼리분석기에서 "5개분 실행됨"처럼...) LngRecs에 5라는 숫자가 들어오게 된다
2007/11/11 21:33 2007/11/11 21:33