2010년 1월 21일 목요일

ADO cursor type

강좌 최초 시작일 : 2004년 09월 21일
  텍스트 강좌 내용 : ADO

  작 성 자 : 익명
  편 집 자 : Danny(전 성대)

  강좌 제목 : ADO cursor type_4GuysFromRolla

 

ADO 를 이용하여 데이터베이스에 있는 데이터를 가지고 올 때 레코드셋 객체를 이용하게 된다 . 레코드셋 객체는 은연중 (implicitly) 에 생성할 수도 있고 명확하게 (explicitly) 생성할 수도 있다 . 다음과 같은 코드를 보자 :
 

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DSN=SomeDSN"

Dim objRS
Set objRS = objConn.Execute("SELECT * FROM MyTable")

위의 코드에서 objRS 가 레코드셋 객체이다 . 그것은 개발자가 명시적으로 생성한 것이 아니라 ADO 에 의해 은연중 생성된 것이다 . 이와 같은 방식으로 레코드셋 객체가 생성되면 그 레코드셋 객체는 디폴트 커서와 디폴트 락타입 (locktype) 이 정해진다 .

쿼리 (query) 를 수행하게 되면 일련의 데이터 집합이 반환된다 . 이 때 커서는 각각의 레코드 행의 반복 위치를 결정하고 현재 데이터베이스 상태를 정확히 일치시켜주는 역할을 한다 . 이 커서에는 ForwardOnly, Static, Dynamic, Keyset 과 같은 4 가지 종류가 있다 . 이에 대한 자세한 내용은 다음 글을 참조하기 바란다 :

  • 레코드셋 커서의 4 가지 종류

ADO 에서 레코드셋 객체를 다음과 같이 명시적으로 생성하면 커서 유형을 원하는 대로 지정할 수 있다 .

Set rs = Server.CreateObject("ADODB.Recordset")

하지만 다음과 같이 레코드셋 객체 생성을 명시적으로 지정하지 않고 그 생성을 ADO 에게 맡기면 포워드 - 온리 커서 (forward-only cursor) 를 가진 레코드셋 객체가 생성된다 .

Dim rs, conn
Set conn = Server.CreateObject("ADODB.Connection")

'Application-level 컨넥션 문자열을 이용하여 연결 객체 오픈
conn.Open Application("Connection_String")
Set rs = conn.Execute("SELECT * FROM pubs") )

Set rs=Server.CreateObject("ADODB.Recordset") 이라고 명시적으로 레코드셋 객체를 개발자가 직접 생성해주면 커서 타입을 원하는 타입으로 다음과 같이 지정해 줄 수 있다 .

rs.CursorType = ' 원하는 커서 타입 지정

커서 타입에는 다음과 같은 네 가지 중 하나를 이용하면 된다 .

  • Forward-only
  • Static
  • Keyset
  • Dynamic

포워드 - 온리 커서 (Forward-only cursor) : 최소한의 오버헤드를 지닌 커서로 가장 좋은 성능을 낸다 . 또한 레코드셋의 디폴트 커서이다 . 유일한 단점이라면 오직 한 방향으로만 움직일 수 있다는 것이다 . 즉 , 레코드셋의 앞 부분에서 끝 부분으로 이동하는 명령만 사용할 수 있다 . 예를 들어 , rs.MoveNext 는 사용할 수 있어도 rs.MovePrev 는 사용할 수가 없다 . 만일 포워드 - 온리 커서를 지닌 레코드셋 객체에서 rs.MovePrev 명령어를 사용하면 에러가 발생한다 . 이 커서를 명시적으로 사용하려면 다음과 같이 지정해 주면 된다 :

rs.CursorType = adOpenForwardOnly

adOpenForwardOnly 는 adovbs.inc 에 정의되어 있다 . adovbs.inc 에 대한 자세한 내용은 다음 글을 참조하기 바란다 .

( 만일 Adovbs.inc 파일에서 일부 상수만 사용하는 경우는 해당 ASP 파일 안에서 직접 정의하여 사용하는 것이 좋을 수 있다는 것도 참조하기 바란다 )

스태틱 커서 (static cursor) : 이 커서는 어떤 방향으로도 이동할 수가 있다 . 하지만 사용자가 레코드셋을 보고 있는 동안은 레코드셋에 update, delete, add 등을 반영할 수가 없다 . 이것은 요청 당시의 데이터 스냅샷 (snapshot) 과도 같다 . 이 커서 타입의 레코드셋은 MoveFirst, MoveLast, MovePrev, MoveNext, RecordCount 등 모든 명령어를 사용할 수가 있다 . 커서 지정은 다음과 같다 :

rs.CursorType = adOpenStatic

다이내믹 및 키셋 커서 (Dynamic & Keyset cursor) : 이 커서를 사용하면 데이터에 변화가 일어났을 때 바로 알 수 있도록 해준다 . 이것은 비주얼 베이직으로 작성한 애플리케이션에는 좋을 수 있지만 웹 상에서는 바람직하지가 않다 . 다이내믹 또는 키셋 커서는 스태틱 또는 포워드 - 온리 커서보다 더 많은 리소스를 잡아먹기 때문에 웹 상에서는 사용하지 않을 것을 권한다 .

레코드셋의 데이터를 앞 뒤로 내비게이션 해야하거나 , 레코드셋 개수를 카운트할 때에만 스태틱 커서를 사용하고 나머지 경우에는 포워드 - 온리 커서를 사용하는 것이 좋다 .

레코드셋에 있는 내용을 앞으로만 내비게이션 해도 상관 없는 경우 포워드 - 온리 커서를 사용함으로써 시스템의 리소스를 절약하고 성능을 증가시킬 수 있다 .

락타입 (locktype) 은 레코드셋에 들어 있는 어떤 레코드를 업데이트 시키려할 때 레코드를 어떻게 잠글지에 대한 것을 결정한다 . 이런 락타입에는 ReadOnly, LockOptimistic, LockPessimistic, LockBatchOptimistic 과 같은 4 가지 종류가 있다 . 만일 레코드셋을 ReadOnly 락타입으로 열었다면 레코드셋을 업데이트 시킬 수 없을 것이다 . 차라리 테이블에 들어 있는 레코드를 업데이트 시키고 싶다면 UPDATE SQL 문을 사용하거나 스토어드 프로시져를 사용하는 것이 더 바람직하다 .

앞에서 설명하였듯이 레코드셋을 생성할 때 명시적으로 생성하지 않으면 디폴트 커서와 디폴트 락타입이 설정된다고 하였다 . 이 말은 레코드셋의 커서와 락타입을 변경시킬 수 없음을 의미한다 . 그러므로 커서와 락타입을 임의로 설정하고자 한다면 다음과 같이 레코드셋을 명시적으로 생성해줄 필요가 있다 :

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DSN=SomeDSN"

