UDA(Universal Data Access)는 여러 기업 환경의 정보에 접근하는 방법을 제공하기 위한 마이크로소프트의 전략이다. UDA는 다양한 정보 소스에 빠르게 접근할 수 있으며, 관계형 또는 비 관계형 데이터베이스를 모두 접근할 수 있다. 그리고 개발 툴과 개발 언어에 비 독립적이면서도 쉽게 인터페이스를 프로그래밍할 수 있도록 지원한다. 이 기술은 다양한 데이터 소스에 접근할 수 있으며, 쉽게 유지보수할 수 있는 솔루션을 제공하며, 개발 툴, 어플리케이션, 플랫폼 모두에 최상의 선택이 될 것이다.
UDA는 데이터 소스간의 이동에 소요되었던 많은 비용과 시간을 줄여주며, ODBC, RDO, DAO를 포함하는 차기 표준 인터페이스로 예상되고 있다.
MDAC(Microsoft Data Access Components)는 UDA를 지원하며, ADO(ActiveX Data Objects), Remote Data Service(RDS), OLE DB, ODBC(Open Database Connectivity) 그리고 OLE DB for OLAP을 포함하고 있다.
MDAC은 버전 1.0에서 시작하여 1.5, 2.0, 2.1 그리고 2.5 버전까지 발전되어 왔다. MDAC 1.0은 ODBC 3.0, ADO 1.0, ADC(Advanced Data Connector) 1.0 그리고 OLE DB 1.0을 포함하고 있었으며, 1996년에 발표되었다.
MDAC 1.5는 ODBC 3.5, ADO 1.0, OLE DB 1.5 그리고 RDS(Remote Data Service) 1.5를 포함하고 있었으며, 97년에 발표되었으며, 여러 번의 Minor 업그레이드(MDAC 1.5, MDAC 1.5a, MDAC 1.5b, MDAC 1.5c, MDAC 1.5d)를 거쳐왔다.
MDAC 2.0은 ODBC 3.51, OLE DB 2.0, ADO 2.0, RDS 2.0 그리고 OLE DB for OLAP을 포함하고 있었으며, 98년 말에 발표되었다. MDAC 2.0은 비주얼 스튜디오 6의 2번 CD에 포함되어져 있다. MDAC 2.1은 MDAC 2.0의 기능을 보안하여서 발표되었으며, MS SQL 서버 7.0에 포함되어져 있다.
MDAC을 사용할 때 주의해야 될 점은 MDAC을 포함하고 있는 프로그램을 설치하고 나면 MDAC의 버전이 변경되기 때문에 최신 버전의 MDAC으로 환경을 보전해 주어야 한다. 예를 들어, 비주얼 스튜디오 6.0을 설치했다면 MDAC은 2.0으로 변경된다. 그렇기 때문에 비주얼 스튜디오 6.0을 설치한 후에 다시 MDAC 2.1을 설치해 주어야 최신 버전의 MDAC을 사용할 수 있다.
Windows NT 4.0에서 옵션 팩을 다시 설치했다면 MDAC은 1.5로 변경된다. 이럴 경우에도 역시 MDAC 2.1을 다시 설치해야 한다.
MDAC 2.5는 99년 말에 Windows 2000과 함께 발표될 예정이며, MDAC 2.5는 Windows 2000의 시스템 레벨의 구성요소로 만들어졌다. 그렇기 때문에 Windows 2000에서는 MDAC을 별도로 설치할 필요 없이 Windows 2000 운영체제를 설치할 때 함께 설치하면 된다. 그리고 현재 MDAC 2.5에 대한 모습을 보려면 Windows 2000 베타 3를 설치해서 사용하면 된다.
그러면 MDAC에 포함된 5가지 구성요소에 대해서 간략하게 살펴본다.
ODBC - Open Database Connectivity의 약어로서, MS SQL 서버, 오라클(Oracle),인포믹스(Informix), 사이베이스(Sybase), DB2 등의 관계형 데이터베이스에 접속하기 위한 인터페이스 규격이다. ODBC는 마이크로소프트에 의해서 제안되었으며, 현재로서는 대부분의 관계형 데이터베이스의 표준 인터페이스로 사용되고 있다. ODBC에 대응하는 것으로 IBM, 노벨(Novell), 워드 퍼펙 등과 같은 회사들이 연합하여 정의한 데이터베이스 인터페이스로는 IDAPI(Integrated Database Application Programming Interface)가 있다.
ADO - ActiveX Data Object의 약어로서, 기존의 DAO(Data Access Object)와 RDO(Remote Data Object)를 대체하는 데이터 접속 개체이다. ADO에 대한 자세한 내용은 이 장의 2절에서 다루고 있다.
OLE DB - Object Linking & Embedding Database의 약어로서, ODBC를 대체하는 기술로 부각되고 있는 마이크로소프트의 기술이다. OLE DB에 대한 자세한 내용은 이 장의 3절에서 다루고 있다.
RDS - Remote Data Service의 약어로서, 웹 환경에서 데이터베이스를 조작하기 위한 마이크로소프트의 기술인 ADC(Advanced Database Connector)의 다음 버전이다. RDS에 대한 자세한 내용은 제 6부 User Interface 프로그래밍에서 다루고 있다.
OLEDB for OLAP - Object Linking & Embedding Database for On Line Analytic Processing의 약어로서, MS SQL 서버의 일부인 Decision Support Service(코드명 Plato, OLAP Server)의 데이터를 조작하기 위한 기술이다.
ActiveX Data Object
ActiveX Data Object(ADO)는 마이크로소프트의 새로운 데이터 접속 개체로서 대부분의 데이터 형태를 접속해서 처리할 수 있도록 지원하고 있다. ADO는 로컬 데이터베이스 처리에 주로 사용된 DAO (Data Access Object)와 관계형 데이터베이스 처리에 주로 사용된 RDO(Remote Data Object)의 대부분의 기능을 지원하고 있으며, 기존의 데이터 관련 개체에서 지원하지 못하던 새로운 기능들도 추가로 지원하고 있다.
ADO는 MDAC(Microsoft Data Access Component)에 포함되어져서 배포되며, 비주얼 베이직 6에는 기본으로 ADO 1.5가 탑재되어 배포된다. ADO 1.0 버전은 RDO의 부분 기능만을 지원했으며, 주로 웹 프로그래머들에 의해서 사용되었다. 대부분의 웹 프로그래머들은 CGI(Common Gateway Interface)나 PERL(Practical Extraction and Report Language)을 이용해서 데이터베이스 관련 기능을 처리했으며, 일부 마이크로소프트의 SQL 서버를 사용하는 웹 개발자들은 IDC(Internet Database Connector)를 사용해서 데이터베이스를 처리했다. 하지만, IDC의 기능이 미비해서 웹 어플리케이션을 개발하는데 어려움이 많았으며, 이런 상황에서 ADO의 출현은 웹 프로그래머들에게 희소식이었다. 이렇게 ADO는 웹 개발자들에 의해서 처음 사용되어져 왔으며, ADO 1.5 버전은 DAO와 RDO의 대부분의 기능을 지원하게 되었고, 비주얼 스튜디오 6에 포함되었다. DAO와 RDO의 기능에 새로운 기능을 추가한 ADO 2.0은 98년 말에 발표되었으며, 마이크로소프트 SQL 서버 7.0에 포함되었다. 그리고 2000년 2월에 발표된 Windows 2000에 포함된 ADO 2.5는 Record와 Stream이라는 새로운 개체를 추가해서 새로운 모습으로 발표되었다.
[그림] ADO와 DAO/RDO 구조의 비교
ADO는 기존의 데이터 관련 개체에 비해서 다음과 같은 장점들을 가지고 있다.
적은 메모리를 요구하기 때문에 서버의 자원을 적게 사용한다.
인터넷과 인트라넷을 통한 데이터 접근에 최적화 되도록 구현되었기 때문에 네트워크에 부하를 적게 준다.
ADO를 이용하면 DAO나 RDO 보다는 간단하게 어플리케이션을 구축할 수 있다. 이유는 DAO나 RDO 는 계층적 구조로 이루어진 반면에 ADO는 내부의 개체들이 각각 독립적으로 존재하기 때문에 다른 개체와의 연결 없이도 데이터를 처리할 수 있기 때문이다. 하지만, 그런 ADO의 구조로 인해 적절한 방법을 선택해서 어플리케이션을 구축하기 위해서는 많은 노력과 지식이 필요하게 된다.
ADO는 마이크로소프트 비주얼 베이직, 엑티브 서버 페이지(Active Server Pages), 마이크로소프트 비주얼 C++, 마이크로소프트 엑세스(Access), 마이크로소프트 엑셀(Excel), 마이크로소프트 워드(Word) 그리고 ADO와 OLE DB를 지원하는 여러 개발 환경에서 사용할 수 있다.
ADO는 확장된 형태의 ADOX와 ADO MD를 지원한다. ADOX는 Data Definition Language와 Security를 처리하는 ADO의 확장된 형태로서 테이블과 저장 프로시저 같은 스키마 개체를 조작하고 개체에 대한 권한을 부여(Grant)하거나 회수(Revoke)한다. 비주얼 베이직과 같은 개발 도구에서 ADOX를 사용하려면 형식 라이브러리를 참조해야 한다. ADOX의 형식 라이브러리는 "Microsoft ADO Ext. for DDL and Security"이며, ADOX 라이브러리 파일 이름은 Msadox.dll이다. 그리고 프로그램 ID (ProgID)는 "ADOX"이다. 다음 그림은 비주얼 베이직 참조 메뉴에서 ADOX를 참조하는 화면이다.
[그림] ADOX 참조 화면
ADO MD의 MD는 Multidimensional Data의 약어이며, ADO MD는 OLAP 데이터와 같은 다차원의 스키마 또는 큐브(Cube)를 조회하거나 결과를 검색하기 위해 사용되는 구성요소이다. ADO MD를 사용하기 위해 OLE DB Provider는 OLAP(On Line Analytic Processing)을 지원하는 Multidimensional Data Provider(MDP)이어야 한다. 비주얼 베이직에서 ADO MD를 사용하려면 ADO MD 형식 라이브러리를 참조해야 한다. ADO MD의 라이브러리 파일 이름은 msadomd.dll이며, 프로그램 ID(ProgID)는 "ADOMD"이다. 다음 그림은 비주얼 베이직 참조 메뉴에서 ADO MD를 참조하는 화면이다.
[그림] ADO MD를 참조하는 화면
ADOX와 ADO MD에 대한 내용은 이 책에서 다루지 않으며, 자세한 정보는 Windows 2000의 Microsoft Platform SDK의 Data Access Services를 참조한다.
ADO 개체 모델
ADO는 DAO나 RDO처럼 계층적 구조를 가지고 있다. 하지만, 각각의 개체들이 독립적으로 존재할 수 있기 때문에 상위 개체인 Connection 개체가 존재하지 않더라도 Recordset 개체만으로도 데이터베이스에 접속해서 테이블의 레코드를 가져올 수 있다. 이런 이유로 인해서 ADO는 랜 환경의 개발자들 보다는 웹 환경의 개발자들에 의해서 먼저 사용되어져 왔다.
ADO의 개체 모델은 다음과 같다.
[그림] ADO 개체 모델
ADO 개체 모델은 개발자들이 데이터에 접근하기 위해서 사용하는 세 가지의 핵심 개체인 Connection, Command, Recordset과 Field, Property, Parameter 등의 개체들로 구성되어져 있으며, ADO 2.5에서 Record 개체와 Stream 개체가 추가되었다.
비주얼 베이직에서 ADO를 사용하기 위해서는 프로젝트 메뉴의 참조(References)에서 Microsoft ActiveX Data Object 2.5 Library (msado15.dll)을 선택해야 한다.
[그림] ADO를 참조하는 화면
비주얼 베이직 프로젝트 메뉴의 참조(References)에서 ADO를 추가했다면, 개체 찾아보기(Object Browser, F2)에서 ADO 개체에 관련된 정보를 볼 수 있을 것이다.
[그림] 개체 찾아보기(Object Browse)
Connection 개체는 ADO의 상위 레벨에 존재하는 개체로서 데이터와의 연결을 제공하는 개체이다.
[그림] Connection 개체
ADO는 DAO나 RDO와는 달리 Connection 개체가 없이 Recordset 개체를 생성할 수도 있지만, 여러 개의 Recordset 개체를 빈번히 사용할 경우에는 하나의 Connection 개체를 생성한 후에 재사용하는 것이 보다 효율적이다. 예를 들어, 웹 환경에서 ADO를 사용할 경우에는 Recordset 개체를 사용해서 직접 데이터베이스에 접속하는 것이 효율적이다. 이유는 Connection 개체를 사용해서 데이터베이스에 연결한 다음에 먼저 생성한 Connection 개체를 통해서 Recordset 개체를 생성하려면 인터넷을 통해서 데이터베이스에 두 번 접속해야 되기 때문이다. 인터넷이라는 환경 때문에 Recordset 개체로 직접 데이터베이스에 접속하는 것이 보다 효율적이다. 그런 반면에 랜 환경에서는 Connection 개체를 먼저 생성하고 생성한 Connection 개체를 통해서 Recordset 개체를 생성하는 것이 보다 더 효율적이다. 이유는 Recordset 개체로 직접 데이터베이스에 접속할 경우에 서버에서는 디폴트 Connection 개체를 자동으로 생성한 다음에 생성한 디폴트 Connection 개체를 통해서 Recordset 개체를 생성하고 디폴트 Connection 개체를 제거하는 작업을 수행한다. 그렇게 되면 서버 측에는 많은 부하가 걸리게 된다. 랜 환경에서는 이런 서버 측의 부하로 인해서 Connection 개체를 생성한 다음 생성한 Connection 개체를 전역 변수로 선언하고 응용 프로그램에서는 생성한 Connection 개체를 사용해서 Recordset 개체를 생성하는 것이 보다 더 효율적이게 된다.
[예제] Connection 개체 생성
새로운 표준 EXE 프로젝트를 시작하고 폼에 CommandButton을 추가한 다음에 다음 코드를 기술한다.
[그림] Connection 개체 생성 폼
Private Sub cmdConnection_Click() Dim adoCn As New ADODB.Connection Dim adoRs As New ADODB.Recordset
위의 코드에서 ADO의 Connection 개체를 사용하기 위해서 변수의 데이터 형식을 ADODB.Connection 이라고 선언했다. 비주얼 베이직에서 ADO에 대한 참조를 프로젝트 메뉴의 참조에서 설정했기 때문에 선언문에서 ADODB를 제외하고 Connection 이라고 선언해도 무관하다. 만약 한 프로젝트 내에서 DAO(Data Access Object)와 ADO(ActiveX Data Object)를 함께 사용하고 있다면 DAO의 Recordset과 ADO의 Recordset의 구별이 모호하기 때문에 ADODB를 반드시 기술해야 하며, 그 외의 경우에는 Connection 만 기술해도 된다.
위의 코드에서 Provider는 사용할 OLD EB Provider를 지정하는 것이며, Data Source는 데이터베이스가 설치된 서버를 지정하는 것이다. (local)은 현재 응용 프로그램이 실행되고 있는 컴퓨터를 가리키는 것이며, 일반적으로 다른 개발자와 공유를 해야 될 필요가 있는 소스는 컴퓨터의 이름보다는 (local)이라고 기술하는 것이 좋다. Initial Catalog는 사용할 데이터베이스를 지정하는 것이며, User ID는 데이터베이스에 접속 권한을 가진 데이터베이스의 사용자 계정을 지정하는 것이다. 마지막으로 Password는 사용자의 암호를 지정하는 것이며, 사용자 계정의 암호가 없다면 지정하지 않아도 무관하다.
Recordset 개체를 여러번 생성해야 될 경우에 Recordset 개체를 생성할 때마다 데이터베이스에 접속하는 것 보다는 하나의 Connection 개체를 생성한 다음에 Recordset 개체의 ActiveConnection 속성에 이미 생성된 Connection 개체를 지정하고 Recordset 개체를 생성하는 것이 보다 효율적이다.
Connection 개체의 속성
속성
설명
기본 값
데이터 형식
Attributes
Connection 개체의 트랜잭션 속성을 읽기, 쓰기할 때 사용 (읽기/쓰기)
0
Long
CommandTimeout
명령어가 결과를 반환할 때까지 대기하는 시간 (초 단위) (읽기/쓰기)
30 초
Long
ConnectionString (디폴트 속성)
데이터 원본에 접속하기 위해서 사용하는 문자열 (읽기/쓰기)
없음
String
ConnectionTimeout
Connection 개체가 데이터에 접속할 때까지 대기하는 시간 (초 단위) (읽기/쓰기)
15 초
Long
CursorLocation
서버 커서(Server-Side Cursor) 또는 클라이언트 커서(Client-Side Cursor)를 지정 (읽기/쓰기)
Provider에 따라 기본 값이 다름, 일반적으로 서버 커서(adUseServer)
CursorLocationEnum
DefaultDatabase
현재 Connection의 기본 데이터베이스를 읽기, 쓰기할 때 사용 (읽기/쓰기)
없음
String
IsolationLevel
현재 Connection에 대한 Isolation Level을 읽기, 쓰기할 때 사용 (읽기/쓰기)
adXactUnspecified
IsolationLevelEnum
Mode
현재 Connection의 접근 권한에 대한 값을 읽기, 쓰기할 때 사용 (읽기/쓰기)
adModeUnknown
ConnectModeEnum
Properties
데이터 Provider에 대한 프로퍼티 개체들의 컬렉션 (읽기 전용)
없음
Properties
Provider
현재의 세션에 대한 OLE DB Provider를 읽기, 쓰기할 때 사용 (읽기/쓰기)
MSDASQL
String
State
현재 Connection의 상태를 반환 (읽기 전용)
adStateClosed
Long
Version
ADO의 버전을 반환 (읽기 전용)
없음
String
Attributes 속성
Attributes 속성은 개체의 트랜잭션 특성을 나타내는 속성이며, Long 타입의 값을 Read/Write 할 수 있다. 이 값은 하나 이상의 XactAttributeEnum(기본값 0)의 합을 가진다.
상수
설명
adXactCommitRetaining
Commit 보류를 수행한다. CommitTrans 수행 후에 자동으로 새로운 트랜잭션이 시작됨을 보장한다.
adXactAbortRetaining
RollBack 보류를 수행한다. RollbackTrans 수행 후에 자동으로 새로운 트랜잭션이 시작됨을 보장한다.
이 속성은 모든 Provider가 지원하는 것은 아니다. 두개의 값을 묶어서 사용할 수 있다. adoCn.Attributes = adXactCommitRetaining And adXactAbortRetaining
[예제]
이 예제는 Connection 개체의 Attributes 속성 값을 나타낸다.
Private Sub cmdAttributes_Click() Dim adoCn As New ADODB.Connection Dim strConn As String
CommandTimeout 속성은 명령(Command)을 실행하는 동안 실행이 제대로 되지 않으면 얼마나 오랫동안 기다렸다가 실행을 중지하고 오류를 발생시킬지를 설정하는 속성이다. 이 값은 Read/Write 가능하며 단위는 초이다. 디폴트 값은 30초 이다. CommandTimeout 속성에 설정된 시간 동안 Execute 메서드의 결과가 반환되지 않으면, ADO는 명령의 실행을 중지시키고 오류를 발생시킨다. 만약 네트워크의 상태가 좋지 않거나 대량의 데이터를 처리하는 작업일 경우에는 이 값을 0으로 설정하면, 명령이 수행될 때까지 무한 대기하게 된다. 하지만, 부득이한 경우를 제외하고는 0으로 설정하는 것은 피하는 것이 좋다. 일반적인 경우에는 디폴트 값(30초)을 사용하는 것이 권장된다.
Connection 개체의 CommandTimeout 속성의 설정 값은 Command 개체의 CommandTimeout 속성 값에 영향을 미치지 못한다. 그 이유는 Connection 개체의 CommandTimeout 속성은 Command 개체의 CommandTimeout 속성에 상속되지 않기 때문이다.
CommandTimeout 속성은 데이터와의 연결이 이루어진 후에도 Read/Write가 가능하다.
[예제]
Private Sub cmdCommandTimeout_Click() Dim adoCn As New ADODB.Connection Dim adoRs As New ADODB.Recordset Dim strConn As String
Set adoRs = adoCn.Execute("Select * from Authors")
Do While Not adoRs.EOF Debug.Print adoRs(0)
adoRs.MoveNext Loop
adoRs.Close Set adoRs = Nothing
adoCn.Close Set adoCn = Nothing End Sub
위의 예제에서는 SQL 문장이 수행되는 시간이 15초 미만이기 때문에 별다른 현상을 볼 수 없을 것이다. 그러나 CommandTimeout 속성을 1로 설정하고 1초를 초과하는 작업을 수행하면 다음과 같은 오류 메시지를 볼 수 있다.
[그림] CommandTimeout 속성에 설정된 시간을 초과할 경우에 발생하는 오류 메시지
ConnectionString 속성
[그림] ADOX 참조 화면
ConnectionString은 데이터베이스에 접속하기 위한 정보들을 지정하는 속성이며, 이 값에 따라 ODBC 드라이버를 사용하게 될지, OLE DB Provider를 사용하게 될지를 결정하며, 접속할 데이터베이스와 서버, 그리고 접속 권한을 가진 사용자 ID와 암호를 지정할 수 있다.
참고로 오라클 데이터베이스에 접속할 경우에는 오라클에서 제공하는 클라이언트 도구인 SQL*Net을 설치한 후에 Easy Configuration으로 데이터베이스의 Alias를 생성한 다음, 윈도우 제어판의 ODBC32에서 DSN을 생성하든지, OLE DB Provider를 통해서 데이터베이스에 접속하도록 한다. 오라클에서 제공되는 SQL*Net의 설정 방법에 대해서는 제 8장 이기종 데이터베이스 접속에서 자세히 다루고 있다.
[예제]
Private Sub cmdConnectionString_Click() Dim adoCn As New ADODB.Connection
' DSN을 이용하여 연결하기 adoCn.ConnectionString = "DSN=Pubs"
adoCn.Open
adoCn.Close
' OLE DB 를 이용하여 연결하기 adoCn.ConnectionString = "Provider=Sqloledb;Data Source=(local);" & _ "Initial Catalog=Pubs;User ID=sa;Password=" adoCn.Open
adoCn.Close
Set adoCn = Nothing End Sub
위의 코드는 개체 변수를 생성할 때 Early Binding으로 처리했으며, Connection 개체의 Open 메서드의 매개변수로 사용자 ID와 암호를 지정하지 않고, ConnectionString 속성에 사용자 ID와 암호를 지정했다. 위의 코드에서 알 수 있듯이, 사용자 ID와 암호는 ConnectionString 속성에서 지정할 수도 있고, Open 메서드의 매개변수로도 지정할 수 있는 선택적인 사항이다.
DSN(Data Source Name)을 작성하는 방법에 대해서는 제 8장 이기종 데이터베이스 접속에서 다루고 있다.
ConnectionTimeout 속성
비주얼 베이직에서 ADO를 사용하기 위해서는 프로젝트 메뉴의 참조(References)에서 Microsoft ActiveX Data Object 2.5 Library (msado15.dll)을 선택해야 한다.
ConnectionTimeout 속성은 데이터베이스에 연결이 이루어지기를 얼마나 오랫동안 기다렸다가 실행을 중지하고 오류를 발생시킬지를 설정하는 속성이다. 이 값은 Read/Write 가능하며 단위는 초이다. 기본 값은 15초 이다.
ConnectionTimeout 속성을 설정한 후 이 시간 동안 데이터베이스와 연결이 이루어지지 않으면, ADO는 실행을 중지시키고 오류를 발생시킨다. 만약 네트워크의 상태가 좋지 않아서 이 값을 0으로 설정하면, 연결이 이루어질 때까지 무한 대기하게 된다. 하지만, 부득이한 경우를 제외하고는 0으로 설정하는 것은 피하는 것이 좋다.
ConnectionTimeout 속성은 데이터베이스와 연결되었거나 연결되지 않았거나, Read/Write 가능하다.
[예제]
Private Sub cmdConnectionTimeout_Click() Dim adoCn As New ADODB.Connection Dim strConn As String
위의 예제는 ConnectionTimeout 속성을 10으로 설정하는 예이다. 만약 네트워크의 상태가 좋지 않거나 서버 측에서 문제가 발생해서 10초 이내에 데이터베이스에 접속하지 못하면 다음과 같은 오류가 발생한다.
[그림]ConnectionTimeout 화면
CursorLocation 속성
CursorLocation 속성은 커서 엔진이 생성될 위치를 지정하거나 현재 CursorLocation 설정 값을 읽어 올 수 있는 속성이다.
상수
값
설 명
adUseNone
0
커서 서비스를 사용하지 않겠다는 설정으로 단지 이전 버전과의 호환성을 위해서 제공되는 값이다.
adUseServer
2
디폴트 값이며, 데이터 Provider 또는 드라이버가 지원하는 커서이다. 서버 커서는 유연하고 다양한 기능을 제공하지만, 클라이언트 커서가 지원하는 Disconnected Recordset과 같은 몇몇 기능을 제공하지 못한다.
adUseClient
3
로컬 커서 라이브러리에 의해서 제공되어지는 클라이언트 커서. 로컬 커서 엔진은 드라이버가 지원하지 않는 유용한 기능들을 지원하는 경우도 있다.
CursorLocation 속성은 Connection 개체와 Recordset 개체가 가지고 있는 속성이며, Connection 개체와 Recordset 개체가 데이터 소스에 연결되기 전에는 읽기/쓰기가 모두 가능하며, 연결된 후에는 읽기 전용이다.
특별히, RDS(Remote Data Service)에서 클라이언트 측의 Recordset(ADOR) 개체나 Connection 개체를 사용하기 위해서는 adUserClient를 사용해야만 한다.
Recordset 개체의 CursorLocation 속성은 지정하지 않으면 Connection 개체의 CursorLocation 속성의 설정 값을 상속 받는다. 그리고 Recordset 개체는 ActiveConnection으로 지정된 Connection 개체의 CursorLocation 속성의 값과 다른 CursorLocation 값을 사용할 수도 있다. 그래서 Connection 개체는 서버 커서를 사용하고 Recordset 개체는 클라이언트 커서를 사용하도록 설정할 수 있다.
[예제]
Private Sub cmdCursorLocation_Click() Dim adoCn As New ADODB.Connection Dim adoRs As New ADODB.Recordset Dim strConn As String Dim strMessage As String
Do While Not adoRs.EOF Debug.Print "Employee: " & adoRs!lName & " (" & adoRs.RecordCount & _ "중의 " & adoRs.AbsolutePosition & "번째 레코드 )"
adoRs.MoveNext Loop
adoRs.Close Set adoRs = Nothing
adoCn.Close Set adoCn = Nothing End Sub
위의 예제에서 Recordset 개체의 AbsolutePosition 속성은 현재 레코드의 물리적인 순서를 알려주는 속성으로 Recordset 개체의 CursorLocation 속성과 CursorType에 따라 사용 가능 여부가 달라진다. 이에 대한 자세한 내용은 제 8장 CursorLocation 속성과 제 9장 CursorType 속성에서 다루고 있다.
참고
위의 예제에서 Recordset 개체는 데이터베이스에 직접 연결된 것이 아니라, Connection 개체를 사용해서 데이터베이스에 접속한 후, 생성한 Connection 개체를 이용해서 Recordset 개체를 연결하고 Recordset 개체를 통해서 테이블의 레코드를 읽어 온다. 인터넷이 아닌 랜(LAN, Local Area Network) 환경이라면 위의 예제처럼 비주얼 베이직 프로젝트의 시작부분(Sub Main 함수)에서 Connection 개체를 생성하고, 이것을 프로젝트 내에서 사용하는 것이 보다 효율적이다. 이유는 Recordset 개체를 직접 데이터베이스에 연결할 경우에는 서버 측에서 디폴트 Connection 개체를 생성하고 생성한 Connection 개체를 통해서 Recordset 개체를 생성한 후, Connection 개체는 소멸되는 작업이 내부적으로 이루어지기 때문에 서버에는 많은 부하가 걸리게 된다. 웹 환경이라면 이런 서버 측의 부하보다 네트워크 상의 부하가 더 크기 때문에서 서버 측의 부하를 감수하고 Recordset 개체를 사용해서 직접 데이터베이스에 접속하는 방식이 사용된다. 하지만, 랜 환경이라면 전역 Connection 개체를 사용해서 필요한 Recordset 개체를 사용하는 것이 보다 더 효율적이다.
DefaultDatabase 속성
DefaultDatabase 속성은 Connection 개체의 디폴트 데이터베이스를 지정하는 속성이다. DefaultDatabase 속성을 지정해서 작업을 수행하려면 Provider가 하나의 Connection 개체에 여러 개의 데이터베이스를 할당해서 사용할 수 있도록 지원해야만 한다. 몇몇 Provider는 하나의 Connection 개체에 오직 하나만의 데이터베이스를 할당할 수 있기 때문에 DefaultDatabase 속성을 변경할 수 없게 된다.
Provider가 이를 지원하지 않을 경우에는 오류가 발생하거나 빈 문자열을 반환한다.
이 속성은 CursorLocation이 클라이언트인 Connection 개체에서는 지원되지 않는다.
[예제]
다음 예제는 디폴트 데이터베이스를 지정하지 않고 Connection 개체를 데이터베이스에 연결한 후에 디폴트 데이터베이스를 지정하고 Connection 개체로부터 Recordset 개체를 생성하는 예이다.
Private Sub cmdDefaultDatabase_Click() Dim adoCn1 As New ADODB.Connection Dim adoCn2 As New ADODB.Connection Dim adoRs As New ADODB.Recordset
' Microsoft ODBC Provider 사용 adoCn1.ConnectionString = "Driver={SQL Server};" & _ "Server=(local);UID=sa;PWD=" adoCn1.Open adoCn1.DefaultDatabase = "Pubs"
adoRs.Open "Authors", adoCn1
adoRs.Close Set adoRs = Nothing
adoCn1.Close Set adoCn1 = Nothing
' Microsoft SQL Server Provider 사용 adoCn2.ConnectionString = "Provider=sqloledb;" & _ "Data Source=(local);User ID=sa;Password=" adoCn2.Open adoCn2.DefaultDatabase = "Pubs"
adoRs.Open "Authors", adoCn2
adoRs.Close Set adoRs = Nothing
adoCn2.Close Set adoCn2 = Nothing End Sub
IsolationLevel 속성
Connection 개체의 IsolationLevel을 지정하는 속성이다. 이 속성은 아래의 IsolationLevelEnum 값들을 지정할 수 있다.
상수
값
설명
adXactUnspecified
-1
Provider가 특별히 지정된 IsolationLevel을 사용하지 않을 경우, 즉 IsolationLevel을 명시하지 않을 때 사용하는 값이다.
adXactChaos
16
디폴트 값이며, 분리된 트랜잭션으로부터 발생하는 Commit되지 않은 변경을 반영하지 않는 IsolationLevel을 지정하는 값이다.
adXactBrowse 또는 adXactReadUncommitted
256
한 트랜잭션에서 다른 트랜잭션에서 Commit되지 않은 변경을 읽을 수 있는 IsolationLevel을 지정하는 값이다.
adXactCursorStability 또는 adXactReadCommitted
4096
기본값, 한 트랜잭션에서 다른 트랜잭션에서 Commit된 변경에 대해서만 읽을 수 있는 IsolationLevel을 지정하는 값이다.
adXactRepeatableRead
65536
한 트랜잭션에서 다른 트랜잭션에서 수행한 변경을 읽을 수는 없지만, 새로운 Recordset으로 생성할 수는 있는 값이다.
adXactIsolated 또는 adXactSerializable
1048576
한 트랜잭션이 다른 트랜잭션으로부터 완전히 독립적임을 나타내는 값이다.
IsolationLevel 속성은 Connection 개체의 Isolation Level을 지정하기 위해서 사용된다. IsolationLevel 속성은 Read/Write가 가능하며, 값이 설정되면 새로운 BeginTrans 메서드에서부터 반영된다. 만약 개발자가 지정한 Isolation Level이 부적절한 경우에는 Provider가 보다 높은 레벨의 Isolation Level로 자동으로 변경한다.
Remote Data Service를 사용할 때, 클라이언트 커서를 사용하게 되면, IsolationLevel 속성은 adXactUnspecified 값으로만 지정할 수 있다. 이유는 클라이언트 캐쉬에서 Disconnected Recordset 개체를 사용하게 되면 다중 사용자의 문제에 부딪히게 되기 때문이다. 예를 들어, 두 명의 사용자가 동시에 동일한 레코드를 수정하려고 시도한다면, Remote Data Service는 먼저 요청한 한 사용자의 수정만 받아 들이고, 두 번째 사용자의 요청은 오류로 처리하기 때문이다.
실제 개발에 있어서 SQL 서버의 Isolation Level을 Connection 개체로 조작하는 경우는 그리 많지 않으며, 부득이하게 Dirty Page를 읽어야만 하는 경우 이외에는 거의 사용하지 않는다고 볼 수 있다. 여기에서 Dirty Page는 다른 트랜잭션에서 아직 Commit하지 않은 상태에 있는 데이터의 변경된 부분을 말하는 것이다.
[예제]
다음 예제는 IsolationLevel 속성과 Mode 속성을 함께 사용하는 예이다. Connection 개체의 Mode 속성을 adModeShareExclusive로 설정하고 IsolationLevel 속성을 adXactIsolated로 설정한 다음, 트랜잭션을 시작해서 특정 필드의 값을 변경하고, 코드의 마지막 부분에서 모든 트랜잭션을 Rollback 하는 예이다.
Private Sub cmdIsolationLevel_Click() Dim adoCn As New ADODB.Connection Dim adoRs As New ADODB.Recordset Dim strConn As String
' 다른 사용자가 Connection 개체를 연결하지 못하도록 설정한다. adoCn.Mode = adModeShareExclusive ' 다른 트랜잭션으로부터 독립되도록 설정한다. adoCn.IsolationLevel = adXactIsolated ' Connection 개체를 연결한다. adoCn.Open strConn
'Connection mode를 보여준다. If adoCn.Mode = adModeShareExclusive Then MsgBox "Connection mode is exclusive." Else MsgBox "Connection mode is not exclusive." End If
'isolation level을 보여준다. If adoCn.IsolationLevel = adXactIsolated Then MsgBox "Transaction is isolated." Else MsgBox "Transaction is not isolated." End If
'Type 값이 "psychology"이면 "self_help"로 변경 Do Until adoRs.EOF If Trim(adoRs!Type) = "psychology" Then adoRs!Type = "self_help" adoRs.Update End If
adoRs.MoveNext Loop
'Recordset 개체의 현재 데이터를 보여준다. adoRs.Requery Do While Not adoRs.EOF Debug.Print adoRs!Title & " - " & adoRs!Type
adoRs.MoveNext Loop
'원래의 데이터를 복구한다. adoCn.RollbackTrans
'Recordset 개체의 복구된 데이터를 보여준다. adoRs.Requery
Do While Not adoRs.EOF Debug.Print adoRs!Title & " - " & adoRs!Type
adoRs.MoveNext Loop
adoRs.Close Set adoRs = Nothing
adoCn.Close Set adoCn = Nothing End Sub
Mode 속성
Mode 속성은 Connection 개체 내에서 데이터를 수정할 권한에 대한 값이며, 다음과 같은 ConnectModeEnum 값 중 하나를 설정하거나 반환한다.
상수
값
설명
adModeUnknown
0
디폴트 값이며, 권한이 아직 설정되지 않은 상태를 나타낸다.
adModeRead
1
읽기 전용 권한을 나타낸다.
adModeWrite
2
쓰기 전용 권한을 나타낸다.
adModeReadWrite
3
읽기/쓰기 권한을 나타낸다.
adModeShareDenyRead
4
다른 사용자가 읽기 권한으로 Connection 개체를 연결하는 것을 막는다.
adModeShareDenyWrite
8
다른 사용자가 쓰기 권한으로 Connection 개체를 연결하는 것을 방지한다.
adModeShareExclusive
12
다른 사용자가 Connection 개체를 연결하지 못하도록 막는다.
adModeShareDenyNone
16
다른 사용자가 어떤 권한으로도 Connection 개체를 연결하지 못하도록 막는다.
Mode 프로퍼티는 Connection이 닫혀져 있을 때에만 수정할 수 있다.
RDS(Remote Data Service)를 사용할 때에는 클라이언트 커서와 함께 Mode 속성은 adModeUnknown 만을 지정할 수 있다.
Properties 속성
데이터 Provider에 대한 속성 개체들의 컬렉션으로 읽기 전용이다. 이 속성은 Provider에 대한 많은 정보를 제공하며, 개발자들은 Provider에 따라서 지원되는 기능이 다르기 때문에 개발에 필요한 기능이 Provider에 의해서 제공되는지를 사용하기 전에 먼저 확인해야 한다.
[예제]
다음 예제는 SQL Server ODBC Provider에 대한 정보를 직접 실행창에 보여주는 예이다.
Private Sub cmdProperties_Click() Dim adoCn As New ADODB.Connection Dim strConn As String Dim i As Integer
For i = 0 To adoCn.Properties.Count - 1 Debug.Print adoCn.Properties(i).Name & " : "; adoCn.Properties(i).Value Next i
adoCn.Close Set adoCn = Nothing End Sub
실행 결과는 다음과 같다.
Current Catalog : pubs Active Sessions : 0 Asynchable Commit : False Catalog Location : 1 Catalog Term : 데이터베이스 Catalog Usage : 7 Column Definition : 1 NULL Concatenation Behavior : 0 Data Source Name : Read-Only Data Source : False DBMS Name : Microsoft SQL Server DBMS Version : 07.00.0699 GROUP BY Support : 2 Heterogeneous Table Support : 0 Identifier Case Sensitivity : 8 Maximum Index Size : 900 Maximum Row Size : 8060 Maximum Row Size Includes BLOB : False Maximum Tables in SELECT : 32 Multiple Storage Objects : False Multi-Table Update : False NULL Collation Order : 4 OLE Object Support : 1 ORDER BY Columns in Select List : False Prepare Abort Behavior : 2 Prepare Commit Behavior : 2 Procedure Term : 저장 프로시저 Provider Name : MSDASQL.DLL OLE DB Version : 02.00 Provider Version : 2.50.3719.9 Quoted Identifier Sensitivity : 8 Schema Term : 소유자 Schema Usage : 31 SQL Support : 267 Structured Storage : 1 Subquery Support : 31 Isolation Levels : 1118464 Isolation Retention : 0 Table Term : 테이블 User Name : dbo Pass By Ref Accessors : True Transaction DDL : 8 Asynchable Abort : False Data Source Object Threading Model : 1 Output Parameter Availability : 4 Persistent ID Type : 4 Multiple Parameter Sets : True Rowset Conversions on Command : True Multiple Results : 1 Provider Friendly Name : Microsoft OLE DB Provider for ODBC Drivers Connection Status : 1 Server Name : CHRIS Open Rowset Support : 0 Accessible Procedures : True Accessible Tables : True Integrity Enhancement Facility : True Outer Join Capabilities : 127 Stored Procedures : True Driver Name : SQLSRV32.DLL Driver Version : 03.70.0690 Driver ODBC Version : 03.51 Like Escape Clause : Y Special Characters : #$?걗깂뀊뇠뎷땶뜋룓몤뱮븭뿕솞썫씆윝、$ⅵ㎤øガ??굉낫독렇뭔뻤슭오좌쳐탬픽?盖誥國喫戇倆厘描白繃嗇飡宸臆預隅膺狀穽增彩充坂沆樺詰? Max Columns in Group By : 0 Max Columns in Index : 16 Max Columns in Order By : 0 Max Columns in Select : 4096 Max Columns in Table : 1024 Numeric Functions : 16777215 SQL Grammar Support : 1 Outer Joins : Y String Functions : 5242879 System Functions : 7 Time/Date Functions : 2097151 File Usage : 0 Active Statements : 1 Password : Persist Security Info : User ID : Data Source : Window Handle : Location : Mode : Prompt : 4 Connect Timeout : 15 Extended Properties : DRIVER=SQL Server;SERVER=(local);UID=sa;PWD=;APP=Visual Basic;WSID=CHRIS;DATABASE=pubs Locale Identifier : 1042 Initial Catalog : OLE DB Services : -7 Autocommit Isolation Levels : 4096
Provider 속성
Provider 속성은 Connection 개체의 Provider의 이름을 지정하는 속성이다. 이 값은 ConnectionString 속성에서 지정할 수도 있으며, Open 메서드의 ConnectionString 매개변수에서 지정할 수도 있지만, Connection 개체의 Provider 속성을 이용해서 지정하는 것이 일일이 Open 메서드를 사용할 때 지정하는 것보다는 좀 더 명시적이라고 볼 수 있다. 이 값은 지정하지 않으면, 디폴트 값인 MSDASQL (Microsoft OLE DB Provider for ODBC)로 지정된다.
Provider 속성의 값은 데이터 소스에 연결이 이루어지기 전에는 Read/Write 가능하며, 연결이 이루어진 후에는 읽기 전용이다.
[예제]
다음 예제는 Provider를 지정하고 Connection 개체를 연결한 다음에 Provider 정보를 MsgBox로 보여주는 예이다.
Private Sub cmdProvider_Click() Dim adoCn As New ADODB.Connection
1. 안전하게 제거하기 : 안전제거는 외부 저장장치에 사용되는 쓰기 캐쉬 버퍼에 남아있는 데이터를 위한 옵션임. 장치 관리자에서 디스크 드라이브에 해당 USB메모리의 속성창에서 정책탭에 있는 옵션중에서 빠른 제거를 위해 최적화를 선택하면 안전제거를 하지 않아도 되며, 성능을 위해 최적화를 선택하면 반드시 안전제거를 해야 한다.
2. USB의 종류 SLC : 메모리 셀 하나에 1bit를 저장하는 방식 속도는 빠르나 메모리당 담을 수 있는 용량이 적어 가격이 비싸다.
MLC : 메모리 셀 하나에 여러 bit를 저장하는 방식 속도는 느리지만 가격이 싸다.
3. 메모리 드라이크 아이콘 만들기 메모리 루트에 ico파일을 넣고 autorun.inf파일을 아래와 같이 루트에 생성한다.
When Microsoft released Windows XP Pro they pushed it as the next development platform, superceding Windows 2000 Workstation. The reality, however, is that it is nothing more than a very slightly enhanced version of Windows XP Home edition. One of the major development features that didn't make it from 2000 to XP was the ability to host multiple virtual Web servers on a single machine. Essentially, Microsoft disabled (hid) the menu item in the IIS Management Console that allows you create a new virtual server.
As a developer who builds and maintains multiple Web sites for friends, collegues, other (non-competitive) companies, this is extremely annoying! Although you can theoretically create a new Web site under a new virtual root (a child path under your default Web server) this presents a big problem: the new Web site would have to be aware of this path offset when referring to itself with absolute or relative paths. The advantage of having a new and independent virtual server is that it only recognizes its own virtual roots and paths.
The Secret
However, there is an alternative, albeit slightly cumbersome. The ability to create multiple virtual servers is only hidden, not stripped out completely.
While you cannot create a new virtual servers through the MMC, you can still use the administrative scripts that come with IIS, specifically, the adsutil.vbs script.
IIS virtual servers are defined in the IIS metabase as numbered entries under the W3SVC key. For example, the default Web site is named W3SVC/1; the second site created would be named W3SVC/2; and so on.
So, to create a second virtual server, open a command window and type:
The first command creates a new virtual server in the IIS metabase.
The second command copies all the necessary meta data from your default Web site to the new Web site to make it work properly.
Rename It!
When you copy the meta data from an old site to a new site, the new site will inherit all of the old attributes, including the name. So you'll want to immediately rename the new virtual server. Open MMC and find the new entry - they will be listed in the sequence in which they were created (W3SVC/1, W3SVC/2, ....).
You'll also need to change other settings, such as the home directory. I typically like to create a new folder directly under the C:\InetPub folder for each new virtual server.
The Caveat!
When you open the IIS MMC, you'll notice a red icon next to the new virtual server and and error message in the comments column. This is OK. What this means is that inetinfo.exe attempted to start up this second virtual server.
The caveat in this whole thing is that, while you can create multiple virtual Web servers on a single Windows XP Pro machine, you can only run one at a time. Unfortunately, I (and apparently no one else) can find a way to work around this. Even applying a unique port number to each virtual server doesn't seem to work.
Toggling
But it's not so bad... All you have to do is open the IIS MMC, stop the currently running virtual server and start the one you want.
Of course, this means that when you switch between virtual servers, any active sessions on the virtual server you just shutdown will be lost. But the original intention was to be able to develop multiple Web sites, without having to worry about absolute or relative URL paths throughout the source code.
Deleting and Enumerating
You can also delete a virtual server that you previously created using this technique. The adsutil.vbs script includes a delete command:
Keep in mind, after deleting a virtual server, that you can't rely on the number of virtual servers shown in the IIS console to indicate the next available virtual server id number. For example, if you've created server 1, 2 and 3 and then delete server 2, the IIS console will only show two servers, but you cannot create another W3SVC/3 because that one already exists.
But you can enumerate the existing virtual servers using this adsutil.vbs syntax:
The /p qualifier indicates that you only want to view top level paths and not individual parameters. Otherwise, the output will be very long and difficult to understand.
현재 선택이나 삽입 포인트의 anchor 혹은 북마크의 상대 이름 앤커로 북파크(bookmark)를 생성한다.
CreateLink
현재 선택에 주소 연결(hyperlink)을 삽입하거나, 주소를 입력하여 삽입할 수 있는 대화창을 열어준다.
Cut
현재의 선택한 내용을 클립보드로 복사하고 선택 내용을 지운다.
Delete
현재 선택을 삭제한다.
FontName
현재 선택의 글꼴을 지정하거나 반환한다.
FontSize
현재 선택의 글꼴 크기를 지정하거나 반환한다.
ForeColor
현재 선택의 글꼴 색상(foreground)을 지정하거나 반환한다.
FormatBlock
현재 블럭의 태그를 설정한다.
Indent
현재 선택 문자를 한 증가분 만큼 뒤로 들여쓰기 한다.
InsertButton
사용자나 메서드에 의하여 선택된 단추(button)의 보이는 내용을 삽입한다. selection 개체 createRange 메서드를 사용하여 선택한 문자를 반환하거나 설정할 수 있다.
InsertFieldset
문자 선택(text selection)의 박스를 삽입한다.
InsertHorizontalRule
문자 선택(text selection)의 수평선(HR)을 합입한다.
InsertIFrame
문자 선택(text selection)의 인라인 프레임(IFRAME)을 삽입한다.
InsertImage
문자 선택(text selection)의 이미지(IMAGE)를 삽입한다.
InsertInputButton
문자 선택(text selection)의 단추(BUTTON)를 삽입한다.
InsertInputCheckbox
문자 선택(text selection)의 체크박스(CHECKBOX)를 삽입한다.
InsertInputFileUpload
문자 선택(text selection)의 파일업로드(FileUpload)를 삽입한다.
InsertInputHidden
문자 선택(text selection)의 감춘단추(HIDDEN)를 삽입한다.
InsertInputImage
문자 선택(text selection)의 이미지(IMAGE) 제어를 덮어씌우기한다.
InsertInputPassword
문자 선택(text selection)의 암호(PASSWORD) 제어를 덮어씌우기한다.
InsertInputRadio
문자 선택(text selection)의 레디오단추(RADIO) 제어를 덮어씌우기한다.
InsertInputReset
문자 선택(text selection)의 재설정(RESET) 제어를 덮어씌우기한다.
InsertInputSubmit
문자 선택(text selection)의 송신(SUBMIT) 제어를 덮어씌우기한다.
InsertInputText
문자 선택(text selection)의 문자열입력(TEXT) 제어를 덮어씌우기한다..
InsertMarquee
문자 선택(text selection)의 빈 마퀴(MARQUEE)를 덮어씌우기한다..
InsertOrderedList
문자 선택(text selection)의 번호있는 목록(OL)과 보통 블럭간의 전환을 한다.
InsertParagraph
문자 선택(text selection)의 줄바꿈(BR)을 덮어씌우기한다.
InsertSelectDropdown
문자 선택(text selection)의 드롭다운 제어를 덮어씌우기한다.
InsertSelectListbox
문자 선택(text selection)의 목록박스 선택 제어를 덮어씌우기한다.
InsertTextArea
문자 선택(text selection)의 여러 줄 텍스트 입력 제어를 덮어씌운다..
InsertUnorderedList
문자 선택(text selection)을 번호있는 목록과 일반 블럭 양식을 서로 교차시킨다.
Italic
문자 선택(text selection)에서 이태릭(italic) 문자와 보통 문자간 전환한다.
JustifyCenter
문자 선택(text selection)이 위치한 불럭에서 중앙에 위치시킨다.
JustifyLeft
문자 선택(text selection)이 위치한 불럭에서 왼똑에 위치시킨다.
JustifyRight
문자 선택(text selection)이 위치한 불럭에서 오른쪽에 위치시킨다.
LiveResize
위치 변경과 크기 변경에 따라 업데이트 뿐 아니라, 과정 중 계속적으로 모양을 유지위하기 업데이트를 한다.
MultipleSelection
예를 들어 편집기의 이미지와 제어를 하나의 엘레멘트처럼, 한개 이상의 엘레멘트를 선택할 수 있게 허용한다. 지명적이거나 암시적으로 속성이 지정된 엘레멘트는 한번에 SHIFT 나 CTRL로 선택될 수 있다.
Outdent
문자 선택(text selection)의 현위치에서 들어쓰기 한 증가분 만큼 왼쪽으로 내어쓰기 한다.
OverWrite
문자 입력 방식과 덮어쒸우기 방식 사이를 전환한다.
Paste
문자 선택(text selection)을 클립보드 내용으로 덮어씌우기 한다.
Print
사용자가 편재의 문서를 인쇄할 수 있도록 인쇄 대화상자를 열어 준다.
Refresh
현재의 문서를 새로고침 한다..
RemoveFormat
현재 선택 문자로 부터 태그들을 제거한다.
SaveAs
현재의 문서를 파일로 저장한다.
SelectAll
전체 문서를 선택한다.
UnBookmark
현재의 선택으로부터 북마크의 어떤 내용을 삭제한다.
Underline
현재 선택 문자에서 밑줄 그어진 부분과 밑줄 없는 부분 사이를 전환한다.
Unlink
현재 선택 문자에서 모든 연결을 삭제한다.
Unselect
현재 선택 문자을 취소한다.
Mozilla execCommand() 명령어 목록
command
value
explanation / behavior
backcolor
????
This command will set the background color of the document.
bold
none
If there is no selection, the insertion point will set bold for subsequently typed characters.
If there is a selection and all of the characters are already bold, the bold will be removed. Otherwise, all selected characters will become bold.
contentReadOnly
true false
This command will make the editor readonly (true) or editable (false). Anticipated usage is for temporarily disabling input while something else is occurring elsewhere in the web page.
copy
none
If there is a selection, this command will copy the selection to the clipboard. If there isn't a selection, nothing will happen.
note: this command won't work without setting a pref or using signed JS. See: http://www.mozilla.org/editor/midasdemo/securityprefs.html
note: the shortcut key will automatically trigger this command (typically accel-C) with or without the signed JS or any code on the page to handle it.
createlink
url (href)
This command will not do anything if no selection is made. If there is a selection, a link will be inserted around the selection with the url parameter as the href of the link.
cut
none
If there is a selection, this command will copy the selection to the clipboard and remove the selection from the edit control. If there isn't a selection, nothing will happen.
note: this command won't work without setting a pref or using signed JS. See: http://www.mozilla.org/editor/midasdemo/securityprefs.html
note: the shortcut key will automatically trigger this command (typically accel-X) with or without the signed JS or any code on the page to handle it.
decreasefontsize
none
This command will add a <small> tag around selection or at insertion point.
delete
none
This command will delete all text and objects that are selected.
fontname
????
This command will set the fontface for a selection or at the insertion point if there is no selection.
fontsize
????
This command will set the fontsize for a selection or at the insertion point if there is no selection.
forecolor
????
This command will set the text color of the selection or at the insertion point.
formatblock
<h1> <h2> <h3> <h4> <h5> <h6> <pre> <address> <p> p [this list may not be complete]
heading
<h1> <h2> <h3> <h4> <h5> <h6>
hilitecolor
????
This command will set the hilite color of the selection or at the insertion point. It only works with usecss enabled.
increasefontsize
none
This command will add a <big> tag around selection or at insertion point.
indent
none
Indent the block where the caret is located.
inserthorizontalrule
none
This command will insert a horizontal rule (line) at the insertion point.
Does it delete the selection?
inserthtml
valid html string
This command will insert the given html into the <body> in place of the current selection or at the caret location.
insertimage
url (src)
This command will insert an image (referenced by url) at the insertion point.
Does it delete the selection?
insertorderedlist
none
insertunorderedlist
none
insertparagraph
none
italic
none
If there is no selection, the insertion point will set italic for subsequently typed characters.
If there is a selection and all of the characters are already italic, the italic will be removed. Otherwise, all selected characters will become italic.
justifycenter
none
justifyfull
none
justifyleft
none
justifyright
none
outdent
none
Outdent the block where the caret is located. If the block is not indented prior to calling outdent, nothing will happen.
note: is an error thrown if no outdenting is done?
paste
none
This command will paste the contents of the clipboard at the location of the caret. If there is a selection, it will be deleted prior to the insertion of the clipboard's contents.
note: this command won't work without setting a pref or using signed JS. user_pref("capability.policy.policynames", "allowclipboard"); user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess"); See: http://www.mozilla.org/editor/midasdemo/securityprefs.html
note: the shortcut key will automatically trigger this command (typically accel-V) with or without the signed JS or any code on the page to handle it.
redo
none
This command will redo the previous undo action. If undo was not the most recent action, this command will have no effect.
note: the shortcut key will automatically trigger this command (typically accel-shift-Z)
removeformat
none
selectall
none
This command will select all of the contents within the editable area.
note: the shortcut key will automatically trigger this command (typically accel-A)
strikethrough
none
If there is no selection, the insertion point will set strikethrough for subsequently typed characters.
If there is a selection and all of the characters are already striked, the strikethrough will be removed. Otherwise, all selected characters will have a line drawn through them.
styleWithCSS
true false
This command is used for toggling the format of generated content. By default (at least today), this is true. An example of the differences is that the "bold" command will generate <b> if the styleWithCSS command is false and generate css style attribute if the styleWithCSS command is true.
subscript
none
If there is no selection, the insertion point will set subscript for subsequently typed characters.
If there is a selection and all of the characters are already subscripted, the subscript will be removed. Otherwise, all selected characters will be drawn slightly lower than normal text.
superscript
none
If there is no selection, the insertion point will set superscript for subsequently typed characters.
If there is a selection and all of the characters are already superscripted, the superscript will be removed. Otherwise, all selected characters will be drawn slightly higher than normal text.
underline
none
If there is no selection, the insertion point will set underline for subsequently typed characters.
If there is a selection and all of the characters are already underlined, the underline will be removed. Otherwise, all selected characters will become underlined.
undo
none
This command will undo the previous action. If no action has occurred in the document, then this command will have no effect.
note: the shortcut key will automatically trigger this command (typically accel-Z)
unlink
none
DEPRECATED COMMANDS
readonly
true false
This command has been replaced with contentReadOnly. It takes the same values as contentReadOnly, but the meaning of true and false are inversed.
useCSS
truefalse
This command has been replaced with styleWithCSS. It takes the same values as styleWithCSS, but the meaning of true and false are inversed.
<HTML> <BODY> <b> <font color="maroon" unselectable="on">문자열 중 원하는 부분 선택 후 아래 버튼 클릭!</font> </b> <script language='JavaScript'> <!-- function AddLink() { /******************************************************************* 사용자가 선택한 문자열을 변수로 저장한다. *******************************************************************/ var sText = document.selection.createRange(); if (!sText==""){ /******************************************************************* "하이퍼링크" 메뉴를 실행시킨다. *******************************************************************/ document.execCommand("CreateLink"); /******************************************************************* sText.parentElement()는 사용자가 선택한 문자열에 대한 패런트 요소를 얻어 온다. 이미 "하이퍼링크" 대화 상자에서 입력한 값이 이 요소에 반영되었으므로, 이 값의 tagName 속성이 "A"일 경우 계속 진행한다. *******************************************************************/ if (sText.parentElement().tagName == "A"){ /******************************************************************* 사용자가 선택한 문자열의 내용을 새로 추가시킨 하이퍼링크 주소로 대치시킨다. 만일 이 코드를 주석으로 막으면 사용자가 선택한 문자열에 하이퍼 링크 속성만 추가된다. *******************************************************************/ sText.parentElement().innerText=sText.parentElement().href; /******************************************************************* 전경색을 "maroon" 색으로 변경시킨다. *******************************************************************/ document.execCommand("ForeColor","false","maroon"); } } else{ alert("문자열의 일부를 선택한 후 이 버튼을 클릭하세요!"); } } //--> </script> <p style="color=blue"> 사용자가 선택한 문자열 중 원하는 부분 선택 후 아래 버튼을 클릭하면, 링크를 만들수 있습니다. </p> <BUTTON onclick="AddLink()" unselectable="on">링크 만들기</BUTTON> </BODY> </HTML>