2010년 1월 22일 금요일

ASP 같은 이름의 입력폼명을 사용할때

[send.asp]

 <input type="text" id="text1" name="text" value="abc">

 <input type="text" id="text2" name="text" value="def">

 <input type="text" id="text3" name="text" value="ghi">

  ...

 

 

[receive.asp]

수신페이지에서

   text    = trim(request("text"))

   arrText =  split(text, ",")

 

   for i=0 to ubound(arrText) step 1

      response.write "i : " & arrText(i) & "<br>"

   next

   ...

 

 

위와 같이  사용하면 편리하나

입력 값이 "," 가 들어간 경우 처리가 힘든 상황이 된다.

 

이럴경우

 

[receive.asp]

 

   dim arrTexts()

   for i=1 to request("arrText").count  '//*,**

      Redim Preserve arrTexts(i-1)     '//Redim은 배열 재정의하나 앞의 값들이 초기화됨, 따라서 옵션 Preserve  추가

      arrTexts(i-1) = request("arrText")(i)

   next

 

위와같이 사용

 

* count : 컬렉션이나 Dictionary 개체의 항목 수를 반환.

** ubound : 지정한 배열 차원에 사용할 수 있는 가장 큰 첨자를 반환.

*** Redim 프로시저 수준에서 동적 배열 변수를 선언하고 저장 공간을 할당하거나 다시 할당.

**** 마지막 차원의 크기를 바꿀 경우 기존 배열 안에 있는 데이터를 보존.

 

출처 : kimmogoon

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 회를 실행시켜 그 평균 값을 다음과 같이 구하였다 .

2010년 1월 11일 월요일

도스(DOS) 배치 파일을 쉘 스크립트로 변환

부록 G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환

아주 많은 프로그래머들은 PC 위에서 도는 도스에서 스크립트를 배웠습니다. 기능이 조금 떨어지는 도스 배치 파일 언어로도 꽤 강력한 스크립트나 어플리케이션을 작성할 수도 있지만 그렇게 하려면 아주 해박한 지식을 사용해 해결책을 찾거나 꽁수를 부려야 합니다. 가끔은 오래된 도스용 배치 파일을 유닉스 쉘 스크립트로 변환해서 써야될 경우가 생기지만 이렇게 하는것이 그렇게 어렵지만은 않습니다. 왜냐하면 도스 배치 파일 연산자들이 기능이 동일한 쉘 스크립트 연산자의 서브셋에 불과하기 때문입니다.

표 G-1. 배치 파일 키워드/변수/연산자 와 그에 해당하는 쉘 동의어

배치 파일 연산자 쉘 스크립트 동의어
% $ 명령어줄 매개변수 접두사
/ - 명령어 옵션 플래그
\ / 디렉토리 패스 구분자
== = (같음) 문자열 비교 테스트
!==! != (다름) 문자열 비교 테스트
| | 파이프
@ set +v 현재 명령어를 에코하지 말 것
* * 파일명 "와일드 카드"
> > 파일 재지향(덮어 쓰기)
>> >> 파일 재지향(덧붙여 쓰기)
< < 표준입력 재지향
%VAR% $VAR 환경 변수
REM # 주석
NOT ! 뒤에 나오는 테스트 부정
NUL /dev/null 명령어 출력을 없애기 위한 "블랙홀"
ECHO echo 에코 (Bash 에는 옵션이 많이 있음)
ECHO. echo 빈 줄 에코
ECHO OFF set +v 다음에 나오는 명령어를 에코하지 말 것
FOR %%VAR IN (LIST) DO for var in [list]; do "for" 루프
:LABEL 없음 (필요치 않음) 라벨
GOTO 없음 (대신 함수를 씀) 스크립트의 다른 곳으로 건너 뜀
PAUSE sleep 일정 간격을 두고 잠시 대기
CHOICE case 나 select 메뉴 선택
IF if if-test
IF EXIST FILENAME if [ -e filename ] 파일이 존재하는지 확인
IF !%N==! if [ -z "$N" ] 변경가능한 매개변수인 "N"이 없다면
CALL source 나 . (도트 연산자) 다른 스크립트를 "포함"
COMMAND /C source 나 . (도트 연산자) 다른 스크립트를 "포함"(CALL과 동일)
SET export 환경 변수를 세트
SHIFT shift 명령어줄 변수 목록을 왼쪽으로 이동(shift)
SGN -lt or -gt (정수) 부호(sign)
ERRORLEVEL $? 종료 상태
CON stdin "콘솔"(표준입력)
PRN /dev/lp0 (일반적인) 프린터 디바이스
LP1 /dev/lp0 첫번째 프린터 디바이스
COM1 /dev/ttyS0 첫번째 시리얼 포트