' 명시적으로 레코드셋 객체 생성
Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")

' 락타입 설정
objRS.LockType = adLockReadOnly

' 커서 타입 설정
objRS.CursorType = adOpenForwardOnly

위의 코드에서 adLockReadOnly 등과 같은 상수를 사용하려면 ADOVBS.inc 파일을 인클루드 시키거나 그와 관련된 상수를 미리 선언해야 한다 . ADOVBS.inc 에 대한 내용은 다음 글을 참조하기 바란다 :

  • ADO 이용시 Adovbs.inc 파일 사용하는 방법

개요

이 글은 ASP 를 시작한지 얼마 안됐고 다른 사람의 ASP 코드를 보면서 분석을 하고 있는 사람들을 위한 글이다 . ASP 중급자들에게는 어찌 보면 당연한 얘기일 수 있지만 ASP 를 막 시작한 사람들에게는 궁금한 내용일 수 있는 .inc 파일과 ADO 를 사용할 때 이용하는 adovbs.inc 파일에 대해 살펴 보도록 하자 .

도대체 .inc 파일은 무엇인가 ?

.inc 파일은 단지 인클루드 (include) 파일이다 . 인클루드 파일이란 자주 사용할 수 있는 코드들을 하나의 파일로 묶어 다른 ASP 파일 안에서도 그 파일을 참조할 수 있도록 한 파일이다 . 대부분의 ASP 개발자들이 여러 이유로 인클루드 파일의 확장자를 .asp 로 하여 사용하고 있지만 원래 인클루드 파일의 확장자는 .inc 이다 . 이 확장자를 사용하는 이유는 기존 ASP 파일의 확장자와 구분시키기 위해서이다 .

Adovbs 란 무엇인가 ?

Adovbs 는 VBS(Visual Basic Script) 를 위한 ADO(ActiveX Data Objects) 의 약자이다 . ADO 는 ASP 및 VBScript 에서 가장 보편적으로 사용되고 있는 데이터 처리와 관련된 인터페이스이다 . 만일 ASP 에서 데이터베이스에 접근하여 어떤 작업을 했던 적이 있다면 틀림없이 이 ADO 를 사용하였을 것이다 .

그렇다면 JScript 를 위한 것은 없는가 ?

있다 . 그 이름은 adojavas.inc 파일이다 . 이 파일은 Adovbs.inc 파일과 내용은 똑같지만 JScript 를 위한 것이다 .

Adovbs.inc 엿보기

다음은 Adovbs.inc 파일의 일부분이다 :

<%

'--------------------------------------------------------------------

' Microsoft ADO

'

' Copyright (c) 1996-1998 Microsoft Corporation.

'

'

'

' ADO constants include file for VBScript

'

'--------------------------------------------------------------------

'---- CursorTypeEnum Values ----

Const adOpenForwardOnly = 0

Const adOpenKeyset = 1

Const adOpenDynamic = 2

Const adOpenStatic = 3

'---- CursorOptionEnum Values ----

Const adHoldRecords = &H00000100

Const adMovePrevious = &H00000200

Const adAddNew = &H01000400

Const adDelete = &H01000800

'...

'... Lots more lines like the ones above go here ...

'...

'---- RecordTypeEnum Values ----

Const adSimpleRecord = 0

Const adCollectionRecord = 1

Const adStructDoc = 2

%>

위의 예를 보면 알 수 있듯이 대부분 상수 (const) 를 선언한 것이다 . 대략 파일 사이즈는 15K 정도 된다 .

Adovbs.inc 파일은 왜 필요한가 ?

ASP 에서 데이터베이스와 관련된 작업을 할 때 ADO 를 사용하게 된다 . ADO 를 효과적으로 사용하려면 이 Adovbs.inc 파일의 내용을 잘 알아 사용하는 것이 도움이 된다 . 모든 다른 컴퓨터 프로그램과 마찬가지로 ADO 도 &H00000200(16 진수 ) 과 같은 숫자 밖에는 이해하지 못한다 . 하지만 프로그래밍을 할 때 이런 숫자를 알아서 사용하는 것도 어렵고 이렇게 작성된 코드를 분석하는 것도 어려운 일이다 . 이를 위해 이 숫자들과 의미있는 이름들을 매칭시켜 실제 프로그래밍을 할 때에는 숫자 대신 의미있는 이름을 사용하는 것이 도움이 된다 . 그렇다 . 이런 숫자 값과 의미 있는 이름을 매칭시켜 놓은 것이 바로 Adovbs.inc 파일이다 .

좀 더 쉬운 예를 들어 보자 .

마일 Adovbs.inc 파일을 해당 ASP 파일 안에 인클루드 시켰다면 다음과 같이 ADO 관련 코드르 ㄹ작성할 수 있다 :

rstTest.Open strSQL, cnnTest, adOpenStatic, adLockReadOnly, adCmdText

하지만 Adovbs.inc 파일을 인클루드 시키지 않았다면 다음과 같이 프로그래밍을 해야 한다 :

rstTest.Open strSQL, cnnTest, 3, 1, &H0001

위 예를 보면 알겠지만 Adovbs.inc 파일을 인클루드 시킨 후 코드를 작성하는 것이 훨씬 가독성이 뛰어나다는 것을 알 수 있다 . 첫 번째 예는 사용된 상수만 보더라도 레코드셋을 읽기전용 타입의 락 , 스태틱 커서 , 텍스트 형 쿼리로 열어야함을 알 수 있다 .

만일 위 상수 (adOpenStatic, adLockReadOnly, adCmdText 와 같은 ...) 만 적어 놓고 Adovbs.inc 파일을 인클루드 시키지 않았다면 에러가 발생할 것이다 . 컴퓨터는 이 상수와 매치되는 숫자를 찾을 수 없기 때문이다 .

어디서 구하고 어떻게 사용하는가 ?

아마 틀림없이 시스템 어디엔가 존재할 것이다 . 탐색기나 내 컴퓨터에서 찾기 기능을 이용하여 "adovbs.inc" 파일을 찾아보기 바란다 . 만일 찾을 수 없다면 다음 링크를 통해 다운로드 받기 바란다 .

adovbs.inc

Adovbs.inc 파일 내용은 다음과 같다 . 파일로 필요하다면 아래 내용을 복사한 후 adovbs.inc 이름으로 저장하기 바란다 :

<%

'--------------------------------------------------------------------

' Microsoft ADO

'

' Copyright (c) 1996-1998 Microsoft Corporation.

'

'

'

' ADO constants include file for VBScript

'

'--------------------------------------------------------------------

'---- CursorTypeEnum Values ----

Const adOpenForwardOnly = 0

Const adOpenKeyset = 1

Const adOpenDynamic = 2

Const adOpenStatic = 3

