database programming. 2 contents n overview (architecture) n problems n db 와의 연결 방식 n...
TRANSCRIPT
Database Database ProgrammingProgramming
2
ContentsContents
Overview (Architecture)Overview (Architecture) ProblemsProblems DBDB 와의 연결 방식와의 연결 방식 Middleware ArchitectureMiddleware Architecture
– ODBC, JDBC, Perl DBODBC, JDBC, Perl DB Programming ExamplesProgramming Examples Web & DatabaseWeb & Database
– 연동 방식연동 방식
3
Database ConnectivityDatabase Connectivity
일반 프로그램에서 일반 프로그램에서 DatabaseDatabase 에 접근에 접근 질의 결과를 프로그램내부에서 처리질의 결과를 프로그램내부에서 처리 하나의 응용프로그램으로 다양한 하나의 응용프로그램으로 다양한
데이타베이스 접근데이타베이스 접근– Cf) device driver Cf) device driver database driver database driver
4
ProblemsProblems
HeterogeneityHeterogeneity– Access to Diverse DBMSAccess to Diverse DBMS
Impendence MismatchImpendence Mismatch– Query results (RDB) Query results (RDB) Set Set– Program variableProgram variable
Directly cannot deal with “Set”Directly cannot deal with “Set” DBMS
Database?
5
Impedance MismatchImpedance Mismatch
M_field_AM_field_B
…
Program variable
-------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- -------
-------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- --------------- -------------- -------
RowField A Field B ….
DBMSDBMS
Database
6
DBDB 와의 연결 구조 와의 연결 구조 (1)(1)
DB ServerApplication DBMS
Database
Client ProgramDBMS dependent
API
Server SideClient Side
7
DBDB 와의 연결 구조 와의 연결 구조 (2)(2)
DB ClientApplication
DBMS
Database
Client Program
Server SideClient Side
NetworkingModule
8
DBDB 와의 연결 구조 와의 연결 구조 (3)(3)
MiddleWareFor DB DBMSDBMS
Database
Client Program
9
Uniform Interface to DBUniform Interface to DB
JDBCODBCPerl DBIOLE DBDAOADO…
10
ODBC ArchitectureODBC Architecture
Application
Driver ManagerODBCDriver
ODBCDriver
ODBCDriver
ODBCDriver
OracleDatabase
InformixDatabase
SybaseDatabase
MySQLDatabase
“what”
“how”
11
JDBC ArchitectureJDBC Architecture
Java Application
JDBC ManagerJDBC
DriverJDBC-ODBC
BridgeJDBC
DriverJDBC
Driver
ODBCDriver
NativeDriver
SybaseDatabase
MySQLDatabase
InformixDriver
OracleDatabase
12
Perl DB ArchitecturePerl DB Architecture
Perl Script
DBIOracleDBD
ODBC DBCSQLServer
DBCSybase
DBD
ODBCDriver
OracleDatabase
MySQLDatabase
SQLServerDatabase
SybaseDatabase
13
Actions on Client & ServerActions on Client & Server
1. Open a connection
2. Sends a query statement
3. Retrieve results
4. Closes a connection
1. Open a connection
2. Sends a query statement
3. Retrieve results
4. Closes a connection
1. Creates a Connection session
2. Executes statement
3. Sends results
4. Close the session
1. Creates a Connection session
2. Executes statement
3. Sends results
4. Close the session
Client Side Server Side
14
ODBCODBC
ApplicationApplication– DB DB 접속접속 , , 세션 요청세션 요청– SQL SQL 결과를 위한 저장 영역 및 데이터 포맷 정의결과를 위한 저장 영역 및 데이터 포맷 정의– 결과 요청결과 요청– 에러 처리에러 처리– Query/Commit/Rollback Query/Commit/Rollback 요청요청– DB DB 접속 종료접속 종료
15
ODBCODBC
Driver Manager (ODBC.DLL)Driver Manager (ODBC.DLL)– DB (data) source nameDB (data) source name 을 특정 을 특정 driverdriver 의 의 DLLDLL 로 로
mappingmapping– ODBC ODBC 호출 검증호출 검증
DB DriverDB Driver– Data sourceData source 에 연결 설정에 연결 설정– Data sourceData source 에 질의 요청 전송에 질의 요청 전송– Data format Data format 변환변환– Query resultsQuery results 를 를 applicationapplication 쪽으로 반환쪽으로 반환– Error code Error code 리턴리턴– Cursor Cursor 선언 및 조작선언 및 조작– Transaction Transaction 처리 처리
16
ODBC driversODBC drivers
17
ExampleExample
NameCardDB
Programcode
18
Database ProgrammingDatabase Programming
Make a connection
Build SQL statement
Send SQL statement
Fetch Row
More rows ?
Close result set
Close SQL statement
Close connection
19
Example Example (ODBC API Code)(ODBC API Code)
Int example (UCHAR *server, UCHAR *uid, UCHAR *pwd)Int example (UCHAR *server, UCHAR *uid, UCHAR *pwd){{
HENV henv;HENV henv;HDBC hdbc;HDBC hdbc;HSTMT hstmt;HSTMT hstmt;UCHAR id[10], name[100], select[200];UCHAR id[10], name[100], select[200];SDWORD namelen, idlen;SDWORD namelen, idlen;RETCODE rc;RETCODE rc;SQLAllocEnv(&henv);SQLAllocEnv(&henv);SQLAllocConnect(henv, &hdbc);SQLAllocConnect(henv, &hdbc);rc=SQLConnect(hdbc, server, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);rc=SQLConnect(hdbc, server, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
return printf(“can’t connect”);return printf(“can’t connect”);SQLAllocStmt(hdbc, &hstmt);SQLAllocStmt(hdbc, &hstmt);lstrcpy((LPTSTR) select, “SELECT InstructId, Name FROM Instructor”);lstrcpy((LPTSTR) select, “SELECT InstructId, Name FROM Instructor”);if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS)if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS)
return printf(“can’t exec direct”);return printf(“can’t exec direct”);printf(“InstructorID Name\n”);printf(“InstructorID Name\n”);
SQLBindCol(hstmt, 1, SQL_C_CHAR, id, (SDWORD)sizeof(id), &idlen);SQLBindCol(hstmt, 1, SQL_C_CHAR, id, (SDWORD)sizeof(id), &idlen);SQLBindCol(hstmt, 2, SQL_C_CHAR, name, (SDWORD)sizeof(name), &namelen);SQLBindCol(hstmt, 2, SQL_C_CHAR, name, (SDWORD)sizeof(name), &namelen);
while(TRUE){while(TRUE){rc = SQLFetch(hstmt);rc = SQLFetch(hstmt);if (rc != SQL_NO_DATA_FOUND) printf(“%-12s %-9s\n”, id, name);if (rc != SQL_NO_DATA_FOUND) printf(“%-12s %-9s\n”, id, name);else break;else break;
}}SQLTransact(henv, hdbc, SQL_COMMIT);SQLTransact(henv, hdbc, SQL_COMMIT);SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv);SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv);return TRUE;return TRUE;
}}
DB 접속
질의준비/ 요청
변수매핑
질의결과출력
DB 종료
20
Example Example (Perl Code)(Perl Code)# # 데이타베이스 접속데이타베이스 접속 ------------------------------------------------------------------------------------------------------$dsn = "dbi:Oracle:host=swan;sid=ora8";$dsn = "dbi:Oracle:host=swan;sid=ora8";$ENV{ORACLE_HOME} = "/usr4/ora8/app/oracle/product/8.0.4";$ENV{ORACLE_HOME} = "/usr4/ora8/app/oracle/product/8.0.4";$ENV{ORA_NLS32} = "$ORACLE_HOME/ocommon/nls/admin/data";$ENV{ORA_NLS32} = "$ORACLE_HOME/ocommon/nls/admin/data";$user = "catalog";$user = "catalog";$password = "stop";$password = "stop";$dbh = DBI->connect($dsn, $user, $password) || die "$DBI::errstr";$dbh = DBI->connect($dsn, $user, $password) || die "$DBI::errstr";
$sql_doc = "SELECT did, file_path, input_date FROM docs"; # $sql_doc = "SELECT did, file_path, input_date FROM docs"; # 모든 문서에 대해서모든 문서에 대해서
#print "<font color=black size=2>$sql_doc</font>\n";#print "<font color=black size=2>$sql_doc</font>\n";
$sth = $dbh->prepare($sql_doc) || die "DBI::errstr";$sth = $dbh->prepare($sql_doc) || die "DBI::errstr";$sth->execute() || die "DBI::errstr";$sth->execute() || die "DBI::errstr";
while (($did, $file_path, $input_date) = $sth->fetchrow_array()){while (($did, $file_path, $input_date) = $sth->fetchrow_array()){## print "[print "[ 문서번호문서번호 ] $did [] $did [ 화일명화일명 ] $file_path [] $file_path [ 입력날짜입력날짜 ] $input_date\n","<br>\n";;] $input_date\n","<br>\n";;}}$dbh->do (“insert into $$dbh->do (“insert into $ 유유 _name values (“perl”, “database”, ‘2000/10/17’, …);_name values (“perl”, “database”, ‘2000/10/17’, …);$dbh->do (“drop table students”);$dbh->do (“drop table students”);$sth->finish;$sth->finish;$dbh->disconnect;$dbh->disconnect;
21
Example Example (PHP Code)(PHP Code)
$host = "localhost";$host = "localhost";$user = "php";$user = "php";$password = "12345";$password = "12345";
$connect = mysql_connect($host, $user, $password);$connect = mysql_connect($host, $user, $password);mysql_select_db('php_db',$connect);mysql_select_db('php_db',$connect); $bookname = $_POST["bookname"]; $bookauthor = $_POST["bookauthor"]; $pubyear = $_POST["pubyear"];$bookname = $_POST["bookname"]; $bookauthor = $_POST["bookauthor"]; $pubyear = $_POST["pubyear"];$position1 = $_POST["position1"]; $position2 = $_POST["position2"];$position1 = $_POST["position1"]; $position2 = $_POST["position2"]; $sql = "insert into bookmanage values('$bookname', '$bookauthor' ,'$pubyear‘ ,'$position1','$position2')";$sql = "insert into bookmanage values('$bookname', '$bookauthor' ,'$pubyear‘ ,'$position1','$position2')";
mysql_query($sql,$connect); mysql_query($sql,$connect);
$connect = mysql_connect($host,$user,$password);$connect = mysql_connect($host,$user,$password);mysql_select_db('php_db', $connect);mysql_select_db('php_db', $connect); $sql = "select * from bookmanage";$sql = "select * from bookmanage";$result = mysql_query($sql,$connect);$result = mysql_query($sql,$connect);$rows = mysql_num_rows($result);$rows = mysql_num_rows($result); echo"<table border=1>";echo"<table border=1>";echo"<tr><th>echo"<tr><th> 책이름책이름 <th><th> 책저자책저자 <th><th> 출판년도출판년도 <th><th> 위치위치 1<th>1<th> 위치위치 2";2";for($i=0; $i<$rows; $i++) {for($i=0; $i<$rows; $i++) { $record = mysql_fetch_array($result);$record = mysql_fetch_array($result); echo "<tr>";echo "<tr>"; echo "<td>$record[bookname]";echo "<td>$record[bookname]"; echo "<td>$record[bookauthor]";echo "<td>$record[bookauthor]"; echo "<td>$record[pubyear]";echo "<td>$record[pubyear]"; echo "<td>$record[position1]";echo "<td>$record[position1]"; echo "<td>$record[position2]";echo "<td>$record[position2]"; }}echo"</table>";echo"</table>";mysql_close($connect);mysql_close($connect); ?>?>
22
Example Example (Visual C++)(Visual C++)
ODBCODBC 설정설정 데이타베이스 접속데이타베이스 접속
– 데이타베이스와 테이블 지정데이타베이스와 테이블 지정– DBDB 접속을 위한 접속을 위한 object object 생성생성
Result setResult set 과 매핑되는 변수 마련과 매핑되는 변수 마련– Result set Result set RECORDSETRECORDSET object object DOCUMENTDOCUMENT o o
bjectbject Result set Result set 출력출력
– DOCUMENTDOCUMENT class class 변수 변수 VIEWVIEW object object
23
CPubsSet m_pubsSet
Class CPubsDoc : public CDocument
CPubsSet(CDatabase* pDatabase = NULL);
Class CPubsSet : public CRecordSet
CPubsSet* m_pSet;
Class CPubsView : public CRecordView
m_pSet->Open();m_pSet->MoveNext();m_pSet->Update();. . . m_pSet->Close();
Database
• 질의 요청• Result set 제어
24
DB Field DB Field Prog. Variable Prog. Variable(Visual C++)(Visual C++)
25
Web & DatabaseWeb & Database
CGI CGI 방식방식 Demon Demon 방식방식 확장 확장 API API 방식방식 Sublet Sublet 방식방식
26
CGI CGI 방식방식
InternetCGI DB
Application
HTML Data
HTTP Request
HTML Results
Calls
HTML
• CGI 가 직접 DBMS 에 접근해 데이터를 추출• 구현 용이 기존의 웹서버 브라우저 그대로 사용• One Request One Process• Context switching overhead
WebServer
27
확장 확장 API API 방식방식
InternetDB
ApplicationProgram
HTML Data
HTTP Request
HTML Results
• DB application program 을 Web Server 안에서 직접 구동• DB Request Web Server 에서 처리• Context switching overhead 없음• 특정 web browser 에 종속
WebServer
Ex) Apache + PHP
28
Demon Demon 방식방식
InternetRemoteMethod
Invocation
HTML Data
HTTP Request
HTML Results
• Client 에 있는 Java Applet 이 직접 질의요청
WebServer
Demon
Query Results
DB requestsJava
Applet
29
Servelet Servelet 방식방식
InternetServeletProcess
HTML Data
HTTP Request
HTML Results
WebServer
data
Calls
HTML
• DB application program 을 Web Server 가 대신 호출• DB Request Web Server 에서 처리• Context switching overhead 없음•특정 web browser 에 독립