배치 파일은 대개 도스 명령어를 갖고 있습니다. 도스용 배치 파일이 쉘 스크립트로 변환되기 위해서는 이 명령어들은 꼭 동일한 유닉스 명령어로 변환되어야 합니다.

표 G-2. 도스 명령어와 동일한 유닉스 명령어

도스 명령어 동일한 유닉스 명령어 효과
ASSIGN ln 파일이나 디렉토리를 링크
ATTRIB chmod 파일 퍼미션 변경
CD cd 디렉토리 변경
CHDIR cd 디렉토리 변경
CLS clear 스크린 지우기
COMP cmp or diff 파일 비교
COPY cp 파일 복사
Ctl-C Ctl-C 정지(시그널)
Ctl-Z Ctl-D EOF (end-of-file)
DEL rm 파일 삭제
DELTREE rm -rf 디렉토리의 하위 디렉토리까지 포함해서 삭제
DIR ls -l 디렉토리 보이기
ERASE rm 파일 삭제
EXIT exit 현재 프로세스 종료
FC comm, cmp 파일 비교
FIND grep 파일안에서 문자열 찾기
MD mkdir 디렉토리 생성
MKDIR mkdir 디렉토리 생성
MORE more 텍스트 파일 쪽단위(paging) 필터
MOVE mv 이동
PATH $PATH 실행파일들의 경로
REN mv 이름 바꾸기(이동)
RENAME mv 이름 바꾸기(이동)
RD rmdir 디렉토리 삭제
RMDIR rmdir 디렉토리 삭제
SORT sort 파일 정렬
TIME date 시스템 시간 보여주기
TYPE cat 파일을 표준출력으로 출력
XCOPY cp (확장) 파일 복사

참고: 사실 모든 유닉스, 쉘 연산자, 명령어들은 그들과 동일한 도스용보다 많은 옵션과 강력한 기능을 갖고 있습니다. 많은 배치 파일 스크립트들은 read의 불완전한 버전인 ask.com같은 외부 유틸리티에 의존합니다.

도스는 파일명 와일드 카드 확장에 대해서 오직 *? 문자만을 인식하는 제한되고 부족한 서브셋을 지원합니다.

도스 배치 파일을 쉘 스크립트로 변환하는 것은 일반적으로 매우 간단하고 가끔은 변환된 쉘 스크립트가 원래 도스 배치 파일보다 더 이해하기 쉬운 경우도 있습니다.

예 G-1. VIEWDATA.BAT: 도스용 배치 파일

REM VIEWDATA

REM PAUL SOMERSON의 "DOS POWERTOOLS"의 예제에서 영감을 받아 작성


@ECHO OFF

IF !%1==! GOTO VIEWDATA
REM  명령어줄 인자가 없다면...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  문자열이 일치하는 줄을 출력후 종료.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  한 번에 한 쪽씩 전체 파일을 보여줌.

:EXIT0

스크립트 변환을 하면 기능이 다소 개량됩니다.

예 G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

#!/bin/bash
# VIEWDATA.BAT 를 쉘 스크립트로 변환.

DATAFILE=/home/bozo/datafiles/book-collection.data
ARGNO=1

# @ECHO OFF       여기서 이 명령어는 필요없습니다.

if [ $# -lt "$ARGNO" ]    # IF !%1==! GOTO VIEWDATA
then
  less $DATAFILE          # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
else
  grep "$1" $DATAFILE     # FIND "%1" C:\MYDIR\BOOKLIST.TXT
fi  

exit 0                    # :EXIT0

# GOTO, 라벨, 속임수, 엉터리 구문등이 필요없어졌죠.
# 원래 배치 파일보다 더 짧고, 더 쉽고, 더 깔끔합니다.

Ted Davis 의 Shell Scripts on the PC 사이트에서는 구식 배치 파일 프로그래밍에 대한 포괄적인 튜토리얼을 소개하고 있습니다. 생각건대, 그의 독창적인 몇몇 테크닉들은 쉘 스크립트와 연관성이 있습니다.

 

출처 : http://kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/dosbatch.html