'---- CursorOptionEnum Values ----

Const adHoldRecords = &H00000100

Const adMovePrevious = &H00000200

Const adAddNew = &H01000400

Const adDelete = &H01000800

Const adUpdate = &H01008000

Const adBookmark = &H00002000

Const adApproxPosition = &H00004000

Const adUpdateBatch = &H00010000

Const adResync = &H00020000

Const adNotify = &H00040000

Const adFind = &H00080000

Const adSeek = &H00400000

Const adIndex = &H00800000

'---- LockTypeEnum Values ----

Const adLockReadOnly = 1

Const adLockPessimistic = 2

Const adLockOptimistic = 3

Const adLockBatchOptimistic = 4

'---- ExecuteOptionEnum Values ----

Const adAsyncExecute = &H00000010

Const adAsyncFetch = &H00000020

Const adAsyncFetchNonBlocking = &H00000040

Const adExecuteNoRecords = &H00000080

Const adExecuteStream = &H00000400

'---- ConnectOptionEnum Values ----

Const adAsyncConnect = &H00000010

'---- ObjectStateEnum Values ----

Const adStateClosed = &H00000000

Const adStateOpen = &H00000001

Const adStateConnecting = &H00000002

Const adStateExecuting = &H00000004

Const adStateFetching = &H00000008

'---- CursorLocationEnum Values ----

Const adUseServer = 2

Const adUseClient = 3

'---- DataTypeEnum Values ----

Const adEmpty = 0

Const adTinyInt = 16

Const adSmallInt = 2

Const adInteger = 3

Const adBigInt = 20

Const adUnsignedTinyInt = 17

Const adUnsignedSmallInt = 18

Const adUnsignedInt = 19

Const adUnsignedBigInt = 21

Const adSingle = 4

Const adDouble = 5

Const adCurrency = 6

Const adDecimal = 14

Const adNumeric = 131

Const adBoolean = 11

Const adError = 10

Const adUserDefined = 132

Const adVariant = 12

Const adIDispatch = 9

Const adIUnknown = 13

Const adGUID = 72

Const adDate = 7

Const adDBDate = 133

Const adDBTime = 134

Const adDBTimeStamp = 135

Const adBSTR = 8

Const adChar = 129

Const adVarChar = 200

Const adLongVarChar = 201

Const adWChar = 130

Const adVarWChar = 202

Const adLongVarWChar = 203

Const adBinary = 128

Const adVarBinary = 204

Const adLongVarBinary = 205

Const adChapter = 136

Const adFileTime = 64

Const adPropVariant = 138

Const adVarNumeric = 139

Const adArray = &H2000

'---- FieldAttributeEnum Values ----

Const adFldMayDefer = &H00000002

Const adFldUpdatable = &H00000004

Const adFldUnknownUpdatable = &H00000008

Const adFldFixed = &H00000010

Const adFldIsNullable = &H00000020

Const adFldMayBeNull = &H00000040

Const adFldLong = &H00000080

Const adFldRowID = &H00000100

Const adFldRowVersion = &H00000200

Const adFldCacheDeferred = &H00001000

Const adFldIsChapter = &H00002000

Const adFldNegativeScale = &H00004000

Const adFldKeyColumn = &H00008000

Const adFldIsRowURL = &H00010000

Const adFldIsDefaultStream = &H00020000

Const adFldIsCollection = &H00040000

'---- EditModeEnum Values ----

Const adEditNone = &H0000

Const adEditInProgress = &H0001

Const adEditAdd = &H0002

Const adEditDelete = &H0004

'---- RecordStatusEnum Values ----

Const adRecOK = &H0000000

Const adRecNew = &H0000001

Const adRecModified = &H0000002

Const adRecDeleted = &H0000004

Const adRecUnmodified = &H0000008

Const adRecInvalid = &H0000010

Const adRecMultipleChanges = &H0000040

Const adRecPendingChanges = &H0000080

Const adRecCanceled = &H0000100

Const adRecCantRelease = &H0000400

Const adRecConcurrencyViolation = &H0000800

Const adRecIntegrityViolation = &H0001000

Const adRecMaxChangesExceeded = &H0002000

Const adRecObjectOpen = &H0004000

Const adRecOutOfMemory = &H0008000

Const adRecPermissionDenied = &H0010000

Const adRecSchemaViolation = &H0020000

Const adRecDBDeleted = &H0040000

'---- GetRowsOptionEnum Values ----

Const adGetRowsRest = -1

'---- PositionEnum Values ----

Const adPosUnknown = -1

Const adPosBOF = -2

Const adPosEOF = -3

'---- BookmarkEnum Values ----

Const adBookmarkCurrent = 0

Const adBookmarkFirst = 1

Const adBookmarkLast = 2

'---- MarshalOptionsEnum Values ----

Const adMarshalAll = 0

Const adMarshalModifiedOnly = 1

'---- AffectEnum Values ----

Const adAffectCurrent = 1

Const adAffectGroup = 2

Const adAffectAllChapters = 4

'---- ResyncEnum Values ----

Const adResyncUnderlyingValues = 1

Const adResyncAllValues = 2

'---- CompareEnum Values ----

Const adCompareLessThan = 0

Const adCompareEqual = 1

Const adCompareGreaterThan = 2

Const adCompareNotEqual = 3

Const adCompareNotComparable = 4

'---- FilterGroupEnum Values ----

Const adFilterNone = 0

Const adFilterPendingRecords = 1

Const adFilterAffectedRecords = 2

Const adFilterFetchedRecords = 3

Const adFilterConflictingRecords = 5

'---- SearchDirectionEnum Values ----

Const adSearchForward = 1

Const adSearchBackward = -1

'---- PersistFormatEnum Values ----

Const adPersistADTG = 0

Const adPersistXML = 1

'---- StringFormatEnum Values ----

Const adClipString = 2

'---- ConnectPromptEnum Values ----

Const adPromptAlways = 1

Const adPromptComplete = 2

Const adPromptCompleteRequired = 3

Const adPromptNever = 4

'---- ConnectModeEnum Values ----

Const adModeUnknown = 0

Const adModeRead = 1

Const adModeWrite = 2

Const adModeReadWrite = 3

Const adModeShareDenyRead = 4

Const adModeShareDenyWrite = 8

Const adModeShareExclusive = &Hc

Const adModeShareDenyNone = &H10

Const adModeRecursive = &H400000

'---- RecordCreateOptionsEnum Values ----

Const adCreateCollection = &H00002000

Const adCreateStructDoc = &H80000000

Const adCreateNonCollection = &H00000000

Const adOpenIfExists = &H02000000

Const adCreateOverwrite = &H04000000

Const adFailIfNotExists = -1

'---- RecordOpenOptionsEnum Values ----

Const adOpenRecordUnspecified = -1

