제11장Client/Server활용 - DUKSUNGdblab.duksung.ac.kr/lectures/dbprogram/chap11.pdf ·...
Transcript of 제11장Client/Server활용 - DUKSUNGdblab.duksung.ac.kr/lectures/dbprogram/chap11.pdf ·...
-
1
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 1
제11장 Client/Server활용
11.1 Visual Basic 응용
11.2 Java 응용
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 2
11.1절 Visual Basic 응용
ODBC 설정
VB에서 데이터베이스에 연동하려면 ODBC (Open DataBase Connectivity)가 필요
-
2
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 3
ODBC 설정(계속)
제어판에서 데이터 원본(ODBC)를 선택
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 4
ODBC 설정(계속)
시스템 DSN에서 추가를 선택
-
3
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 5
ODBC 설정(계속)
Oracle ODBC Driver를 선택한 후 마침을 누른다.
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 6
ODBC 설정(계속)
서버 이름과 사용자 ID를 입력
Data source name은 임의로 부여해도되지만 TNS service name은 오라클 클라이언트 프로그램을 설치한 후 Net8 Assist를 설정할 때 네트워크 서비스 이름으로 입력한 이름이 자동으로 입력
-
4
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 7
ODBC 설정(계속)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 8
ODBC 설정(계속)
-
5
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 9
VB 구성
VB 6.0으로 데이터베이스를 연결
데이터베이스 : 오라클
개발 도구 : VB 6.0
데이터베이스 접근 방법 : ADO
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 10
VB에서 데이터베이스 접속
Dim db As Connection
Set db = New Connection
db.CursorLocation = adUseClient
db.Open “PROVIDER=MSDASQL;dsn=sam;uid=dblab;pwd=dblab401;”
-
6
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 11
VB 기초 응용
데이터 검색 : Select
데이터 추가 : Insert
데이터 삭제 : Delete
데이터 갱신 : Update
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 12
데이터 검색 : Select‘Recordset 정의
Set adoPrimaryRS = New Recordset
‘SQL문장을 adoPrimaryRS에 넣은 것으로 c_dist의 코드가 '00'인 테이터를가져온다.
adoPrimaryRS.Open "select
C_NO,C_NAME,C_ADDR,C_PHONE,C_DIST
from CUSTOMER where c_dist='00'", db, adOpenStatic,
adLockOptimistic
Dim oText As TextBox
‘입력란을 데이터 제공자에 바인딩한다.For Each oText In Me.txtFields
Set oText.DataSource = adoPrimaryRS
Next
SetButtons True
-
7
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 13
데이터 검색 : Select(계속)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 14
데이터 추가 : Insertt_cno = "780321-2231101";
t_no = "AP100002";
Temp = 11
t_money = 150000;
/* deposit 테이블에 입/출금 내역을 기록 */‘가지고온 데이터 레코드 중에서 맨 처음으로 간다.
RS.MoveFirst
'가지고온 일련번호를 temp에 넣는다.
temp = Val(RS("serial"))
'일련번호를 확인한다.
MsgBox temp, , "temp"
'deposit 테이블에 데이터 생성
mysql = "insert into deposit values ('" & t_cno & "','" & t_no & "', " & temp & ", " & t_money & ", sysdate);"
'Query 확인
MsgBox mysql
-
8
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 15
데이터 추가 : Insert(계속)'만약 입금이면 그대로 입력하고
If optin.Value = True Then
temp_kind = ""
'만약 출금이면 '-'를 입력한다.
ElseIf optout.Value = True Then
temp_kind = "-"
End If
'temp_kind 와 입/출금 금액을 tempString에 넣는다.
tempString = temp_kind & temp_t_money
'RS를 실행한다.
Set RS = myconn.Execute(mysql)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 16
데이터 추가 : Insert(계속)
-
9
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 17
데이터 삭제 : Delete
c_name = “김지수”/* customer 테이블에서 변수 c_name을 갖는 고객 삭제*/
‘가지고온 데이터 레코드 중에서 맨 처음으로 간다.RS.MoveFirst
‘customer 테이블에 데이터 삭제mysql = “"delete from customer where c_name = ?"
'RS를 실행한다.
Set RS = myconn.Execute(mysql)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 18
데이터 갱신 : Update
/* customer 테이블에서 변수 c_name을 갖는 고객 갱신*/
‘가지고온 데이터 레코드 중에서 맨 처음으로 간다.RS.MoveFirst
‘customer 테이블에 데이터 갱신mysql = "update customer set c_phone = ? where c_name = ?"
'RS를 실행한다.
Set RS = myconn.Execute(mysql)
-
10
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 19
11.1절 Visual Basic 응용예제
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 20
메뉴 구성
메뉴 구성은 프린터설정, 끝내기, 개인고객과 기업고객을 포함하는 고객관리와지점관리, 예금거래신청, 입/출금, 입출금내역 출력을 포함한 예금, 대출거래신청, 상환, 상환내역 관리를 포함한 대출, 예금상품과 대출상품을 포함한 상품관리로 나뉜다.
-
11
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 21
메뉴 디자인
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 22
VB 구성 요소
[프로젝트(p)] → [구성요소]를 선택하여추가
-
12
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 23
ADO 방식 연결
[프로젝트(p)] → [참조]를 선택하여 추가
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 24
VB 구성 요소(계속)
다음의 컨트롤들을 사용
Crystal Report Control 4.6,
Microsoft Common Dialog Control 6.0,
Microsoft DataGrid Control 6.0,
Microsoft Gierarchical FlexGrid Control 6.0,
Microsoft Masked Edit Control 6.0,
Microsoft Rich Textbox Control 6.0,
Microsoft Windows Common Controls 6.0
-
13
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 25
메뉴 구성도
frmborrow_print(form)상환 내역 출력
frmdeposit_kind(form)예금상품
frmloan_kind(form)대출상품
frmborrow(form)상환
frmloan(form)대출거래신청
frmdeposit_print(form)입출금 내역 출력
frmdeposit(form)입/출금
frmaccount(form)입금거래신청
frmbranch(form)지점관리
frmenterprise(form)기업고객
frmpersonal(form)개인고객
Form 이름메뉴 이름
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 26
프린터 설정
Microsoft Windows Common Controls 6.0을선택하여 프린터 설정
-
14
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 27
화면 출력
Private Sub subprint()
'ReportFile을 지정
Rpt1.ReportFileName = App.Path& ".\customer.rpt"
'출력
Rpt1.Action = 1
End Sub
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 28
화면 출력(계속)
-
15
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 29
11.2절 Java 응용
JDK 환경설정
JDBC란?
JDBC2.0 특징
Java응용 예제
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 30
Java2 SDK 환경
-
16
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 31
Java2 SDK설치
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 32
Java2 SDK설치(계속)
-
17
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 33
Java2 SDK설치(계속)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 34
Java2 SDK 환경 설정
-
18
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 35
Java2 SDK 환경변수 확인
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 36
JDBC란?
자바에서 데이터베이스와의 연동을 위한API
JDBC이용한 DB연동 기본과정
접속(Connection)
트랜잭션 처리(Transaction)
접속 해제(Disconnection)
-
19
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 37
JDBC 접속
접근하고자 하는 데이터베이스에 사용가능한 드라이버의 선택
데이터베이스에 접근할 수 있는 정보
드라이버 종류Type –1 : JDBC-ODBC bridge driverType –2 : Native-API partly-java driverType –3 : JDBC-Net pure java driverType –4 : Native-protocol pure java driver
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 38
JDBC 환경변수 설정
Native-protocol pure java driverWindows 95/98의 경우
-
20
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 39
JDBC 환경변수 설정(계속)
Windows 2000에서 환경설정
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 40
JDBC 환경변수 설정(계속)
Windows 2000에서 환경설정 확인
-
21
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 41
JDBC에서 정의된 추상클래스
ConnectionConnection
StatementStatement
PreparedStatementPreparedStatement
CallableStatementCallableStatement
ResulSetResulSet
create
State
ment
prepareStatement
prepareCall
execute
executeQuery
getMoreResults
exec
uteQu
ery
DataTypesDataTypes : Date, Time,: Date, Time,
TimeStampTimeStamp, Numeric, , Numeric,
BuiltBuilt--in Java types, etcin Java types, etcgetXXX
getXXX
setXXX
DriverManagerDriverManager
getConnection
Commit, rollback
executeUpdate
exec
uteUp
date
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 42
JDBC에서 데이터베이스 접속//======= 데이터베이스 관련변수 선언 시작 ===========//
static Connection conn = null;
static String driver = "oracle.jdbc.driver.OracleDriver";
static String url = "jdbc:oracle:thin:@192.1.1.1:1521:ora8i";
static String username = "dblab";
static String passwd = "dblab401";
//========== 데이터베이스 관련변수 선언 끝 ============//
// db connection
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, passwd);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException se) {
System.out.println(se.getMessage());
}
-
22
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 43
JDBC를 이용한 질의문장
Statement 클래스가장 간단한 형태의 질의문(QueryString)생성에 유리
복잡한 QueryString생성시 문자열 표현곤란
PreparedStatement클래스객체내에 질의문을 포함특정 값 대신 매개변수(“?”)사용하여 대응되는 메소드를 호출하여 QueryString을 완성(getXXX, setXXX)
CallableStatement클래스저장 프로시져를 이용하기 위해 사용
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 44
JDBC 기초 응용
데이터 검색 : Select
데이터 추가 : Insert
Statement클래스 이용
PreparedStatement클래스 이용
데이터 삭제 : Delete
데이터 갱신 : Update
-
23
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 45
데이터 검색 : SelectString strQuery = "Select c_no, c_name, c_addr, c_phone, c_dist from customer" ;
Statement stmt = null ;
try {
stmt = conn.createStatement() ;
rs = stmt.executeQuery(strQuery) ;
while(rs.next()) {
// getString(String columnName) or getString(int ColumnNo)을 사용한다.
System.out.print(rs.getString('c_no')) ;
System.out.print(rs.getString(2)) ;
System.out.print(rs.getString('c_addr')) ;
System.out.print(rs.getString('c_phone')) ;
System.out.println(rs.getString('c_dist')) ;
}
} catch (SQLException se) {
se.printStackTrace();
}
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 46
데이터 검색 : Select(계속)
-
24
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 47
데이터 추가 : Insert(Statement)String strCno = "780321-2231101";
String strAno = "AP100002";
int iSerialno = 8;
long lAmount = 50000;
/* deposit 테이블에 입/출금 내역을 기록 */
try {
// QueryString을 생성
String strQuery = "INSERT INTO deposit VALUES (";
strQuery += "'" + strCno + "', '" + strAno + "'," + iSerialno + ",";
strQuery += "" + lAmount + ", sysdate)";
System.out.println(strQuery);
Statement stmt = conn.createStatement(); // Statement 객체를 생성
stmt.executeUpdate(strQuery); // Query 실행
conn.commit(); // DB에 commit;
stmt.close();
} catch (SQLException se) {
System.out.println("Database Insert Into error");
se.printStackTrace();
} //end try~catch
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 48
데이터 추가 : Insert(계속)
-
25
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 49
데이터 추가 : Insert(PreparedStatement)String strCno = "780321-2231101";
String strAno = "AP100002";
int iSerialno = 8;
long lAmount = 50000;
try {
// QueryString을 생성String strQuery = "INSERT INTO deposit VALUES (?,?,?,?,sysdate)”;PreparedStatement pstmt = conn.prepareStatement(strQuery);
pstmt.setString(1, strCno); //첫번째 ?에 strCno의 값이 설정
pstmt.setString(2, strAno);
pstmt.setInt(3, iSerialno);
pstmt.setLong(4, lAmount);
pstmt.executeUpdate(); // Query 실행
conn.commit(); // DB에 commit;
pstmt.close();
} catch (SQLException se) {
System.out.println("Database Insert Into error");
se.printStackTrace();
} //end try~catch
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 50
데이터 삭제 : DeleteString strQuery = null;
PreparedStatement pstmt = null ;
String strCname = “김지수”;try {
/* customer 테이블에서 변수 strCname의 값을 갖는 고객 삭제*/
strQuery = "delete from customer where c_name = ?";
// preparedStatement객체 생성
pstmt = conn.prepareStatement(strQuery) ;
pstmt.setString(1, strCname) ;
pstmt.executeUpdate() ;
conn.commit(); // db에 commit;
pstmt.close() ;
} catch (SQLException se) {
System.out.println("Database delete error") ;
se.printStackTrace() ;
} //end try~catch
-
26
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 51
데이터 삭제 : Delete(계속)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 52
데이터 갱신 : UpdateString strQuery = null;
PreparedStatement pstmt = null ;
try {
strQuery = "update customer set c_phone = ? where c_name = ?" ;
pstmt = conn.prepareStatement(strQuery) ;
pstmt.setString(1, strCphone) ;
pstmt.setString(2, strCno);
pstmt.executeUpdate() ;
conn.commit(); // db에 commit;
pstmt.close();
} catch (SQLException se) {
System.out.println("Database delete error") ;
se.printStackTrace();
} //end try~catch
-
27
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 53
데이터 갱신 : Update(계속)
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 54
JDBC 2.0에서 추가된 메소드
ResultSet에서 커서이동
rs.next(), rs.previous(), rs.first(), rs.last()
ResultSet에서 insert, update, delete
rs.insertRow(), rs.updateRow, rs.deleteRow()
-
28
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 55
JDBC2.0에서 SelectString strQuery = "Select c_no, c_name, c_addr, c_phone, c_dist from customer" ;
ResultSet rs = null ; Statement stmt = null ;
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE) ;
rs = stmt.executeQuery(strQuery) ;
rs.beforeFirst();
while(rs.next()) {
System.out.print(rs.getString(1) + ”\t”) ;System.out.print(rs.getString(2) + ”\t”) ;System.out.print(rs.getString(3) + ”\t”) ;System.out.print(rs.getString(4) + ”\t”) ;System.out.println(rs.getString(5)) ;
}
} catch (SQLException se) { se.printStackTrace() ; }
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 56
JDBC2.0에서 Select(계속)
-
29
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 57
JDBC2.0에서 InsertString strQuery = "Select c_no, c_name, c_addr, c_phone, c_dist from customer" ;
ResultSet rs = null ; Statement stmt = null ;
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE) ;
rs = stmt.executeQuery(strQuery) ;
rs.moveToInsertRow() ; // cursor의 위치를 insert buffer로 이동한다.
rs.updateString(1, strCno.trim()) ; // 현재의 커서의 위치에 setting 한다.
rs.updateString(2, strCname.trim()) ;
rs.updateString(3, strCaddr.trim()) ;
rs.updateString(4, strCphone.trim()) ;
rs.updateString(5, strDist.trim()) ;
// insert buffer에 setting된
rs.insertRow() ;
// cursor의 위치를 추가 이전의 위치로 이동한다.
rs.moveToCurrentRow() ;
conn.commit();
} catch (SQLException se) { se.printStackTrace() ; }
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 58
JDBC2.0에서 DeleteString strQuery = "Select c_no, c_name, c_addr, c_phone, c_dist from
customer";
ResultSet rs = null;
Statement stmt = null;
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(strQuery);
rs.absolute(10);
rs.deleteRow();
conn.commit();
} catch (SQLException se) { se.printStackTrace(); }
-
30
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 59
JDBC2.0에서 Updatetry {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(strQuery) ;
rs.updateString(1, strCno.trim()) ;
rs.updateString(2, strCname.trim()) ;
rs.updateString(3, strCaddr.trim()) ;
rs.updateString(4, strCphone.trim()) ;
rs.updateString(5, strDist.trim()) ;
rs.updateRow();
conn.commit() ;
} catch (SQLException se) { se.printStackTrace() ; }
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 60
JDBC2.0에서 APIsStatement createStatement (int resultSetType, int resultSetConcurrency)PreparedStatement prepareStatement (String sql, int resultSetType, int resultSetConcurrency)CallableStatement prepareCall (String sql, int resultSetType, int resultSetConcurrency)
resultSetType ResultSet.TYPE_FORWARD_ONLYResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrencyResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE
-
31
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 61
내부/외부 변화에 따른 가시성
forward-only
scroll-sensitive
scroll-insensitive
내부삭제? 내부갱신? 내부추가? 외부삭제? 외부갱신? 외부추가?
no
yes
yes
yes
yes
yes
no
no
no
no
no
no
no
yes
no
no
no
no
Copyright 2001, 서울산업대학교 전자계산학과 DBLab 62
FirstBank Java예제
frmCustomer.javafrmBranch.javafrmDepositOrder.javafrmInOut.javafrmDepositStatement.javafrmLoanOrder.javafrmPayBack.jav
frmDepositKind.javafrmLoanKind.java