3. ASP 고급 실험 Autumn, 2008 Keun Ho Ryu
내용 학습목표 학습내용 ADO 객체를 이용하여 데이터베이스를 사용하고 이를 활용할 수 있다. 데이터베이스 SQL 데이터베이스와의 연결 ADODB 관련 객체 Connection객체, Command객체, RecordSet객체
객체의 종류 스크립팅 객체 브라우저 객체 ASP 객체 ADO 객체 FileSystemObject, Dictionary Request, Response Server Application, Session ContextObject ADO 객체
데이터베이스 데이터베이스의 기본 개념 데이터베이스(이름:Pubs) 데이터베이스(이름:Test) 데이터베이스(이름:ADO) 비밀번호 아이디 이름 Members … 글내용 글쓴이 번호 Board 2000 5 222222 꼴뚜기 333333 111111 일련번호 3000 망둥어 1000 메뚜기 재고수량 단가 품명 Products 테이블명 데이터베이스명 필드 레코드 레코드 셋 필드명
MS-SQL Server 데이터베이스 : Access, Oracle, MS-SQL 등 MS-SQL
MS-SQL erver SystemTypes
MS-SQL Server SystemTypes- 문자열 관련 분류 데이터 형식 설 명 문자열 char 설 명 문자열 char 유니코드가 아닌 고정 길이 문자 데이터(최대 8,000자) varchar 유니코드가 아닌 가변 길이 문자 데이터(최대 8,000자) text 유니코드가 아닌 가변 길이 데이터(최대 231-1 자) 유니코드 nchar 고정 길이 유니코드 데이터(최대 4,000자) nvarchar 가변 길이 유니코드 데이터(최대 4,000자) ntext 가변 길이 유니코드 데이터(최대 230-1 자) 이진 binary 고정 길이 이진 데이터(최대 8,000바이트) varbinary 가변 길이 이진 데이터(최대 8,000바이트) image 가변 길이 이진 데이터(최대 231-1 바이트)
MS-SQL Server SystemTypes- 숫자 관련 분류 데이터 형식 설 명 숫자 (정수) bigint 설 명 숫자 (정수) bigint 정수 데이터(범위 : -263 ~ 263-1) int 정수 데이터(범위 : -231 ~ 231-1) smallint 정수 데이터(범위 : -215 ~ 215-1) tinyint 정수 데이터(0 ~255) bit 정수 데이터(1 또는 0 값) decimal 고정 정밀도 및 배율 숫자 데이터(-1038+1 ~ 1038–1) numeric decimal과 기능이 같음 (실수) float 부동 정밀도 숫자 데이터 (범위 : -1.79E + 308 ~ 1.79E + 308) real (-3.40E + 38에서 3.40E + 38)
MS-SQL Server SystemTypes- 날짜 관련 분류 데이터 형식 설 명 날짜 datetime 설 명 날짜 datetime 날짜 및 시간 데이터(1753년 1월 1일에서 9999년 12월 31일까지 1/300초의 정확성을 가짐) smalldatetime 날짜 및 시간 데이터(1900년 1월 1일에서 2079년 6월 6일까지 1분의 정확성을 가짐)
MS-SQL Server SQL-테이블 생성 CREATE TABLE 테이블명( 필드명 데이터형 [IDENTITY][널값 허용 여부][Primary Key], ... ) SQL-테이블 생성
MS-SQL Server SQL-데이터 입력(삽입) INSERT [INTO] 테이블명 (필드리스트) 테이블명 (필드리스트) VALUES (필드값리스트)
MS-SQL Server SQL-데이터 질의(검색) SELECT 필드리스트 FROM 테이블명 [WHERE 검색조건] [ORDER BY 필드 [ASC | DESC]
MS-SQL Server SQL-데이터 질의의 조건(Where)에 사용되는 연산자 분류 연산자의 종류 및 설명 연산자 설 명 설 명 산술 연산자 +(더하기), -(빼기), *(곱하기), /(나누기), %(나머지반환) 비트 연산자 &(비트 단위 AND), |(비트 단위 OR), ^(비트 단위 XOR) 비교 연산자 =(같음), >(보다 큼), <(보다 작음), >=(크거나 같음), <=(작거나 같음) <>(같지 않음), !>(보다 크지 않음), !<(보다 작지 않음), !=(같지 않음) 논리 연산자 ALL 모든 비교 집합이 TRUE인 경우 TRUE AND 두 개의 부울 식이 모드 TRUE인 경우 TRUE ANY 비교 집합 중 어느 하나가 TRUE인 경우 TRUE BETWEEN 피연산자가 범위 안에 있는 경우 TRUE EXISTS 하위 쿼리에 행이 포함된 경우 TRUE IN 피연산자가 식 목록 중 하나와 동일한 경우 TRUE LIKE 피연산자가 패턴과 일치하는 경우 TRUE NOT 다른 모든 부울 연산자의 값을 반대로 변경 OR 한 개의 부울 식이 TRUE인 경우 TRUE SOME 비교 집합 중 일부가 TRUE인 경우 TRUE
MS-SQL Server SQL-데이터 수정(Update) UPDATE 테이블명 SET 필드명=표현식 [WHERE 수정조건]
MS-SQL Server SQL-데이터 삭제 DELETE [FROM] 테이블명 [WHERE 삭제조건]
MS-SQL Server SQL-저장 프로시저 만들기 CREATE PROC[EDUER] 프로스저명 [;번호][{@입력인자 데이터형식}] AS SQL문장들......
MS-SQL Server SQL-저장 프로시저 실행 EXEC[UTE]] 프로시저명 [;번호] | {@입력인자의 값}
MS-SQL Server SQL-저장프로시저 삭제 DROP PROC[EDURE] 프로스저명
MS-SQL Server SQL-테이블 삭제
데이터베이스 연결 제공 데이터베이스 연결의 대표적인 방법 기타 ODBC(Open DataBase Connectivity) 관계형 데이터베이스 OLEDB 관계형 데이터베이스, 비관계형 데이터베이스 기타 DAO, RDO 웹 환경에 적합하지 않음
데이터베이스 연결-ODBC ODBC 설정 단계(1)
데이터베이스 연결-ODBC ODBC 설정 단계(2)
데이터베이스 연결-ODBC ODBC 설정 단계(3)
데이터베이스 연결-ODBC ODBC 설정 단계(4)
데이터베이스 연결-OLEDB OLEDB 설정 단계 더블클릭
데이터베이스 연결-OLEDB OLEDB 설정 단계
ADO 객체 모델 ADO 객체 모델 데이터베이스의 사용에 필요한 객체의 모음 ADO 객체의 종류 객체의 종류 설 명 설 명 Connection 데이터베이스와의 연결하고 SQL문을 실행. Command 여러 가지 명령 처리 방법 존재. Recordset 데이터베이스 질의를 통해 얻은 레코드 셋을 저장. Record 레코드 셋, 디렉터리, 모든 파일 시스템 파일에서 한 행(Row)을 유지 Stream Binary 데이터 또는 텍스트를 읽고, 쓰고, 조작.
ADO 객체 모델 Connection 객체의 기능 데이터 소스에 SQL명령을 실행 트랜잭션 처리 에러 처리 데이터베이스와의 연결 설정 Open, Close 데이터 소스에 SQL명령을 실행 Execute 트랜잭션 처리 BeginTrams, CommitTrans, RollbackTrans 에러 처리 Error
ADO 객체 모델 Connection 객체의 메소드 메소드 설 명 BeginTrans 새로운 트랜잭션을 시작 Cancel 설 명 BeginTrans 새로운 트랜잭션을 시작 Cancel 비동기적인 작업들을 취소 Close 기존 열린 연결 종료 CommitTrans 수정 내용을 저장하고 트랙잭션을 종료 Execute SQL 문장, 저장 프로시저 실행 Open 데이터 소스에 연결 OpenSchema 제공자(Provider)로부터 데이터베이스 스키마 획득 RollbackTrans 수정 내용을 취소하고 트랜잭션을 종료
ADO 객체 모델 Connection 객체의 속성 속성 설 명 Attributes 설 명 Attributes 기존 트랜잭션이 끝난 뒤 새로운 트랜잭션의 시작 여부를 제어 ConnectionString 데이터 소스 연결을 생성하는 데 필요한 정보 CommandTimeout 명령을 시도한 다음 기다리는 시간(초) ConnectionTimeout 연결을 시도한 다음 연결될 때까지 기다리는 시간(초) DefaultDatabase Connection 개체에 대해 기본적인 데이터베이스를 선언 Provider 연결 제공자 정보 표시 State 개체의 상태 표시 Version ADO 버전 표시 IsolationLevel 트랜잭션이 시작되었을 때 트랜잭션의 Isolation 수준을 결정 Mode 연결된 데이터에 대한 수정 권한을 설정
ADO 객체 모델 Connection 객체의 메소드 Open Connection객체.Open [ConnectionString], [UserID], [Password], [Option] Connection객체.Provider = 공급자 Connection객체.ConnectString="UserID=사용자계정;password=암호" Connection객체.Open Connection객체.DefaultDatabase = 데이터베이스명
CommandText에 의해 영향을 받은 레코드의 개수 ADO 객체 모델 Connection 객체의 메소드 Execute 반환값이 존재하지 않는 경우(Insert, Update, Delete) 반환값이 존재하는 경우 Connection객체.Execute CommandText, [RecordsAffected], [Options] Set RecordSet객체=Conncetion객체.Execute(CommandText, [RecordsAffected], [Options]) 또는 Set RS=Server.CreateObject("ADODB.RecordSet") ...... RS=Conncetion객체.Execute(CommandText, [RecordsAffected], [Options]) 상 수 값 설 명 adCmdUnknown 8 CommandText가 알 수 없는 명령 형식 adCmdText 1 CommandText가 SQL 문장과 같은 명령의 텍스트 adCmdTable 2 CommandText가 레코드셋의 근거가 되는 테이블 adCmdStoreProc 4 CommandText가 저장 프로시저 반환값이 없는 SQL문, 반환값 있는 SQL문, 테이블이름, 저장프로시저 CommandText에 의해 영향을 받은 레코드의 개수
ADO 객체 모델 ADO관련 상수 정의 상 수 값 설 명 adCmdUnknown 8 상 수 값 설 명 adCmdUnknown 8 CommandText가 알 수 없는 명령 형식 adCmdText 1 CommandText가 SQL 문장과 같은 명령의 텍스트 adCmdTable 2 CommandText가 레코드셋의 근거가 되는 테이블 adCmdStoreProc 4 CommandText가 저장 프로시저
ADO 객체 모델 ADO관련 상수의 사용 Adovbs.inc의 상수 사용 <!--#include virtual="adovbs.inc" --> <!--METADATA TYPE="typelib" NAME="ADODB Type Library" FILE = "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" -->
ADO 객체 모델 Connection 객체의 메소드 Close Connection객체.Close ‘ 연결만 닫음 Connection객체 = Nothing ‘객체를 소멸시킴
ADO 객체 모델 Connection 객체의 메소드 트랜잭션 관련 처리 Connection객체.[BeginTrans | CommitTrans | RollbackTrans]
ADO 객체 모델 예제
BoardWrite.asp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <HTML> <Script Language="VBScript"> Sub btnSend_OnClick If(WriteForm.Writer.value = "") Then alert "이름을 입력해 주세요..." Exit Sub End If If(WriteForm.Title.value = "") Then alert "제목을 입력해 주세요..." End If If(WriteForm.Contents.value = "") Then alert "글을 작성해 주세요..." End If If(WriteForm.pwd.value = "") Then alert "비번은 수정/삭제시 필요합니다." End If WriteForm.submit End Sub </Script> <Body> <Form Name="WriteForm" Method="Post" action="BoardDB.asp"> <Table><Caption>새글쓰기</Caption> <Tr><Td>글쓴이</Td> <Td><input type="text" name="Writer" size="20"></Td></Tr> <Tr><Td>e-mail</Td> <Td><input type="text" name="Email" size="30"></Td></Tr> <Tr><Td>homepage</Td> <Td><input type="text" name="Homepage" size="30"></Td></Tr> <Tr><Td>글제목</Td> <Td><input type="text" name="Title" size="30"></Td></Tr> <Tr><Td>글내용</Td> <Td> <textarea wrap="hard" name="Contents" rows="10" cols="50"> </textarea></Td></Tr> <Tr><Td>비밀번호</Td> <Td><input type="password" name="pwd" size="8"><br></pre></Td></Tr> <Tr><Td Colspan="2"> <Center><input type="button" value="글올리기" name="btnSend"> <input type="reset" value="다시쓰기" name="reset"><br></Center></Td></Tr> </Table> </Form> </BODY> </HTML>
BoardDB.asp 1 2 3 4 5 6 7 8 9 10 <% Option Explicit Dim Writer, Email, Homepage, Title, Pwd, Contents, strConnect, SQL Dim objCon, RS, intNumber Writer=request("Writer") Email=request("Email") Homepage=request("Homepage") Title=request("Title") Pwd=request("pwd") Contents=request("Contents")
DB 연결 질의 수행 반환된 레코드셋의 처리 SQL문 문자열 만들기 SQL문 실행 (트랜잭션처리) 연결 끊기 및 객체 소멸 BoardDB.asp 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 Set objCon=Server.CreateObject("ADODB.Connection") objCon.Provider="SQLOLEDB.1" strConnect="Password=sa;User ID=sa;Data Source=(local);Initial Catalog=ADO;" objCon.ConnectionString=strConnect objCon.Open Set RS=objCon.Execute("Select Max(num) from Board") If IsNull(RS(0)) Then intNumber=1 Else intNumber=rs(0)+1 End If SQL="Insert Into Board(Writer, Email, Homepage, Title, Pwd, num, " SQL=SQL & "Writeday, ReadNum, Contents) Values" SQL=SQL & "('" & Writer & "' ,'" SQL=SQL & Email & "','" SQL=SQL & Homepage & "','" SQL=SQL & Title & "','" SQL=SQL & pwd & "'," SQL=SQL & intNumber & ",'" SQL=SQL & now() & "', 0 , '" SQL=SQL & Contents & "')" objCon.BeginTrans objCon.Execute SQL objCon.CommitTrans 'objCon.RollbackTrans RS.close objCon.Close set Rs=Nothing set objCon=Nothing Response.Write "성공" 'Server.Transfer("BoardList.asp") %> DB 연결 질의 수행 반환된 레코드셋의 처리 SQL문 문자열 만들기 SQL문 실행 (트랜잭션처리) 연결 끊기 및 객체 소멸
ADO 객체 모델 Command 객체의 기능 SQL문과 저장 프로시저를 실행
ADO 객체 모델 Command 객체의 메소드 메 소 드 설 명 CreateParameter 설 명 CreateParameter Parameters 컬렉션에 새로운 Parameter 객체 생성 Execute 명령어 실행 Cancel 비동기적인 명령 작업을 취소
ADO 객체 모델 Command 객체의 속성 속성 설 명 ActiveConnection 설 명 ActiveConnection Command 객체에서 사용하는 Connection 객체 CommandTimeout 명령을 시도한 다음 기다리는 시간(초) CommandText 실행할 SQL문 CommandType 실행할 명령어의 타입 Prepared 명령문을 실행하기 전에 컴파일 된 버전의 저장 여부를 결정 Properties Command 객체의 모든 속성 등을 저장하는 컬렉션 State Command 객체의 상태
ADO 객체 모델 Command 객체의 메소드 DB 연결(ActiveConnection 속성) Set objCon=Server.Create("ADO.Connection") Set objCom=Server.Create("ADO.Command") objCon.Open = "연결 문자열" objCom.ActiveConnection = objCon Set objCom=Server.Create("ADO.Command") objCom.ActiveConnection = "연결문자열"
ADO 객체 모델 Command 객체의 메소드 Execute 반환값이 없는 경우 반환값이 있는 경우(RS는 레코드 셋) Command객체.Execute([RecoedAffected], [Parameters], [Options]) Set RS=Command객체.Execute([RecoedAffected], [Parameters], [Options])
ADO 객체 모델 Command 객체의 메소드 CreateParameter 메소드 Set parameter = Command객체.CreateParameter([Name], [Type], [Direction], [Size], [Value]) 객체의 이름 객체의 최대 크기 객체에 지정된 값 객체의 데이터 형식(SQL:DataTypeEnum상수) char:adchar, varchar:adVarChar, int:adInteger, text:adVarChar 등 0: adParamUnknown, 속성을 알 수 없음을 표시 1: adParamInput, 입력 변수임을 표시(기본값) 2: adParamOutput, 출력 변수임을 표시 3: adParamInputOutput, 입력, 출력 동시 지원 4: adParamReturnValue, 반환 값임을 표시
ADO 객체 모델 Command 객체의 메소드 Parameters 컬렉션의 메소드 사용 형식의 예 메소드 설 명 Append 설 명 Append 컬렉션에 Parameter 객체를 추가 Delete 컬렉션에 Parameter 객체를 제거 Refresh 컬렉션의 Parameter 정보 얻어옴 • @AA 매개변수에 대한 정의(저장 프로스저에서 정의) Command객체.Parameters.Append Command객체.CreateParemeter("@AA", adVarChar, adParamInput, 50, "안녕하쇼") • @BB 매개변수에 대한 정의(저장 프로스저에서 정의) Command객체.Parameters.Append Command객체.CreateParemeter("@BB", adInteger, adParamInput, , 5)
ADO 객체 모델 예제
저장 프로시저 생성
Set objCon=Server.CreateObject("ADODB.Connection") 요청 자료 넘겨 받기 Writer=request("Writer") / Email=request("Email") / Homepage=request("Homepage") Title=request("Title") / Pwd=request("pwd") / Contents=request("Contents") Set objCon=Server.CreateObject("ADODB.Connection") objCon.Provider="SQLOLEDB.1" strConnect="Password=sa;User ID=sa;Data Source=(local);Initial Catalog=ADO;" objCon.ConnectionString=strConnect objCon.Open Set objCom=Server.CreateObject("ADODB.Command") objCom.ActiveConnection=objCon objCom.CommandText = "MaxQuery" objCom.CommandType = adCmdStoredProc Set RS=objCom.Execute If IsNull(RS(0)) Then intNumber=1 Else intNumber=RS(0) + 1 End If
objCom.Parameters.refresh objCom.CommandText = "WriteInsert" objCom.CommandType = adCmdStoredProc objCom.Parameters.Append objCom.CreateParameter("@Writer", adVarChar, adParamInput, 12, Writer) objCom.Parameters.Append objCom.CreateParameter("@Email", adVarChar, adParamInput, 50, Email) objCom.Parameters.Append objCom.CreateParameter("@Homepage",adVarChar,adParamInput,50,Homepage) objCom.Parameters.Append objCom.CreateParameter("@Title", adVarChar, adParamInput, 20, Title) objCom.Parameters.Append objCom.CreateParameter("@Pwd", adVarChar, adParamInput, 8, Pwd) objCom.Parameters.Append objCom.CreateParameter("@Num", adInteger, adParamInput, ,intNumber) objCom.Parameters.Append objCom.CreateParameter("@WriteDay", adVarChar, adParamInput, 30, now()) objCom.Parameters.Append objCom.CreateParameter("@ReadNum", adInteger, adParamInput,,0) objCom.Parameters.Append objCom.CreateParameter("@Contents", adVarchar, adParamInput, 50, Contents) objCon.BeginTrans objCom.Execute cntRecordsAffected, , adExecuteNoRecords objCon.CommitTrans 'objCon.RollbackTrans objCon.Close set Rs=Nothing set objCon=Nothing set objCom=Nothing Response.Write "성공" 'Server.Transfer("BoardList.asp") %>
ADO 객체 모델 RecordSet 객체의 기능 SQL문의 실행으로 반환되는 결과를 저장하는 역할 RecordSet을 이용하여 추가(AddNew), 수정(UpDate)등을 작업을 수행 레코드 사이를 이동하면서 필요한 데이터를 읽어 들임
ADO 객체 모델 RecordSet 객체의 기능 SQL문의 실행으로 반환되는 결과를 저장하는 역할 RecordSet을 이용하여 추가(AddNew), 수정(UpDate)등을 작업을 수행 레코드 사이를 이동하면서 필요한 데이터를 읽어 들임
RecordSet(RS) Absolutepage=1 Absolutepage=2 MoveFirst PageSize=5 RS.BOF Absolutepage=2 MoveFirst 5 PageSize=5 Absolutepage=3 MoveLast RS.EOF 5 Absolutepage=4 1 PageCount=4 페이지 나누기 전 페이지 나눈 후
ADO 객체 모델 RecordSet 객체의 메소드 MoveFirst MoveLast 메소드 설 명 Open 커서 열기 RS.BOF RS.EOF MoveFirst MoveLast 메소드 설 명 Open 커서 열기 Close 열린 개체 닫기 AddNew 새로운 레코드 생성 Delete 현재 레코드 삭제 Update 기존 레코드 변경 사항 저장 Move 현재 레코드 포인터를 이동 MoveFirst 처음 레코드로 이동 MoveLast 마지막 레코드로 이동 MoveNext 다음 레코드로 이동 MovePrevious 이전 레코드로 이동
RecordSet 객체의 속성 ADO 객체 모델 속성 설 명 AbsolutePage 현재 레코드가 위치한 절대 페이지 설 명 AbsolutePage 현재 레코드가 위치한 절대 페이지 AbsolutePosition 현재 레코드가 순서 위치 ActiveConnection 레코드셋에 있는 Connection 개체 BOF 현재 레코드 위치가 첫 번째 레코드에 있으면 TRUE EOF 마지막 레코드 다음에 레코드 위치가 있으면 TRUE CursorType 커서 타입 LockType 락 타입 PageSize 하나의 페이지를 구성하는 레코드 수 지정 PageCount 레코드셋이 가지고 있는 데이터 페이지 수 RecordCount 현재 레코드셋에 있는 레코드 수 Filter 레코드셋에 대한 데이터 필터를 설정하거나 반환 현재 레코드셋 내에 있는 레코드의 개수
adLockBatchOptimistic ADO 객체 모델 RecordSet 객체의 메소드 Open RecordSet.Open Source ActiveConnection, [Cursor타입], [Lock타입], [옵션] Command 객체, SQL문장, 테이블 이름, 저장 프로시저 기존의 Connection 객체, 연결 문자열 adLockReadOnly adLockPessimistic adLockOptimistic adLockBatchOptimistic adOpenStatic : 3 adOpenForwardOnly : 0 adOpenDynamic : 2 adOpenKeyset : 1 (페이징)
<% Option Explicit Dim page, strConnect, objCon, RS, SQL, TotalPage, i '페이징의 적용 page=request("page") if page="" then page=1 end if Set objCon=Server.CreateObject("ADODB.Connection") objCon.Provider="SQLOLEDB.1" strConnect="Password=sa;User ID=sa;Data Source=(local);Initial Catalog=ADO;" objCon.ConnectionString=strConnect objCon.Open Set RS=Server.Createobject("ADODB.RecordSet") 'RecordSet을 열기 전에 PageSize 지정 Rs.Pagesize=5 '커서 타입 반드시 지정해야 페이징 됨 SQL="Select * From Board Order By num Desc" RS.Open SQL, objCon, 1 %>
<HTML><BODY> <Table border="1"> <Caption><center> <%If RS.BOF or RS.EOF Then %> 등록된 글이 없습니다. <%Else Totalpage=RS.Pagecount '전체 페이지수 대입((레코드 수/PageSize) 올림) Rs.Absolutepage=page '지정된 페이지의 첫 레코드로 위치 이동 %> 단순게시판<a href="BoardWrite.asp">(새글)</a> </Center></Caption> <Th>번호</Th><Th>글쓴이</Th><Th>제목</Th><Th>조회수</Th><Th>날짜</Th> <% i=1 Do until RS.EOF or i>RS.Pagesize <Tr><Td><%=RS("num")%></Td> <Td><A href="mailto:<%=RS("Email")%>"><%=RS("Writer")%></A></Td> <Td> <A href="Contents.asp?idx=<%=RS("idx")%>"><%=RS("Title")%></A></Td> <Td><%=RS("Readnum")%></Td> <Td><%=Year(RS("Writeday")) & "/" %> <%=Month(RS("Writeday")) & "/" %> <%=Day(RS("Writeday"))%></Td> </Tr> <% RS.Movenext i=i+1 Loop RS.Close objCon.Close Set RS=Nothing Set objCon=Nothing %> </Table>
<%If Cint(page) > 1 Then%> <A href="BoardList.asp?page=<%=Page-1%>">이전</A> | <%End If%> <%If Cint(Page) <> Cint(Totalpage) then For i=1 To Totalpage %> <A href="BoardList.asp?Page=<%=i%>"><%=i%></A> | <% Next %> <A href="BoardList.asp?page=<%=page+1%>">다음</A> <%=Page%>/<%=Totalpage%>Pages <Br> <Form method="post" action="search_result.asp"> <Select name="search"> <Option value="Title">글제목</option> <Option value="Writer">글쓴이</option> <Option value="Contents">글내용</option> </Select> <Input type="text" name="searchstring" size="20"> <Input type="submit" value="검색"> </Form> <%End If%> </Center> </Body> </Html>
데이터베이스 열기 레코드셋 열기 레코드셋 데이터 처리 레코드셋 종료 데이테베이스 연결 종료
2. OLE DB와 ADO OLE DB 제공자를 통해서 데이터를 다룸 프로그램에서 여러 형태의데이터를 다룰 수 있도록 제공된 컴포넌트 중간 역할을 하는 인터페이스 ADO 객체를 통해 데이터처리 요구 => OLE DB가 실제데이터 처리하여 요구사항을 넘겨줌 데이터 제공자 ADO 객체 ODBC 드라이버 OLE DB DB
. 데이터 제공자 . ADO 와 데이터 베이스 실제로 데이터를 처리해주는 드라이버와 엔진을 말함 ODBC 가 가장 대표적인 예 실제로 데이터를 처리해주는 드라이버와 엔진을 말함 ODBC 가 가장 대표적인 예 ADO 객체는 데이터 제공자가 지원하는 기능을 이용 . ADO 와 데이터 베이스 데이터 베이스를 다루는 객체
3. ADO 객체 모델 데이터 베이스를 다루는 기본 과정 데이터 베이스 연결 (어느 데이터 베이스에 연결할지를 지정) => DSN 을 통해서 지정하고 연결 2. 명령 실행 : SQL 문을 실행하고나 명령실행 => 레코드 검색, 추가, 삭제, 수정등 3. 실행 결과 : 조건에 맞는 레코드 검색시 레코드 셋으로 가져옴 (실제로 이용하는 값은 각 레코드가 가진 필드값)
. ADO 객체 구성 ADO 객체 모델 : 데이터 베이스를 사용하는 데 필요한 객체 Connection 객체 : 데이터 베이스 연결 Command 객체 : SQL 쿼리 실행 Recordset 객체 : 검색해서 얻어진 레코드 집합 Record 객체 Stream 객체 Parameter 객체 Field 객체 Error 객체 Page 291 ADO 객체 모델 그림 참조
4. ADO 객체 Connection 객체 Comand 객체 Recordset 객체 각 객체마다 명령을 실행하고 결과를 받아옴
. Connection 객체 데이터 소스와 연결
. Command 객체 데이터 소스에 데이터를 다루는 명령을 보낼때 사용 Connection 객에서도 SQL 명령을 보내서 실행 가능(명령 처리 단순) 보통 SQL 실행결과로 레코드를 리턴하지 않는 경우에 많이 사용 (데이터 추가/수정/삭제 )
. Recordset 객체 Connection 객체와 Command 객체를 이용해서 명령을 실행 한 다음 받아오는 결과는 레코드 셋 형태이고, Recordset 객체를 통해 데이터 다룸 레코드 셋이란 여러 레코드를 담고 있는 객체 선택된 레코드는 하나이며 레코드 선택을 바꾸어가면서 데이터 값을 가져오거나 변경 가능 레코드 검색뿐만아니라 추가/삭제/수정도 가능
5. ADO 상수 <!- - include file=“adovbs.inc”- -> 파일 이름은 adovbs.inc => VBScript 를 이용해서 필요한 상수 정의 파일 포함 방법 <!- - include file=“adovbs.inc”- -> C:/Program Files / Common Files/System/ado 폴더에 존재 자바스크립트를 사용하는 파일이라면 adojavas.inc 파일을 포함 상수 파일을 포함하지 않고 타입 라이브러리를 선언해 주면 상수를 별도로 파일로 포함하지 않고서도 바로 사용가능 <! - - MetaData Type=“typelib” file=“c:/program files/Common Files/System/ado/msado15.dll - -> 데이터베이스를 사용하는 웹애플리케이션인 경우 DB 사용이 여러 페이지에 걸쳐 일어나므로 모든 페이지에서 사용할 수 있도록 Global.asa 파일에 한번만 선언하여 사용
6. 데이터 소스 연결 어디에 있는 데이터베이스를 사용할 것인가 선택하는 과정 (어떤 종류의 데이터베이스 이며, 어디에 위치하는 지 등등의 정보필요)
. 연결 문자열 DSN 없이 연결 문자열을 구성해서 DB에 연결 1. ODBC 로 연결(ODBC드라이버선택(“SQL Server”),서버이름,데이터베이스 이름, 사용자 ID,암호지정) => Driver={SQL Server};Server=(local);Database=Pubs;UID=sa;PWD=; 2. OLE DB 제공자 이용(OLE DB제공자 지정(“SQLOLEDB”), 데이터 소스에 서버이름, 데이터베이스이름,사용자 ID, 암호 지정) Provider=SQLOLEDB;Data Source=(local);Initial Catalog=WebDBs; UserId=sa;Password=; => Provider=SQLOLEDB;Data Source =(local); Database=Pubs;UID=sa;PWD=;
7. 데이터 베이스 연결 – Connection 객체 Connection객체의 ProgID => ADODB.Connection Connection객체를 생성한 다음, 사용하고자 하는 데이터 소스를 열어 연결(Connection 객체의 open 메서드 이용 => 연결 문자열은 데이터 소스 이름이나 드라이버 이름으로 구성한 연결 문자열을 주어도 됨) Set DBConn = Server.CreateObject(“ADODB. Connection”) DBConn.Open “WebDBs” DB 처리 Connection 객체 사용이 끝났으면 연결을 닫고 변수에 Nothing을 할당함으로 사용하고 있던 리소스를 해제 DBConn .Close DBConn = Nothing
. Connection 객체 이용 데이터 베이스를 이용할때 마다 필요한 객체므로 데이터베이스를 사용하는 빈도수가 높은 경우 처음에 미리 한번 생성해 두었다가 반복해서 사용하는 것이 효율 => Connection 객체를 생성한 다음 이것을 Session 변수 또는 Application 변수로 보관해 놓고 이용 Global.asa 파일에서 지정
. Global.asa – Session 변수 사용예 <script language="vbscript" runat="server"> Sub Session_OnStart() ' Connection 객체 생성 및 열기 Set Session( "WebDB" ) = Server.CreateObject("ADODB.Connetion") Session( "WebDB" ).open "WebDBs" End Sub Sub Session_OnEnd() ' Connection 객체 닫기 및 소멸 Set Session( "WebDB" ).Close Set Session( "WebDB" ) = Nothing </script>
8. 데이터베이스 다루기-Recordset Recordset 객체 생성 ADO 객체 모델에서 가장 많이 사용하는 객체 이용방법 Recordset 객체 생성 Open 메서드로 레코드셋 가져옴 (인자 : 테이블이름,DSN 지정) Set rs = Server.CreateObject(“ADODB.Recordset”) rs.Open “Member”,”WebDBs” ‘레코드셋 다루기 rs.Close rs = Nothing
. 레코드셋 얻어내는 방법 Recordset 객체를 생성하여 Open 메서드를 이용해서 가져오는 방법 Connection 객체를 생성한 다음 SQL 문을 실행하여 그 결과로 레코드셋을 가져오는 방법 set DBConn = Server.CreateObject("ADODB.Connetion") DBConn.Open "DSN=WebDBs;UID=sa;PWD=;" sql = “select * from titles” set rs = DBConn.Execute(sql) DBConn.Close DBConn = Nothing
.커서(Cursor)와 커서타입 adOpenStatic – 정적 커서(레코드셋의 복사본 제공, 모든 이동형태가능) 커서 : 레코드 셋에서 현재 레코드를 가르키는 포인터 커서 타입 : 커서를 옮기는 방식(레코드를 이동 => 디폴트값:adOpenForwardOnly) adOpenStatic – 정적 커서(레코드셋의 복사본 제공, 모든 이동형태가능) adOpenForwardOnly – 전진전용커서 (정적커서와 비슷, 이동은 앞으로만) adOpenDynamic – 다이나믹커서(레코드셋 갱신 , 모든 이동형태 가능) adOpenKeyset – 키셋 커서 (레코드셋 갱신(다른 사용자가 추가한 레코드만 볼수 없음), 모든 이동형태 가능) 다이나믹하게 변하는 레코드 셋을 다루는 것이 관리하는 데 많은 작업을 요구 ADO 상수 포함후 사용
. 락(lock)과 락 타입 락(lock) : 한 사람이 사용하는 동안 다른 사람이 접근 불가능 (한 사용자가 레코드를 바꾸기 전에 다른 사용자가 바꿀 수 없음) 사용이 다 끝난다음 락(Lock)을 풀어줌 락타입 adLockReadOnly: 데이터를 바꿀 수 없으며 읽을 수만 있음 adLockPessimistic: 레코드 단위로 락을 걸며, 레코드 편집을 하는 순간부터 레코드에 락을 건다. adLockOptimistic : 레코드 단위로 락을 걸며, Update 메서드를 부르는 순간에만 락을 건다. adLockBatchOptimistic : 배치 갱신 모드 요구
. 레코드 셋 이동 EOF : 레코드셋 마지막을 읽었을 때 true 값을 가짐 MoveNext : 그 다음 레코드로 이동 레코드 셋을 열고 난 후 레코드 포인터를 바꾸면서 데이터를 다룸 레코드 이동 관련 Recordset 객체의 메서드/프로퍼티 EOF : 레코드셋 마지막을 읽었을 때 true 값을 가짐 MoveNext : 그 다음 레코드로 이동 MovePrevious : 이전 레코드로 이동
. 레코드 필드 값 rs.Fileds(“UserID”) rs.(“UserID”) rs.Fileds( 0 ) rs.( 0 ) Recordset 객체의 Filed 콜렉션으로 접근 Filed 콜렉션은 디폴트 콜렉션으로 Filed콜렉션 이름 생략가능 rs.Fileds(“UserID”) rs.(“UserID”) 필드의 이름을 모르는 경우 인덱스로 접근 가능 rs.Fileds( 0 ) rs.( 0 )
. 필드 이름과 값 보이기 rs.Filed( 0 ).value rs.Filed( 0 ).name 레코드셋에 필드 개수 (count 사용) 구하여 레코드의 전체 필드 이름/값 구하기 <% for i=0 to rs.fileds.count-1 Response.Write rs.fields(i).name Response.Write rs.fields(i).value next %>
. 레코드 셋 가져오기 Recordset 객체의 Open 메서드를 이용하는 방법 Connection 객체의 Execute 메서드를 실행하고 결과를 리턴받는 방법
. 레코드셋 관련 예제– Recordset.asp <% set DBConn = Server.CreateObject("ADODB.Connection") DBConn.Open "DSN=WebDBs;UID=sa;PWD=;" ' SQL 문을 실행, 레코드셋 객체를 얻는다. set rs = DBConn.Execute( "select * from titles" ) while not rs.EOF Response.Write rs("title_id") & "," & rs("title") & "<br>" ' 다음 레코드로 이동 rs.MoveNext wend ' 데이터베이스 닫기 DBConn.Close set DBConn = Nothing %>
. 레코드셋 관련 예제 결과
. 레코드셋 관련 예제– Recordset2.asp <% set DBConn = Server.CreateObject("ADODB.Connection") DBConn.Open "Driver={SQL Server};Server=(local);Database=Pubs;UID=sa;PWD=;" ' SQL 문을 실행, 레코드셋 객체를 얻는다. set rs = DBConn.Execute( "select * from titles" ) while not rs.EOF Response.Write rs("title_id") & "," & rs("title") & "<br>" ' 다음 레코드로 이동 rs.MoveNext wend ' 데이터베이스 닫기 DBConn.Close set DBConn = Nothing %>
. 레코드셋 관련 예제 결과
. 레코드셋 관련 예제– Recordset3.asp <% set DBConn = Server.CreateObject("ADODB.Connection") DBConn.Open "Provider=SQLOLEDB;Data Source =(local); Database=Pubs;UID=sa;PWD=;" ' SQL 문을 실행, 레코드셋 객체를 얻는다. set rs = DBConn.Execute( "select * from titles" ) while not rs.EOF Response.Write rs("title_id") & "," & rs("title") & "<br>" ' 다음 레코드로 이동 rs.MoveNext wend ' 데이터베이스 닫기 DBConn.Close set DBConn = Nothing %>
. 레코드셋 관련 예제 결과
. 레코드셋 활용예 – ShowAll.asp <html> <link href="../common/basic.css" rel=stylesheet type=text/css> <body> <h3> 테이블 보기 </h3> <hr> <% ' Connection 객체를 DB와 연결 Set DBConn = Server.CreateObject("ADODB.Connection") DBConn.Open "DSN=WebDBs;UID=sa;PWD=;" ' SQL 질의 실행 및 Recordset 저장 Set rs = DBConn.Execute( "select title_id,title,type from titles" ) %>
. 레코드셋 활용예 – ..이어서 <table border> <% ' 필드 이름 보여주기 Response.Write "<tr bgColor=#f3f3f3>" For index =0 to ( rs.fields.count-1 ) Response.Write "<td><b>" & rs.fields(index).name & "</b></td>" Next Response.Write "</tr>"
. 레코드셋 활용예 – ..이어서 ' 필드 값 보여주기 레코드셋 끝을 읽을 때까지 반복 실행 while Not rs.eof Response.Write "<tr bgColor=#f3f3f3>" for i=0 to (rs.fields.count-1) Response.Write "<td>" & rs( i ) & "</td>" next Response.Write "</tr>" ' 다음 레코드로 이동합니다. rs.MoveNext wend ' 레코드셋과 연결을 닫는다. rs.close DBConn.close %> </table> </body> </html>
9. 레코드셋 활용예 -결과 9. 레코드셋 활용예