Const adOpenOutput = &H00800000

Const adOpenAsync = &H00001000

Const adDelayFetchStream = &H00004000

Const adDelayFetchFields = &H00008000

Const adOpenExecuteCommand = &H00010000

'---- IsolationLevelEnum Values ----

Const adXactUnspecified = &Hffffffff

Const adXactChaos = &H00000010

Const adXactReadUncommitted = &H00000100

Const adXactBrowse = &H00000100

Const adXactCursorStability = &H00001000

Const adXactReadCommitted = &H00001000

Const adXactRepeatableRead = &H00010000

Const adXactSerializable = &H00100000

Const adXactIsolated = &H00100000

'---- XactAttributeEnum Values ----

Const adXactCommitRetaining = &H00020000

Const adXactAbortRetaining = &H00040000

'---- PropertyAttributesEnum Values ----

Const adPropNotSupported = &H0000

Const adPropRequired = &H0001

Const adPropOptional = &H0002

Const adPropRead = &H0200

Const adPropWrite = &H0400

'---- ErrorValueEnum Values ----

Const adErrProviderFailed = &Hbb8

Const adErrInvalidArgument = &Hbb9

Const adErrOpeningFile = &Hbba

Const adErrReadFile = &Hbbb

Const adErrWriteFile = &Hbbc

Const adErrNoCurrentRecord = &Hbcd

Const adErrIllegalOperation = &Hc93

Const adErrCantChangeProvider = &Hc94

Const adErrInTransaction = &Hcae

Const adErrFeatureNotAvailable = &Hcb3

Const adErrItemNotFound = &Hcc1

Const adErrObjectInCollection = &Hd27

Const adErrObjectNotSet = &Hd5c

Const adErrDataConversion = &Hd5d

Const adErrObjectClosed = &He78

Const adErrObjectOpen = &He79

Const adErrProviderNotFound = &He7a

Const adErrBoundToCommand = &He7b

Const adErrInvalidParamInfo = &He7c

Const adErrInvalidConnection = &He7d

Const adErrNotReentrant = &He7e

Const adErrStillExecuting = &He7f

Const adErrOperationCancelled = &He80

Const adErrStillConnecting = &He81

Const adErrInvalidTransaction = &He82

Const adErrUnsafeOperation = &He84

Const adwrnSecurityDialog = &He85

Const adwrnSecurityDialogHeader = &He86

Const adErrIntegrityViolation = &He87

Const adErrPermissionDenied = &He88

Const adErrDataOverflow = &He89

Const adErrSchemaViolation = &He8a

Const adErrSignMismatch = &He8b

Const adErrCantConvertvalue = &He8c

Const adErrCantCreate = &He8d

Const adErrColumnNotOnThisRow = &He8e

Const adErrURLIntegrViolSetColumns = &He8f

Const adErrURLDoesNotExist = &He8f

Const adErrTreePermissionDenied = &He90

Const adErrInvalidURL = &He91

Const adErrResourceLocked = &He92

Const adErrResourceExists = &He93

Const adErrCannotComplete = &He94

Const adErrVolumeNotFound = &He95

Const adErrOutOfSpace = &He96

Const adErrResourceOutOfScope = &He97

Const adErrUnavailable = &He98

Const adErrURLNamedRowDoesNotExist = &He99

Const adErrDelResOutOfScope = &He9a

Const adErrPropInvalidColumn = &He9b

Const adErrPropInvalidOption = &He9c

Const adErrPropInvalidValue = &He9d

Const adErrPropConflicting = &He9e

Const adErrPropNotAllSettable = &He9f

Const adErrPropNotSet = &Hea0

Const adErrPropNotSettable = &Hea1

Const adErrPropNotSupported = &Hea2

Const adErrCatalogNotSet = &Hea3

Const adErrCantChangeConnection = &Hea4

Const adErrFieldsUpdateFailed = &Hea5

Const adErrDenyNotSupported = &Hea6

Const adErrDenyTypeNotSupported = &Hea7

'---- ParameterAttributesEnum Values ----

Const adParamSigned = &H0010

Const adParamNullable = &H0040

Const adParamLong = &H0080

'---- ParameterDirectionEnum Values ----

Const adParamUnknown = &H0000

Const adParamInput = &H0001

Const adParamOutput = &H0002

Const adParamInputOutput = &H0003

Const adParamReturnValue = &H0004

'---- CommandTypeEnum Values ----

Const adCmdUnknown = &H0008

Const adCmdText = &H0001

Const adCmdTable = &H0002

Const adCmdStoredProc = &H0004

Const adCmdFile = &H0100

Const adCmdTableDirect = &H0200

'---- EventStatusEnum Values ----

Const adStatusOK = &H0000001

Const adStatusErrorsOccurred = &H0000002

Const adStatusCantDeny = &H0000003

Const adStatusCancel = &H0000004

Const adStatusUnwantedEvent = &H0000005

'---- EventReasonEnum Values ----

Const adRsnAddNew = 1

Const adRsnDelete = 2

Const adRsnUpdate = 3

Const adRsnUndoUpdate = 4

Const adRsnUndoAddNew = 5

Const adRsnUndoDelete = 6

Const adRsnRequery = 7

Const adRsnResynch = 8

Const adRsnClose = 9

Const adRsnMove = 10

Const adRsnFirstChange = 11

Const adRsnMoveFirst = 12

Const adRsnMoveNext = 13

Const adRsnMovePrevious = 14

Const adRsnMoveLast = 15

'---- SchemaEnum Values ----

Const adSchemaProviderSpecific = -1

Const adSchemaAsserts = 0

Const adSchemaCatalogs = 1

Const adSchemaCharacterSets = 2

Const adSchemaCollations = 3

Const adSchemaColumns = 4

Const adSchemaCheckConstraints = 5

Const adSchemaConstraintColumnUsage = 6

Const adSchemaConstraintTableUsage = 7

Const adSchemaKeyColumnUsage = 8

Const adSchemaReferentialConstraints = 9

Const adSchemaTableConstraints = 10

Const adSchemaColumnsDomainUsage = 11

Const adSchemaIndexes = 12

Const adSchemaColumnPrivileges = 13

Const adSchemaTablePrivileges = 14

Const adSchemaUsagePrivileges = 15

Const adSchemaProcedures = 16

Const adSchemaSchemata = 17

Const adSchemaSQLLanguages = 18

Const adSchemaStatistics = 19

Const adSchemaTables = 20

Const adSchemaTranslations = 21

Const adSchemaProviderTypes = 22

Const adSchemaViews = 23

Const adSchemaViewColumnUsage = 24

Const adSchemaViewTableUsage = 25

Const adSchemaProcedureParameters = 26

Const adSchemaForeignKeys = 27

Const adSchemaPrimaryKeys = 28

