제5강 DB,SQL & ADO객체
[Contents]
DataBase
SQL
서버컴포넌트
AdRotator 객체
ContentLinking 객체
Browser Capability 객체
CDO 객체
ADO
Connection 객체
RecordSet 객체
Command 객체
I. DataBase
DB
를 정의하면 관련된 여러개의 데이터들이 모여서 체계적으로 보관되고 통합관리되는 시스템이라고 할 수 있습니다. 제4강에서 이미
파일의 추가,삭제,수정등의 기법등을 공부했는데 DB란 이러한 서로연관된 파일이 모여서 하나의 집합체를 이루고 있습니다. 한편
이런 DB들을 관리하기 위해 나온 전문소프트웨어들이 있는데 많이 들어본 오라클,MSSQL,DB2등이 그것입니다. 이런
소프트웨어를 전문용어로 DBMS(Data Base Management System)이라고 부릅니다.
1) DB관리에 필요한 것들
a. DataBase
체계적으로 연결된 파일들을 모아둔것으로 각각의 파일등을 상호연관성 있는 Data들을 구성요소로 하고 있으며, 파일간에도 일정한 관계로 맺어져 있는것을 말합니다.
b. DBMS
DataBase와 사용자사이에서 교량적 역할을 담당하는 소프트웨어입니다.
c. Data Language And Query Language
사용자가 Data의 처리(추가,삭제,수정)를 위해 DBMS에 내리는 명령어를 말합니다.
* Data Language 종류
1. DDL(Data Definition) : DB의 스키마정의와 수정을 위한 언어로서 새로운 관계(릴레이션)스키마의 생성과 삭제를 담당하는 언어입니다.
2. DML(Data Manipulation Language) : 릴레이션 및 튜플의 삽입,삭제,갱신을 위한 언어
3. DCL(Data Control Language) : Data를 올바르고,정확하게 유지,관리하기위한 언어(무결성제고,보완성확보,복구대책)로서 주로 DBA에 의해 취급된다.
* 다음은 보통 같은 의미로 사용되는 용어를 정리한것입니다.
Table | Relation | File |
Row | Tuple | Record |
Column | Attribute | Field |
d. DBA(DataBase Administrator)
물론 개인도 DBA라 할 수 있지만 여기서의 의미는 대형 시스템에서 전문적으로 Data들을 관리하는 요원을 뜻합니다.
e. DB Machines
컴퓨터를 비롯한 기타 하드웨어
f. User
데
이타베이스를 사용하는사람 또는 프로그래머를 말합니다. DBA와 구별하자면 DBA는 필요한 정보의 요구분석과
스키마(Schema)설계 그리고 보완,복구,무결성제고정책등을 수립하며, User는 실무에서 직접 Data를 검색,추가,변경등의
업무를 수행하는 사람을 말합니다.
* 스키마(Schema)
DB에 저장된 Data이름,속성 그리고 Data의 구조에 대한 '논리적정의'를 말합니다.
1. External Schema(외부스키마) : 사용자의 입장에서 본 DB구조로서 사용자마다 서로 다른 DB스키마를 가집니다.
2. Conceptual Schema(개념스키마) : 조직전체의 입장에서 본 DB구조로서 단지 1개의 스크마만이 존재합니다.
3. Internal Schema(내부스키마) : 저장장치의 입장에서 본 DB구조로서 Data객체의 저장구조를 표현합니다.
2) DBS(Data Base System)의 존재이유
i. Data의 중복통제
Data의 중복을 방지하기위해서 입니다. 많은 양의 데이터가 중복저장 되는것을 허용한다면 필요없는 디스트공간을 차지하며 관리가 복잡하기 때문입니다.
ii. Data의 공유
똑같은 DB를 여러곳에서 사용한다면 매우 비효율적이므로 다양한 계층에서 동일한 데이타를 공유할 수 있게 해줍니다.
iii. Data처리 표준화
DBA가 바뀔때마다 DBMS체계를 바꿀수는 없습니다. 따라서 각 계층의 사용자들의 참여로서 사전에 데이터사용방식에 관한 협의를 마쳐야 합니다.
iV. 보안 및 무결성 제고
사용자들은 DB에서 직접데이터를 읽어들이는것이 아니라 DBMS를 거쳐서 자료에 접근해야 하기 때문에 대부분의 DBMS는 전문적인 보안장치를 마련해 놓고 있습니다.
V. 데이터의 독립성
저장된 Data들을 변경하거나 구조를 수정하여도 이미 작동하는 응용프로그램들에게는 아무런 영향을 주지 못합니다.
Vi. 데이터의 추상화
데이터가 실제 저장되는 물리적 구조를 이해 하지 못하더라도 사용자가 데이터의 표현방식을 간단하고도 명료하게 이해할 수 있도록 합니다.
3) 상용 DBMS모델
사
용자가 DBMS를 통해 데이터를 정의하고 처리하는 과정에서 이해하는 Data의 구조를 말합니다. 즉, 어떤 분야에대한 Data를
확보한후에 이 데이터들이 실제 DB에서 형식화되고 표현될 수 있도록 하기 위해서 입니다. DBMS가 완성되기 위해서는 다음의
구성요소를 필요로 합니다.
1.데이타 2.표현구조(관계형,계층형,망형) 3.무결성제약조건 4.검색,추가,삭제,수정을 위한 처리연산
* 관계형(Relational) : Data의 모든관계가 Relation이라는 단일형태로 이어져 표현되는 장점때문에 많이 쓰입니다.
II. SQL(Structured Query Language)
SQL이란 관계형DB(RDBMS)를 처리하기 위해 고안된 언어로서 독자적인 문법을 갖는 DataBase표준처리언어입니다. SQL역시 다음의 3가지 기본기능을 포함합니다.
1. 데이타의 정의 기능 : 데이터의 구조를 정의하는 Data Definition Language(DDL)
2. 데이터의 조작 기능 : 데이터를 조회하거나 변경하는 Data Manipulation Language(DML)
3. 데이타의 제어 기능 : 데이터베이스 사용자에게 부여된 권한을 정의하는 Data Control Language(DCL)
SQL
은 ADO객체에서 데이타베이스를 연결하는데 기본이 되므로 사용형식을 꼭 공부해야 합니다. 이제 실제 데이타에 접근하여 데이터를
다루는 기법을 공부하도록 하겠습니다. 다음에 예시된 table을 보면서 각 구문을 설명하도록 하겠습니다.
[예제 table] 테이블이름 : members
name
age
tel
hobby
email
김영호
32
781-8796
음악
yhkim@haail.net
강원수
25
126-5469
골프
uskang@kji.co.kr
하도형
41
456-9863
테니스
dgha@hung.com
정명희
36
365-7546
수영
mhjung@nean.com
금자옥
28
453-6321
컴퓨터
gokum@joms.co.kr
1. Select문
Select * from 테이블이름 [where 조건식] [order by 형식]
*
는 테이블에있는 모든 필드(name,age,tel,hobby,email)에 해당하는 전체데이타를 지정합니다. 여기서 테이블이름은
members가 되겠지요(이하 테이블이름으로 모두 members를 쓰겠습니다). 그리고 조건식은 해당조건에 맞는 데이터를
선택합니다. 또한 where 와 order by 이하는 생략해도 되는데 이렇게 되면 전체데이터가 선택 되겠지요.
아래 조건식에 대한 예제는 SQL문 전체에 적용됩니다.
[조건식의 사용 예제들]
where hobby='수영' => 취미가 수영인 데이터 선택
where age=41 => 나이가 41세인 데이터 선택
where hobby='수영' and age=41 => 취미가 수영이면서 나이가 41세인 데이터 선택
where age between 30 ana 40 => 나이가 30세이상 40세이하인 데이터들 선택
where hobby='수영' age>40 => 추미가 수영&나이가 40세이상인 사람들 선택
where age=36 and hobby<>'골프' => 나이가 36세&골프를 취미로 하지 않는 사람
where name like ‘하%’ => %는 와일드 카드이고 '하'로 시작하는 모든 것 선택
where name like ‘_하%’ => 두번째 글자가 '하'로 시작하는 모든 것 선택
where name like ‘%하%’
where hobby IN ('수영', '테니스') => 취미를 수영과 테니스로 하는 사람들 선택
where hobby not IN ('컴퓨터','독서') => 취미로 독서와 컴퓨터를 하지않는사람들 선택
[형식의 사용예]
Order by age => 나이를 오름차순으로 정렬시켜 선택합니다.
Order by name, age DESC => 먼저 이름을 오름차순으로 정렬 시키고 다음
나이를 내림차순으로 정렬시켜 선택합니다.
[참고] 실제 DB를 소트시키는 것이 아니라 작업을 쉽게 하기위해 가상으로 데이터들을 정렬시킴
한편 * 을 표시하면 전체필드영역을 의미하는데 어느 특정필드만을 지정하려면 다음과 같이 지정하면 됩니다.
Select age,tel,email from members
2. 데이터의 삽입
Insert into 테이블이름(name,age,tel...) Values(이름데이터,나이데이터,전화번호...)
3. 데이터의 삭제
Delete from 테이블이름 where 조건식
4. 데이터의 갱신
Update 테이블이름 Set name=수정할이름, age=수정할나이... where 조건문
5. 테이블 생성
Create Table 테이블이름(필드1 type, 필드2 type, 필드3 type,....)
[type] : integer, char(n), real, float, numeric...
6. 테이블 삭제
Drop Table 테이블이름
7. 테이블에 필드추가 또는 필드 삭제
Alter Table 테이블이름 Add Column 추가필드명 type
Alter Table 테이블이름 Delete Column 삭제필드명
III. 서버컴포넌트
서
버에 등록된 서버컴포넌트들은 모두 DLL파일의 형태로 존재합니다. 서버컴포넌트를 사용하는 목적은 스크립트가 가진 한계를 넘어
더욱 더 많은 기능을 제공하기 위해서라는것을 이미 설명했습니다. IIS가 기본으로 제공하는 서버컴포넌트의 종류에 대해서는
제4강에 정리되어 있습니다. 이제 각각의 서버컴포넌트의 활용법을 설명하겠습니다. 그중 ADO객체는 데이타베이스를 다루는 중요한
컴포넌트이기 때문에 절을 달리하여 설명하도록 하겠습니다.
1. Ad Rotator 컴포넌트
공
간이 한정된 웹사이트에서 이미지들를 이용해 광고효과를 내기 위한 컴포넌트입니다. 이 컴포넌트를 이용하면 광고에 나타날 이미지들을
횟수별로 분배할 수 있는 효과를 낼 수 있습니다. 예를들면 3개의 광고이미지를 만들어 웹상에서 보여진다고 할때 어떤 한개의
광고이미지의 배분확률이 20%로 지정되었다면 웹상에서 이 사이트에 10번접속하면 2번은 이 광고이미지가 보여진다는 의미입니다.
즉 Ad Rotator컴포넌트는 웹사이트를 읽어올때마다 다른 이미지를 보여줄 수 잇습니다. 그러므로 확률이 높을수록 해당
이미지에 의한 광고효과도 크겠지요. Ad Rotatior컴포넌트를 이용해 광고이미지들을 순환시키는 기능을 사용하려면 2개의
파일이 더 필요합니다. 예제를 보시길...
[예제]
---------- [파일1/3] test.asp ----------
<% set ObjAD = Server.CreateObject("MSWC.Adrotator") %>
<html>
<head><title>광고연습</title>
</head>
<center>
<%= ObjAD.GetAdvertisement("ad.txt") %>
</center>
</body>
</html>
---------- [파일2/3] ad.asp ----------
<%
Response.Redirect RequestQueryString("URL")
%>
---------- [파일3/3] ad.txt ----------
redirect /ad.asp
width 160
height 50
border 0
*
/image/adimage1.gif ==>이미지의 경로
http://www.vs.co.kr ==>이미지클릭시 이동할 URL주소
대결광장.재미있어요 ==>이미지에 마우스오버시 나타날 메시지
30 ==>이미지가 나올 확률
/image/adimage2.gif
http://www.yahoo.co.kr
야후!코리아입니다/
50
/image/adimage3.gif
http://my.netian.com/~dowoo3
제홈페이지에 오시길...
20
---------- [설명] ----------
예제제 사용된 3개파일은 모두 같은 폴더내에 있습니다.
이미지나 애니매이션의 사이즈는 모두 같아야 합니다.
예제이미지받기 : eximage.zip
그리고 이미지들은 image라는 폴더에 있습니다.
MSWC.Adrotator : 인스탄스생성을 위한 ProgID입니다.
GetAdvertisement : 스케줄파일(ad.txt)을 지정해주면 자동으로 페이지에 넣을 HTML을 생성하는 메서드 입니다.
---------- [실행] test.asp ----------
'새로고침'을 누르면 지정한 확률에 따라서 이미지가 바뀔것입니다.
2. Content Linking 컴포넌트
HTML
에서 추천사이트로 연결할 링크를 만들거나 이전페이지로 또는 다음페이지로 이동하는 링크를 만들려면 직접 메뉴를 만들어
<a>태그내에 이동할 URL이나 페이지파일이름을 써주어야 합니다. Content Linking 컴포넌트는 이러한
일련의 URL이나 페이지들을 좀더 쉽게 다룰 수 있어 직접 추천사이트로의 이동이나 동일한 사이트내에서의 페이지 이동을 가능하게
해 줍니다. 이 컴포넌트를 사용하기 위해서는 링크될 사이트를 관리하기 위한 리스트파일이 한개더 필요합니다. 파일이 더 늘어서
복잡하게 느낄수도 있지만 사용해 보시면 아주 유용한 컴포넌트입니다. 특히 URL변경등 링크정보를 수정할때 간편하지요. 예제를
보시길...
[예제]
---------- [파일1/2] test.asp ----------
<%
Set ObjLink = Server.CreateObject("MSWC.NextLink")
count = ObjLink.GetListCount("link.txt")
%>
<html>
<head><title>Content Link 예제</title>
</head>
<body>
<ul>
<% for i=1 to count %>
<A href = "<%= ObjLink.GetNthURL("Link.txt", i) %>" >
<%= ObjLink.GetNthDescription("Link.txt", i) %>
<%= "<br>" %>
<% next %>
</ul>
</body>
</html>
---------- [파일2/2] Link.txt ----------
http://www.vs.co.kr 1.대결광장!심심풀이로
http://www.acution.co.kr 2.인터넷 경매사이트!
http://www.qtime.co.kr 3.퀴즈맞추기!역시 땅콩
http://www.interpia98.net 4.하하.조용히 사는곳!
---------- [설명] ----------
MSWC.NextLink : Content Linking컴포넌트를 사용하기위한 ProgID - 프로그아이디는 개체마다 다르니 외우시길...
GetListCount : 리스트파일에있는 내용의 갯수를 가져오는 메서드
GetNthURL("Link.txt", i) : 리스트파일(Link.txt)의 내용중 i번째에 있는 URL을 가져오는 메서드
GetNthDescription("Link.txt", i) : 리스트파일(Link.txt)의 내용중 i번째에 있는 '설명'을 가져오는 메서드
{기타 메서드}
GetListIndex : 현재페이지의 인덱스(리스트파일내 줄번호)번호
GetPreviousURL : 이전페이지의 URL주소
GetPreviousDescription : 이전페이지에 대한 설명
GetNextURL : 다음페이지의 URL주소
GetNextDescription : 다음페이지에 대한 설명
[주의]
리스트파일 작성시 URL과 Description부분은 'Tab'을 사용하여 구별합니다.
---------- [실행] ----------
뭐 어려울것 없습니다. 링크관리를 쉽게 해주는 기능! 수정할 때에는 리스트파일(Link.txt)의 내용만 변경해주면 됩니다.
3. Browser Capability 컴포넌트
사용자로부터 전송되어온 HTML헤더(브라우저버전,이름등 브라우저에 관한 정보들)내용을 알려주는 컴포넌트입니다. 역시 예제로서...
---------- [예제] test.asp ----------
<%
Set ObjBrowser = Server.CreateObject("MSWC.BrowserType")
%>
<html>
<head><title>Browser Capability 예제</title>
</head>
<body>
브라우저이름: <%= ObjBrowser.Browser %><br>
브라우저버전: <%= ObjBrowser.Version %><br>
<% if ObjBrowser.ActiveXControls=true then %>
Active컨트롤지원<br>
<% else %>
Active컨트롤 지원하지않음<br>
<% End if %>
<% if ObjBrowser.tables=true then %>
테이블이용가능<br>
<% else %>
테이블이용불가<br>
<% End if %>
<% if ObjBrowser.frames=true then %>
프레임지원<br>
<% else %>
프레임지원하지않음<br>
<% End if %>
</body>
</html>
---------- [실행] ----------
브라우저이름: Netscape
브라우저버전: 4.00
Active컨트롤 지원하지않음
테이블이용가능
프레임지원
4. CDO(Collaboration Data Object)
메일을 보낼때 사용하는 컴포넌트입니다.
---------- [예제] test.asp ----------
<% Set ObjMail = Server.CreateObject("CDONTS.NewMail") %>
<html>
<head><title>CDO 예제</title>
</head>
<body>
<%
ObjMail.From = "dowoo3@netian.com" //보내는자주소
ObjMail.To = "dowoo3@netsgo.com" //받는자주소
ObjMail.Sub = "음. 테스트입니다." //제목넣기
ObjMail.Body = "뭐 별다른 내용은 없고 테스트중" //본문쓰기
ObjMail.Send //전송
%>
</body>
</html>
---------- [설명] ----------
먼
저 C:\Windows\system\inetsrv폴더에 Cdonts.DLL파일이 있는지 확인합니다. 이 컴포넌트파일이 없으면
실행이 되지 않아요. 없으면 Microsoft홈페이지에 가셔서 다운로드받아서 inetsrv폴더에 저장합니다.. 그리고
도스모드에서
C:\Windows\system\inetsrv>Regsvr32 Cdonts.DLL 라고 엔터치면 등록됩니다.
마이크로소프트사에 가면 기타 다른 컴포넌트들도 많은데 필요한 것들을 가져다가 위와 같은 방법으로 등록하신후 사용하시면 됩니다.
IV. ADO(Active Database Object) - Database Access Component
1) DSN(Data Source Name)와 ODBC(Open Data Base Connectivity)생성
DB
를 다루기 위한 공부를 시작하기전 꼭 이해하고 넘어가야할 부분입니다. 많이들 들어보셨겠지만 DB시스템에는 여러가지가 있습니다.
Oracle, MS-SQL등이 많이 쓰이고 좀더 쉬운것으로 Access가 있습니다. 그리고 컴퓨터의 운영체제에도
윈도우,유닉스,리룩스,맥킨토시등 여러가지가 있죠. 그러면 각 운영체제마다 사용해야할 특정 DB가 있는걸까요? 운영체제마다
사용해야만할 DBS가 따로 있다면 사용하기가 정말 불편할 것입니다.이렇게 각각의 운영체제와 DB들의 상호호환을 위해 필요한것이
ODBC입니다. 즉 운영체제와 DB간의 인터페이스를 위한 매개체로 생각하시면 쉽겠지요. 그리고 DSN이란것은 우리가 서버를
이용할때 가상디렉토리와 물리적 디렉토리를 사용하듯이 DB에 접근할때에도 일종의 가상개념의 이름을 사용하여 접근하게 되는데 이것을
DSN이라 합니다. 역시 ODBC에서 지정해줍니다. 그러므로 ADO객체등에서 DB을 액세스 할 때에는 실제 DB이름을
지정하는것이 아니라 DSN으로써 DB를 관리할 수 있습니다.
그림이 많이 사용되서 별도로 페이지를 만들었습니다. 여기를 누르세요.
2) ADO객체
이제 본격적으로 DB를 다루기 위한 테크닉으로 들어갑니다.
[ADO객체모델]
Connection 객체 |
콜렉션 | Errors : 에러를 체크하는 정보를 가짐 | |||
properties : 아래사항들 | |||||
속성 | ConnectionString : 데이타소스연결시 필요한 정보 | ||||
CommandTimeOut : 명령을 내린 후 지연시간(초단위) | |||||
ConnectionTimeOut : 연결될때까지의 지연시간(초단위) | |||||
Attribute : 기존 트랜잭션의 종료후 새 트랜잭션의 시작여부 제어 | |||||
메서드 | Open() : 데이터소스의 연결 | ||||
Close() : 데이터소스 연결상태 종료 | |||||
Execute() : SQL실행과 저장프로시저실행 | |||||
BeginTrans() : 새 트랜잭션 시작 | |||||
commitTrans() : 수정내용을 저장 & 트랜잭션 종료 | |||||
RollbackTrans() : 수정내용을 취소 & 트랜잭션 종료 | |||||
하위객체 | Error | ||||
Property | |||||
Command 객체 |
콜렉션 | Parameters : 쿼리를 실행하는데 필요한 인자값을 미리정의 | |||
parameter 객체 |
속성 | Count : 콜렉션의 개수 | |||
Item : 콜렉션의 필드내용을 가져올때 | |||||
메서드 | Append() : Parameter객체추가 | ||||
Delete() : Paraneter객체 제거 | |||||
Refresh() : 콜렉션갱신 | |||||
속성 | ActiveConnectiob : Command객체의 Connection객체 | ||||
CommandTimeOut : 명령을 내린 후 지연시간(초단위) | |||||
CommandText : SQL실행문, 저장프로시저 | |||||
CommandType : CommandText의 명령형태 | |||||
Prepared : 실행전 SQL문을 미리실행할것인지를 지정 | |||||
메서드 | Execute() : SQL실행과 저장프로시저실행 | ||||
CreateParameter() : parameter객체에서 새 parameter객체 생성 | |||||
Recordset 객체 |
콜렉션 | Fields 객체 | 속성 | ||
ActualSize : 필드에 저장된 실제데이터의 길이 | |||||
DefinedSize : 원래 필드의 길이 | |||||
Attributes : 필드에 저장된 실제데이터 타입 | |||||
Type : 원래 필드의 데이터 타입 | |||||
NumericScale : 몇번째에 소수자리가 위치하는가 | |||||
OriginaValue : 갱신전 필드가 가졌던 데이터 값 | |||||
Precision : 필드에 저장된 숫자의 개수 | |||||
Name : 필드이름 | |||||
UnderlyingValue : DB에 저장된 필드의 현재 데이터 | |||||
Value : 아직 저장하지않은 채 할당된 필드의 데이터 값 | |||||
Count : 레코드를 구성하는 필드개수 | |||||
메서드 | |||||
Item() : 특정필드의 데이터값표시 예] Recordset.Fields.Item("name") ->현재레코드의 name필드값 표시 & name필드가 첫번째 필드라면 다음과 같이 표현가능함 Recordset.Fields.Item(0) 그러나 실제 사용은 Fileds를 생략하고 쓰임니다. | |||||
Properties : 아래사항들 | |||||
속성 | ActiveConnection : Recordset객체의 Connection객체 | ||||
Absolutepage : 현재 레코드가있는 곳의 절대페이지번호 | |||||
Absoluteposition : 레코드의 순서위치값 가짐 -1 : 현재레코드없음(adPosUnknown) -2 : 가장처음 레코드의 앞(adPosBOF) -3 : 가장마지막 레코드의 뒤(adPosEOF) | |||||
Pagesize : 1개페이지의 한계 레코드수 지정 | |||||
PageCount : Recordset의 페이지수 | |||||
RecordCount : Recordset의 레코드 개수 | |||||
BOF/EOF : 레코드의 첫번째/마지막 위치 | |||||
CursorType : 커서타입 | |||||
LockType : Lock타입 | |||||
메서드 | Open() : Recordset의 커서Open | ||||
Close() : Recordset의 객체 닫기 | |||||
Support() : 메서드가 사용할수 있는지 체크 예] 객체참조변수.Support(AddNew) ->AddNew메서드를 사용할 수 있으면 True값 가진다 | |||||
AddNew() : 새 레코드생성 | |||||
Delete() : 레코드 수정 | |||||
Update() : 레코드갱신 | |||||
Move() : 상대 레코드 이동(커서타입을 확인하세요) 예] Move 3 : 현재레코드에서 3칸더 이동 Move -3 : 현재레코드에서 -3칸전 이동 | |||||
MoveFirst() : 처음으로 레코드 이동 | |||||
MoveLast() : 마지막으로 레코드 이동 | |||||
MoveNext() : 다음으로 레코드 이동 | |||||
MovePrevious() : 이전으로 레코드 이동 | |||||
하위객체 | Field | ||||
Property |
1. Connection 객체
Connection객체의 주된 역할은 일단 접근하고자 하는 DataBase와의 연결설정입니다.먼저 Server객체의 CreateObject메서드를 이용하여 Connection객체의 인스탄스를 생성합니다.
[인스탄스생성]
Set DBconn = Server.CreateObject("ADODB.Connection") |
a. 참고로 DBconn은 변수입니다. Connection 객체를 참조받기 위해서입니다.
b. ADODB.Connection 은 Connection객체생성을 위한 ProgID입니다.
[DataBase지정]
DBconn.Open (DSN, 사용자ID, 암호) |
a. DSN은 제어판의 ODBC에서 설정한 DB의 가상이름입니다.
b. 사용자ID와 암호는 DB에 접근가능한 사용자를 구별하기 위해서입니다.
우리는 Windows환경에서 Access를 사용하므로 이부분은 생략하도록 합니다.
[예제1 : 레코드 추가] test.asp ----------
<html>
<body>
<%
Set DBconn = Server.CreateObject("ADODB.Connection")
DBconn.OPen "dowoo3DB"
tempsql = "Insert into members values('강병철','31','765-8769','농구','bhkan@dong.co.kr')"
DBconn.execute tempsql '레코드추가실행
DBconn.close '데이타소스연결을 종료
Set DBconn = nothing '메모리에할당된 객체참조변수'DBconn'을 Clear
%>
!레코드를 추가하였습니다!
</body>
</html>
--- Access파일을 열어서 추가되었는지 확인하세요. ---
[예제2 : 레코드 삭제] test.asp ----------
<html>
<body>
<%
Set DBconn = Server.CreateObject("ADODB.Connection")
DBconn.Open "dowoo3DB"
DBconn.execute "Delete * From members" '전체데이터삭제
DBconn.close
Set DBconn = nothing
%>
!레코드를 삭제하였습니다.
</body>
</html>
[참고 : Execute메서드를 이용한 추가기능]
위 예제에서 쓰인 Execute메서드의 사용만으로로도 일반적인 작업의 처리는 가능하지만 좀더 기능을 효율적으로 이용하자면
DBconn.execute 실행문, 영향받는레코드수, 옵션 |
a. 실행문은 위예제에서 사용한 SQL문장이나 저장프로시저입니다.
b. 영향받는레코드수는 임의변수를 대체하여사용합니다.
c. 옵션 : 상수값의 적용을 받습니다.
1 : 실행문이 SQL과 같은 텍스트 명령임을 지정
2 : 실행문이 테이블이름임을 지정
4 : 실행문이 DB소스내의 프로시저임을 지정
d. 옵션을 지정하여 ADO객체가 DB소스에게 지금실행할 명령이 어떤 명령형인지를 물어보는 번거로움을 줄여줍니다.
[예제3 : 레코드삭제] test.asp ----------
<html>
<body>
<%
Set DBconn = Server.CreateObject("ADODB.Connection")
DBconn.Open "dowoo3DB"
DBconn.BeginTrans '트랜잭션을 시작
DBconn.Execute "Delete * from members where age='31'", selectRecord, 1
If DBconn.Errors.Count=0 then '오류가없으면
DBconn.CommitTrans '작업을 처리하고 저장
Response.Write "삭제된 레코드수는" & selectRecord & "개 입니다"
else
DBconn.RollBackTrans '작업을 취소하고 처음상태로 되돌림
Response.Write "작업이 취소되었습니다."
end if
DBconn.Close
Set DBconn = nothing
%>
</body>
</html>
----- 실행 -----
삭제된 레코드수는 2개 입니다.
[중요 : 트랜잭션]
위
의 예제에서 트랜잭션의 메서드와 사용법이 소개 되었습니다. 트랜잭션은 작업을 처리하는 도중 어떤 에러가 발생하였을때 대처하기
위한것으로 DB의 수정작업을 즉시 처리하지 않고 전체 작업이 제대로 실행되었을때에만 작업을 저장하고 종료하는
기능입니다.CommiTrans와 RollbackTrans메서드의 사용법을 기억해 주시길...
[참고 : Connection객체의 효율적인사용]
예
를들어 게시판이라는 웹응용프로그램을 만들어 DB관리를 하려고 한다면 게시판관리,읽기,쓰기부분으로 나눌 수 있습니다. 각각의
모드에서 DB를 연결하려면 Connection객체를 필요할때마다 여러번 사용해야 합니다. 그런데 이와같은 하나의 웹프로그램내에서
한번의 인스턴스생성(Connection객체)만으로도 각각의 모드에서 별도 Connection객체의 인스턴스생성없이도 DB연결을
유지할 수 있습니다. Application객체나 Session객체의 변수를 객체참조변수로 이용하는 것입니다.
Sub Application_Onstart() Set Application("DBconn") = Server.CreateObject("ADODB.Connection") End Sub |
Sub Session_Onstart() Set Session("DBconn") = Server.CreateObject("ADODB.Connection") End Sub |
위 내용을 global.asa파일에 삽입시킵니다.global.asa파일에 대한 예제는 Counter작성예제에 있습니다.
2. Recordset 객체
ADO객체중에서도 가장 유용하게 사용되는 부분이겠지요. Recordset객체는 자료검색과 출력을 주 기능으로 하여 일반사용자들이 데이터를 읽고 구별하기 쉽게 SQL문에 의해 처리된 결과 값을 페이지에 보여줍니다.
[인스탄스생성]
Set DBreco = Server.CreateObject("ADODB.Recordset") |
a. DBreco는 레코드셋 객체참조변수입니다.
b. ADODB.Recordset은 레코드셋객체의 인스탄스생성위한 ProgID입니다.
[레코드셋열기]
DBreco.Open "테이블이름", DSN [,커서타입,Lock타입,옵션] |
a. 테이블이름대신 SQL문이나 저장프로시저를 사용해도 됩니다.
b. 연결문자열에의한 DB연결시에는 DSN대신 Connection객체를 씁니다.
c. 커서타입(ADO상수)
0 <adOpenForwardOnly>: 레코드를 앞으로 이동시키면서 순차적으로 한번만 읽음
1 <adOpenKeyset> : 레코드를 자유로이이동-레코드갱신-다른사용자가추가한내용열람불가
2 <adOpenDynamic> : 레코드를 자유로이이동-레코드갱신-다른사용자가 작업한
모든내용 열람가능
3 <adOpenStatic> : 레코드를 자유로이이동-레코드갱신불가-단지 데이타를
가져오는데 유용
d. Lock타입
adLockReadOnly : 레코드는 읽을수만 있읍니다.
adLockPessimistic : 각 레코드는 한번밖에 갱신안됩니다.
adLockOptimistic : 각 레코드는 한번이상 갱신가능하나 Update메서드를 실행하면 갱신안됩니다.
adLockBatchOptimistic : 갱신모드로 들어가면 작업가능
e. 옵션
adCmdText : a가 SQL문을 실행함을 지정
adCmdStoredProc : a가 저장프로시저를 사용함을 지정
adCmdTable : a가 테이블을 가져오는것임을 지정
[주의] 위에 설명한 커서타입에 ADO상수가 사용되는데 이러한 상수들을 사용하려면 웹페이지 작성시 adovbs.inc파일을 삽입시켜야 합니다. 사용방법은 다음과 같습니다.
<!-- #include virtual="경로/Adovbs.inc" -->
[예제 : 레코드의 이동 - 데이터는 SQL설명때 사용한 테이블을 참고하시길... ]
<html>
<head>
<TITLE>레코드이동 예제</TITLE>
</head>
<body>
<!-- #INCLUDE VIRTUAL="/Adovbs.inc" --> '상수가 쓰일때 이렇게 삽입하시길...
<%
Set DBconn = Server.CreateObject("ADODB.Connection")
DBconn.Open "dowoo3DB"
set rstemp = Server.CreateObject("ADODB.Recordset")
querystr = "Select name from Members" '예제의 편의상 전체항목중 이름만 가져옴
rstemp.Open querystr, DBconn
rstemp.movefirst '맨처음 레코드로 커서위치
howmanyfields = rstemp.fields.count '필드개수구함
howmanyrecs = 0 '레코드수 초기화
%>
<table border=1>
<% '테이블 제목줄에 이름필드명을 기록
for i=0 to howmanyfields-1 %>
<td><b><%=rstemp(i).name %></B></TD>
<% next %>
<tr>
<% do while not rstemp.EOF 'EOF가 false조건만족하면 %>
<% for i = 0 to howmanyfields-1 %>
<td valign=top><%= rstemp(i) %></td>
<% next %> <tr>
<%
rstemp.movenext
howmanyrecs = howmanyrecs + 1 '레코드수 하나 증가
loop
rstemp.close '레코드객체참조변수 닫기
DBconn.close 'Connection객체참조변수 닫기
Set Dbconn = nothing '메모리에서 제거
set rstemp = nothing '메모리에서 제거
%>
</table><p>
등록된 회원은 총 <%= howmanyrecs %>명 입니다.
</body>
</html>
--------- [실행] ----------
name |
김영호 |
강원수 |
금자옥 |
정명희 |
하도형 |
등록된 회원은 총 5명 입니다.
[데이터의 추가 : ObjRecord를 레코드객체참조변수로 사용]
ObjRecord.AddNew
ObjRecord("필드1") = "데이터1"
ObjRecord("필드2") = "데이터2"
ObjRecord.Update
[데이터의 삭제]
ObjRecord.Delete
[데이터의 수정]
ObjRecord.("필드1") = "수정할데이터1"
ObjRecord.("필드2") = "수정할데이터2"
ObjRecord.Update
3. Command 객체
Connection
객체의 주 기능은 데이타베이스의 연결이지만 또한 쿼리를 실행하여 데이터의 추가,삭제등 일련의 작업을 실행할 수 있습니다.
Command객체는 이러한 쿼리 실행명령을 이용한 작업처리를 1차 기능으로 하고 Connection객체보다 몇가지 추가된 기능을
제공합니다.
[인스턴스생성과 쿼리실행 - Connection객체사용과 비슷합니다]
Set DBcomm = Server.CreateObject("ADODB.Command") DBcomm.ActiveConnection = "DSN" DBcomm.CommandText = "쿼리실행문" DBcomm.CommandType = "adCmdText" 'Text의 타입을 지정 'Text가 저장프로시저라면 adCmdStoredProc지정 DBcomm.Prepared = True '쿼리를 미리컴파일시킴 Set ObjRecord = DBcomm.Execute '쿼리실행하여 결과값 반환 |
출처 : http://cs.dit.ac.kr/cap/std/asp/html/asp5.html
'프로그래밍 > ASP' 카테고리의 다른 글
[강좌] ASP 에서 CLASS(클래스) 사용하기 (0) | 2010.04.23 |
---|---|
URL 자동링크 함수 (0) | 2010.04.23 |
ASP용 DB 클래스 (0) | 2009.06.13 |
이미지 저장시 리사이즈 (0) | 2009.06.04 |
ajaxed - free classic ASP Ajax Library (0) | 2009.06.04 |