Const adSchemaProcedureColumns = 29

Const adSchemaDBInfoKeywords = 30

Const adSchemaDBInfoLiterals = 31

Const adSchemaCubes = 32

Const adSchemaDimensions = 33

Const adSchemaHierarchies = 34

Const adSchemaLevels = 35

Const adSchemaMeasures = 36

Const adSchemaProperties = 37

Const adSchemaMembers = 38

Const adSchemaTrustees = 39

Const adSchemaFunctions = 40

Const adSchemaActions = 41

Const adSchemaCommands = 42

Const adSchemaSets = 43

'---- FieldStatusEnum Values ----

Const adFieldOK = 0

Const adFieldCantConvertValue = 2

Const adFieldIsNull = 3

Const adFieldTruncated = 4

Const adFieldSignMismatch = 5

Const adFieldDataOverflow = 6

Const adFieldCantCreate = 7

Const adFieldUnavailable = 8

Const adFieldPermissionDenied = 9

Const adFieldIntegrityViolation = 10

Const adFieldSchemaViolation = 11

Const adFieldBadStatus = 12

Const adFieldDefault = 13

Const adFieldIgnore = 15

Const adFieldDoesNotExist = 16

Const adFieldInvalidURL = 17

Const adFieldResourceLocked = 18

Const adFieldResourceExists = 19

Const adFieldCannotComplete = 20

Const adFieldVolumeNotFound = 21

Const adFieldOutOfSpace = 22

Const adFieldCannotDeleteSource = 23

Const adFieldReadOnly = 24

Const adFieldResourceOutOfScope = 25

Const adFieldAlreadyExists = 26

Const adFieldPendingInsert = &H10000

Const adFieldPendingDelete = &H20000

Const adFieldPendingChange = &H40000

Const adFieldPendingUnknown = &H80000

Const adFieldPendingUnknownDelete = &H100000

'---- SeekEnum Values ----

Const adSeekFirstEQ = &H1

Const adSeekLastEQ = &H2

Const adSeekAfterEQ = &H4

Const adSeekAfter = &H8

Const adSeekBeforeEQ = &H10

Const adSeekBefore = &H20

'---- ADCPROP_UPDATECRITERIA_ENUM Values ----

Const adCriteriaKey = 0

Const adCriteriaAllCols = 1

Const adCriteriaUpdCols = 2

Const adCriteriaTimeStamp = 3

'---- ADCPROP_ASYNCTHREADPRIORITY_ENUM Values ----

Const adPriorityLowest = 1

Const adPriorityBelowNormal = 2

Const adPriorityNormal = 3

Const adPriorityAboveNormal = 4

Const adPriorityHighest = 5

'---- ADCPROP_AUTORECALC_ENUM Values ----

Const adRecalcUpFront = 0

Const adRecalcAlways = 1

'---- ADCPROP_UPDATERESYNC_ENUM Values ----

'---- ADCPROP_UPDATERESYNC_ENUM Values ----

'---- MoveRecordOptionsEnum Values ----

Const adMoveUnspecified = -1

Const adMoveOverWrite = 1

Const adMoveDontUpdateLinks = 2

Const adMoveAllowEmulation = 4

'---- CopyRecordOptionsEnum Values ----

Const adCopyUnspecified = -1

Const adCopyOverWrite = 1

Const adCopyAllowEmulation = 4

Const adCopyNonRecursive = 2

'---- StreamTypeEnum Values ----

Const adTypeBinary = 1

Const adTypeText = 2

'---- LineSeparatorEnum Values ----

Const adLF = 10

Const adCR = 13

Const adCRLF = -1

'---- StreamOpenOptionsEnum Values ----

Const adOpenStreamUnspecified = -1

Const adOpenStreamAsync = 1

Const adOpenStreamFromRecord = 4

'---- StreamWriteEnum Values ----

Const adWriteChar = 0

Const adWriteLine = 1

'---- SaveOptionsEnum Values ----

Const adSaveCreateNotExist = 1

Const adSaveCreateOverWrite = 2

'---- FieldEnum Values ----

Const adDefaultStream = -1

Const adRecordURL = -2

'---- StreamReadEnum Values ----

Const adReadAll = -1

Const adReadLine = -2

'---- RecordTypeEnum Values ----

Const adSimpleRecord = 0

Const adCollectionRecord = 1

Const adStructDoc = 2

%>

 

 

adojavas.inc

Adojavas.inc 파일 내용은 다음과 같다 . 파일로 필요하다면 아래 내용을 복사한 후 adojavas.inc 이름으로 저장하기 바란다 :

<%

//--------------------------------------------------------------------

// Microsoft ADO

//

// Copyright (c) 1996-1998 Microsoft Corporation.

//

//

//

// ADO constants include file for JavaScript

//

//--------------------------------------------------------------------

//---- CursorTypeEnum Values ----

var adOpenForwardOnly = 0;

var adOpenKeyset = 1;

var adOpenDynamic = 2;

var adOpenStatic = 3;

//---- CursorOptionEnum Values ----

var adHoldRecords = 0x00000100;

var adMovePrevious = 0x00000200;

var adAddNew = 0x01000400;

var adDelete = 0x01000800;

var adUpdate = 0x01008000;

var adBookmark = 0x00002000;

var adApproxPosition = 0x00004000;

var adUpdateBatch = 0x00010000;

var adResync = 0x00020000;

var adNotify = 0x00040000;

var adFind = 0x00080000;

var adSeek = 0x00400000;

var adIndex = 0x00800000;

//---- LockTypeEnum Values ----

var adLockReadOnly = 1;

var adLockPessimistic = 2;

var adLockOptimistic = 3;

var adLockBatchOptimistic = 4;

//---- ExecuteOptionEnum Values ----

var adAsyncExecute = 0x00000010;

var adAsyncFetch = 0x00000020;

var adAsyncFetchNonBlocking = 0x00000040;

var adExecuteNoRecords = 0x00000080;

var adExecuteStream = 0x00000400;

//---- ConnectOptionEnum Values ----

var adAsyncConnect = 0x00000010;

//---- ObjectStateEnum Values ----

var adStateClosed = 0x00000000;

var adStateOpen = 0x00000001;

var adStateConnecting = 0x00000002;

var adStateExecuting = 0x00000004;

var adStateFetching = 0x00000008;

//---- CursorLocationEnum Values ----

var adUseServer = 2;

var adUseClient = 3;

//---- DataTypeEnum Values ----

var adEmpty = 0;

var adTinyInt = 16;

var adSmallInt = 2;

var adInteger = 3;

var adBigInt = 20;

var adUnsignedTinyInt = 17;

var adUnsignedSmallInt = 18;

var adUnsignedInt = 19;

var adUnsignedBigInt = 21;

var adSingle = 4;

var adDouble = 5;

var adCurrency = 6;

var adDecimal = 14;

var adNumeric = 131;

var adBoolean = 11;

var adError = 10;

var adUserDefined = 132;

var adVariant = 12;

var adIDispatch = 9;

var adIUnknown = 13;

var adGUID = 72;

var adDate = 7;

var adDBDate = 133;

var adDBTime = 134;

var adDBTimeStamp = 135;

var adBSTR = 8;

var adChar = 129;

var adVarChar = 200;

var adLongVarChar = 201;

var adWChar = 130;

var adVarWChar = 202;

var adLongVarWChar = 203;

var adBinary = 128;

var adVarBinary = 204;

var adLongVarBinary = 205;

var adChapter = 136;

var adFileTime = 64;

var adPropVariant = 138;

var adVarNumeric = 139;

var adArray = 0x2000;

//---- FieldAttributeEnum Values ----

var adFldMayDefer = 0x00000002;

var adFldUpdatable = 0x00000004;

var adFldUnknownUpdatable = 0x00000008;

var adFldFixed = 0x00000010;

var adFldIsNullable = 0x00000020;

var adFldMayBeNull = 0x00000040;

var adFldLong = 0x00000080;

var adFldRowID = 0x00000100;

var adFldRowVersion = 0x00000200;

var adFldCacheDeferred = 0x00001000;

var adFldIsChapter = 0x00002000;

var adFldNegativeScale = 0x00004000;

var adFldKeyColumn = 0x00008000;

var adFldIsRowURL = 0x00010000;

var adFldIsDefaultStream = 0x00020000;

var adFldIsCollection = 0x00040000;

//---- EditModeEnum Values ----

var adEditNone = 0x0000;

var adEditInProgress = 0x0001;

var adEditAdd = 0x0002;

var adEditDelete = 0x0004;

//---- RecordStatusEnum Values ----

var adRecOK = 0x0000000;

var adRecNew = 0x0000001;

var adRecModified = 0x0000002;

var adRecDeleted = 0x0000004;

var adRecUnmodified = 0x0000008;

var adRecInvalid = 0x0000010;

var adRecMultipleChanges = 0x0000040;

var adRecPendingChanges = 0x0000080;

var adRecCanceled = 0x0000100;

var adRecCantRelease = 0x0000400;

var adRecConcurrencyViolation = 0x0000800;

var adRecIntegrityViolation = 0x0001000;

var adRecMaxChangesExceeded = 0x0002000;

var adRecObjectOpen = 0x0004000;

var adRecOutOfMemory = 0x0008000;

var adRecPermissionDenied = 0x0010000;

var adRecSchemaViolation = 0x0020000;

var adRecDBDeleted = 0x0040000;

//---- GetRowsOptionEnum Values ----

var adGetRowsRest = -1;

//---- PositionEnum Values ----

var adPosUnknown = -1;

var adPosBOF = -2;

var adPosEOF = -3;

//---- BookmarkEnum Values ----

var adBookmarkCurrent = 0;

var adBookmarkFirst = 1;

var adBookmarkLast = 2;

//---- MarshalOptionsEnum Values ----

var adMarshalAll = 0;

var adMarshalModifiedOnly = 1;

//---- AffectEnum Values ----

var adAffectCurrent = 1;

var adAffectGroup = 2;

var adAffectAllChapters = 4;

//---- ResyncEnum Values ----

var adResyncUnderlyingValues = 1;

var adResyncAllValues = 2;

//---- CompareEnum Values ----

var adCompareLessThan = 0;

var adCompareEqual = 1;

var adCompareGreaterThan = 2;

var adCompareNotEqual = 3;

var adCompareNotComparable = 4;

//---- FilterGroupEnum Values ----

var adFilterNone = 0;

var adFilterPendingRecords = 1;

var adFilterAffectedRecords = 2;

var adFilterFetchedRecords = 3;

var adFilterConflictingRecords = 5;

//---- SearchDirectionEnum Values ----

var adSearchForward = 1;

var adSearchBackward = -1;

//---- PersistFormatEnum Values ----

var adPersistADTG = 0;

var adPersistXML = 1;

//---- StringFormatEnum Values ----

var adClipString = 2;

//---- ConnectPromptEnum Values ----

var adPromptAlways = 1;

var adPromptComplete = 2;

var adPromptCompleteRequired = 3;

var adPromptNever = 4;

//---- ConnectModeEnum Values ----

var adModeUnknown = 0;

var adModeRead = 1;

var adModeWrite = 2;

var adModeReadWrite = 3;

var adModeShareDenyRead = 4;

var adModeShareDenyWrite = 8;

var adModeShareExclusive = 0xc;

var adModeShareDenyNone = 0x10;

var adModeRecursive = 0x400000;

//---- RecordCreateOptionsEnum Values ----

var adCreateCollection = 0x00002000;

var adCreateStructDoc = 0x80000000;

var adCreateNonCollection = 0x00000000;

var adOpenIfExists = 0x02000000;

var adCreateOverwrite = 0x04000000;

var adFailIfNotExists = -1;

//---- RecordOpenOptionsEnum Values ----

var adOpenRecordUnspecified = -1;

var adOpenOutput = 0x00800000;

var adOpenAsync = 0x00001000;

var adDelayFetchStream = 0x00004000;

var adDelayFetchFields = 0x00008000;

var adOpenExecuteCommand = 0x00010000;

//---- IsolationLevelEnum Values ----

var adXactUnspecified = 0xffffffff;

var adXactChaos = 0x00000010;

var adXactReadUncommitted = 0x00000100;

var adXactBrowse = 0x00000100;

var adXactCursorStability = 0x00001000;

var adXactReadCommitted = 0x00001000;

var adXactRepeatableRead = 0x00010000;

var adXactSerializable = 0x00100000;

var adXactIsolated = 0x00100000;

//---- XactAttributeEnum Values ----

var adXactCommitRetaining = 0x00020000;

var adXactAbortRetaining = 0x00040000;

//---- PropertyAttributesEnum Values ----

var adPropNotSupported = 0x0000;

var adPropRequired = 0x0001;

var adPropOptional = 0x0002;

var adPropRead = 0x0200;

var adPropWrite = 0x0400;

//---- ErrorValueEnum Values ----

var adErrProviderFailed = 0xbb8;

var adErrInvalidArgument = 0xbb9;

var adErrOpeningFile = 0xbba;

var adErrReadFile = 0xbbb;

var adErrWriteFile = 0xbbc;

var adErrNoCurrentRecord = 0xbcd;

var adErrIllegalOperation = 0xc93;

var adErrCantChangeProvider = 0xc94;

var adErrInTransaction = 0xcae;

var adErrFeatureNotAvailable = 0xcb3;

var adErrItemNotFound = 0xcc1;

var adErrObjectInCollection = 0xd27;

var adErrObjectNotSet = 0xd5c;

var adErrDataConversion = 0xd5d;

var adErrObjectClosed = 0xe78;

var adErrObjectOpen = 0xe79;

var adErrProviderNotFound = 0xe7a;

var adErrBoundToCommand = 0xe7b;

var adErrInvalidParamInfo = 0xe7c;

var adErrInvalidConnection = 0xe7d;

var adErrNotReentrant = 0xe7e;

var adErrStillExecuting = 0xe7f;

var adErrOperationCancelled = 0xe80;

var adErrStillConnecting = 0xe81;

var adErrInvalidTransaction = 0xe82;

var adErrUnsafeOperation = 0xe84;

var adwrnSecurityDialog = 0xe85;

var adwrnSecurityDialogHeader = 0xe86;

var adErrIntegrityViolation = 0xe87;

var adErrPermissionDenied = 0xe88;

var adErrDataOverflow = 0xe89;

var adErrSchemaViolation = 0xe8a;

var adErrSignMismatch = 0xe8b;

var adErrCantConvertvalue = 0xe8c;

var adErrCantCreate = 0xe8d;

var adErrColumnNotOnThisRow = 0xe8e;

var adErrURLIntegrViolSetColumns = 0xe8f;

var adErrURLDoesNotExist = 0xe8f;

var adErrTreePermissionDenied = 0xe90;

var adErrInvalidURL = 0xe91;

var adErrResourceLocked = 0xe92;

var adErrResourceExists = 0xe93;

var adErrCannotComplete = 0xe94;

var adErrVolumeNotFound = 0xe95;

var adErrOutOfSpace = 0xe96;

var adErrResourceOutOfScope = 0xe97;

var adErrUnavailable = 0xe98;

var adErrURLNamedRowDoesNotExist = 0xe99;

var adErrDelResOutOfScope = 0xe9a;

var adErrPropInvalidColumn = 0xe9b;

var adErrPropInvalidOption = 0xe9c;

var adErrPropInvalidValue = 0xe9d;

var adErrPropConflicting = 0xe9e;

var adErrPropNotAllSettable = 0xe9f;

var adErrPropNotSet = 0xea0;

var adErrPropNotSettable = 0xea1;

var adErrPropNotSupported = 0xea2;

var adErrCatalogNotSet = 0xea3;

var adErrCantChangeConnection = 0xea4;

var adErrFieldsUpdateFailed = 0xea5;

var adErrDenyNotSupported = 0xea6;

var adErrDenyTypeNotSupported = 0xea7;

//---- ParameterAttributesEnum Values ----

var adParamSigned = 0x0010;

var adParamNullable = 0x0040;

var adParamLong = 0x0080;

//---- ParameterDirectionEnum Values ----

var adParamUnknown = 0x0000;

var adParamInput = 0x0001;

var adParamOutput = 0x0002;

var adParamInputOutput = 0x0003;

var adParamReturnValue = 0x0004;

//---- CommandTypeEnum Values ----

var adCmdUnknown = 0x0008;

var adCmdText = 0x0001;

var adCmdTable = 0x0002;

var adCmdStoredProc = 0x0004;

var adCmdFile = 0x0100;

var adCmdTableDirect = 0x0200;

//---- EventStatusEnum Values ----

var adStatusOK = 0x0000001;

var adStatusErrorsOccurred = 0x0000002;

var adStatusCantDeny = 0x0000003;

var adStatusCancel = 0x0000004;

var adStatusUnwantedEvent = 0x0000005;

//---- EventReasonEnum Values ----

var adRsnAddNew = 1;

var adRsnDelete = 2;

var adRsnUpdate = 3;

var adRsnUndoUpdate = 4;

var adRsnUndoAddNew = 5;

var adRsnUndoDelete = 6;

var adRsnRequery = 7;

var adRsnResynch = 8;

var adRsnClose = 9;

var adRsnMove = 10;

var adRsnFirstChange = 11;

var adRsnMoveFirst = 12;

var adRsnMoveNext = 13;

var adRsnMovePrevious = 14;

var adRsnMoveLast = 15;

//---- SchemaEnum Values ----

var adSchemaProviderSpecific = -1;

var adSchemaAsserts = 0;

var adSchemaCatalogs = 1;

var adSchemaCharacterSets = 2;

var adSchemaCollations = 3;

var adSchemaColumns = 4;

var adSchemaCheckConstraints = 5;

var adSchemaConstraintColumnUsage = 6;

var adSchemaConstraintTableUsage = 7;

var adSchemaKeyColumnUsage = 8;

var adSchemaReferentialConstraints = 9;

var adSchemaTableConstraints = 10;

var adSchemaColumnsDomainUsage = 11;

var adSchemaIndexes = 12;

var adSchemaColumnPrivileges = 13;

var adSchemaTablePrivileges = 14;

var adSchemaUsagePrivileges = 15;

var adSchemaProcedures = 16;

var adSchemaSchemata = 17;

var adSchemaSQLLanguages = 18;

var adSchemaStatistics = 19;

var adSchemaTables = 20;

var adSchemaTranslations = 21;

var adSchemaProviderTypes = 22;

var adSchemaViews = 23;

var adSchemaViewColumnUsage = 24;

var adSchemaViewTableUsage = 25;

var adSchemaProcedureParameters = 26;

var adSchemaForeignKeys = 27;

var adSchemaPrimaryKeys = 28;

var adSchemaProcedureColumns = 29;

var adSchemaDBInfoKeywords = 30;

var adSchemaDBInfoLiterals = 31;

var adSchemaCubes = 32;

var adSchemaDimensions = 33;

var adSchemaHierarchies = 34;

var adSchemaLevels = 35;

var adSchemaMeasures = 36;

var adSchemaProperties = 37;

var adSchemaMembers = 38;

var adSchemaTrustees = 39;

var adSchemaFunctions = 40;

var adSchemaActions = 41;

var adSchemaCommands = 42;

var adSchemaSets = 43;

//---- FieldStatusEnum Values ----

var adFieldOK = 0;

var adFieldCantConvertValue = 2;

var adFieldIsNull = 3;

var adFieldTruncated = 4;

var adFieldSignMismatch = 5;

var adFieldDataOverflow = 6;

var adFieldCantCreate = 7;

var adFieldUnavailable = 8;

var adFieldPermissionDenied = 9;

var adFieldIntegrityViolation = 10;

var adFieldSchemaViolation = 11;

var adFieldBadStatus = 12;

var adFieldDefault = 13;

var adFieldIgnore = 15;

var adFieldDoesNotExist = 16;

var adFieldInvalidURL = 17;

var adFieldResourceLocked = 18;

var adFieldResourceExists = 19;

var adFieldCannotComplete = 20;

var adFieldVolumeNotFound = 21;

var adFieldOutOfSpace = 22;

var adFieldCannotDeleteSource = 23;

var adFieldReadOnly = 24;

var adFieldResourceOutOfScope = 25;

var adFieldAlreadyExists = 26;

var adFieldPendingInsert = 0x10000;

var adFieldPendingDelete = 0x20000;

var adFieldPendingChange = 0x40000;

var adFieldPendingUnknown = 0x80000;

var adFieldPendingUnknownDelete = 0x100000;

//---- SeekEnum Values ----

var adSeekFirstEQ = 0x1;

var adSeekLastEQ = 0x2;

var adSeekAfterEQ = 0x4;

var adSeekAfter = 0x8;

var adSeekBeforeEQ = 0x10;

var adSeekBefore = 0x20;

//---- ADCPROP_UPDATECRITERIA_ENUM Values ----

var adCriteriaKey = 0;

var adCriteriaAllCols = 1;

var adCriteriaUpdCols = 2;

var adCriteriaTimeStamp = 3;

//---- ADCPROP_ASYNCTHREADPRIORITY_ENUM Values ----

var adPriorityLowest = 1;

var adPriorityBelowNormal = 2;

var adPriorityNormal = 3;

var adPriorityAboveNormal = 4;

var adPriorityHighest = 5;

//---- ADCPROP_AUTORECALC_ENUM Values ----

var adRecalcUpFront = 0;

var adRecalcAlways = 1;

//---- ADCPROP_UPDATERESYNC_ENUM Values ----

//---- ADCPROP_UPDATERESYNC_ENUM Values ----

//---- MoveRecordOptionsEnum Values ----

var adMoveUnspecified = -1;

var adMoveOverWrite = 1;

var adMoveDontUpdateLinks = 2;

var adMoveAllowEmulation = 4;

//---- CopyRecordOptionsEnum Values ----

var adCopyUnspecified = -1;

var adCopyOverWrite = 1;

var adCopyAllowEmulation = 4;

var adCopyNonRecursive = 2;

//---- StreamTypeEnum Values ----

var adTypeBinary = 1;

var adTypeText = 2;

//---- LineSeparatorEnum Values ----

var adLF = 10;

var adCR = 13;

var adCRLF = -1;

//---- StreamOpenOptionsEnum Values ----

var adOpenStreamUnspecified = -1;

var adOpenStreamAsync = 1;

var adOpenStreamFromRecord = 4;

//---- StreamWriteEnum Values ----

var adWriteChar = 0;

var adWriteLine = 1;

//---- SaveOptionsEnum Values ----

var adSaveCreateNotExist = 1;

var adSaveCreateOverWrite = 2;

//---- FieldEnum Values ----

var adDefaultStream = -1;

var adRecordURL = -2;

//---- StreamReadEnum Values ----

var adReadAll = -1;

var adReadLine = -2;

//---- RecordTypeEnum Values ----

var adSimpleRecord = 0;

var adCollectionRecord = 1;

var adStructDoc = 2;

%>

 

Adovbs.inc 파일을 사용하는 방법은 아주 간단하다 . 일반 인클루드 파일 삽입하듯 삽입하면 된다 .

<!-- #include file="adovbs.inc" -->

일단 Adovbs.inc 파일을 인클루드 시켰다면 ad 로 시작하는 상수 이름들을 사용할 수 있을 것이다 .

많은 개발자들 중에 adOpenForwardOnly 커서 사용하는 것을 싫어하는 사람들이 있다 . 이는 앞에서 뒤로 한 방향으로만 움직일 수 있는 커서이기 때문이다 . 이런 속성은 레코드셋의 전체 카운트를 셀 때 필요한 RecordCount 속성을 사용할 수 없게 하므로 불편하다고 생각하기 때문이다 .

이런 이유로 일부 개발자들은 모든 레코드셋을 adOpenDynamic 또는 adOpenStatic 으로 여는 사람들이 있다 . 하지만 이것은 좋은 생각이 아니다 . 왜냐하면 Foward-only 커서의 성능이 가장 좋기 때문이다 .

우리는 이번 강좌를 통해 가급적 특별한 경우를 제외하고는 adOpenForwardOnly 커서와 adReadOnly 락타입을 사용하는 것이 좋으며 레코드셋 객체를 생성할 때는 명시적으로 생성하는 것이 좋다는 것을 배웠다 .

어떤 커서와 락타입의 성능이 가장 좋은지에 대해서는 다음 장에 결과를 올려 놓았다 . 참조하기 바란다 .

  • 커서와 락타입의 성능 분석 결과

컴퓨터 스펙 :

  • Pentium II - 450 MHz
  • Windows NT Server 4, SP3
  • 256 MB RAM
  • 8 GB SCSI HD

로컬에 위치한 SQL 서버  7.0 데이터베이스를 이용하여 테스트는 진행되었다 . 사용된 데이터베이스에는 하나의 테이블이 존재한다 . 이 테이블은 다음과 같은 SQL 문을 이용하여 생성된 10,000 개의 레코드로 구성되어 있다 :
 

DECLARE @LOOP int
SELECT @LOOP = 0
SET NOCOUNT ON
WHILE @LOOP < 10000
BEGIN
    insert into tblStresstest(Name,Age,SSN,IsMale)
    SELECT 'Test Name',@LOOP/1000,@LOOP,1
    SELECT @LOOP = @LOOP + 1
END
SET NOCOUNT OFF

ID 필드에는 클러스트 되지 않은 프라이머리 키 제약이 걸려 있고 , SSN 필드에는 유니크 (UNIQUE) 제약이 걸려 있다 . 이 테이블에서는 int, varchar, char, tinyint, datetime, bit 등의 다양한 데이터 타입을 사용하였다 . 또한 System DSN 을 이용하여 데이터베이스에 접속하는 환경이며 다양한 쿼리 (query) 를 실행하기 위해 비주얼 베이직 6.0 을 사용하였다 . ADO 의 버전은 2.1 이다 .

데이터베이스에 사용된 SQL 문은 다음과 같다 :

strSQL = S ELECT * FROM tblStressTest

또한 비주얼 베이직 애플리케이션에서 다음과 같은 명령을 실행하여 테스트를 하였다 :

For iCount = 1 To 5
    objRS.Open strSQL, objConn, adOpenForwardOnly, adLockPessimistic
    Do While Not objRS.EOF
        objRS.MoveNext
     Loop
    objRS.Close
Next iCount

( 물론 커서 타입과 락타입 (locktype) 은 매번 실행될 때마다 변경된다 .) adLockReadOnly, adLockOptimistic, adLockPessimistic 락타입에 대해 각각의 커서 타입 당 10 회를 실행시켜 그 평균 값을 다음과 같이 구하였다 .

댓글 없음:

댓글 쓰기