Tvorba informačních systémů Michal Krátký 1, Miroslav Beneš 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2005/2006 c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 1/39
Obsah Datová vrstva informačních systémů,, ADO.NET. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 2/39
Datová vrstva Datová vrstva informačních systémů Oddělení aplikace od přístupu do databáze. Standardizovaný dotazovací jazyk - SQL. Standardizované rozhraní v programovacím jazyce - ODBC, JDBC, ADO.NET,.... c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 3/39
Standard pro přístup do databáze. SQL Access group, 1992. Umožňuje dotazovat data z libovolné aplikace bez ohledu v jaké databázi jsou uložena. Vložena mezivrstva - ovladač, překládající uživatelské dotazy na dotazy databáze. Správce ovladačů Driver Manager. ODBC-compliant. Od verze 2.0 je podporováno SQL. Standardy: X/Open a ISO: SQL Call Level Interface (SQL/CLI). c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 4/39
Architektura ODBC c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 5/39
Typy ovladačů Datová vrstva informačních systémů Ovladače založené na souborech přímý přístup k datům (ovladače = zdroj dat), analýza a interpretace dotazů, dbase. Ovladače založené na SŘBD dotazy se předávají ke zpracování SŘBD, transformace ODBC SQL na konkrétní dialekt SQL. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 6/39
Postup Datová vrstva informačních systémů 1 Připojení k datovému zdroji. 2 Inicializace. 3 Vytvoření a provedení dotazu. 4 Získání výsledku. 5 Ukončení transakce. 6 Odpojení od datového zdroje. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 7/39
Připojení k datovému zdroji / / Alokace zastupce pro spravce ovladacu ODBC SQLHENV henv ; SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, & henv ) ; / / Deklarace pozadovane verze ODBC SQLSetEnvAttr ( henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER ) SQL_OV_ODBC3, 0 ) ; / / Alokace zastupce pro databazove p r i p o j e n i SQLHDBC hdbc1 ; SQLAllocHandle (SQL_HANDLE_DBC, henv, & hdbc ) ; / / P r i p o j e n i k databazi, zdroj, u z i v a t e l, heslo SQLConnect ( hdbc, database, SQL_NTS, user, SQL_NTS, password, SQL_NTS ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 8/39
Inicializace aplikace / / Z i s k a n i i n f o r m a c i o SRBD, ovladaci,... SQLCHAR dbms_name [ 4 0 ] ; SQLGetInfo ( hdbc, SQL_DBMS_NAME, dbms_name, sizeof (dbms_name ), NULL ) ; / / Alokace zastupce pro p r i k a z ( dotaz ) SQLHANDLE hstmt ; SQLAllocHandle (SQL_HANDLE_STMT, hdbc, & hstmt ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 9/39
Vytvoření a provedení dotazu Přímé provedení dotazu SQLCHARquery [ ] = "INSERT INTO... " ; SQLExecDirect ( hstmt, query, SQL_NTS ) ; Přpravený dotaz SQLCHAR query = "SELECT jmeno FROM uziv WHERE l o g i n =? " ; SQLPrepare ( hstmt, query, SQL_NTS ) ; SQLBindParameter ( hstmt, 1,... ) ; SQLExecute ( hstmt ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 10/39
Získání výsledku Datová vrstva informačních systémů / / Svazani promennych s vysledkem dotazu SQLCHAR jmeno [ 3 0 ] ; SQLINTEGER jmeno_ind ; SQLBindCol ( hstmt, 1, SQL_C_CHAR, jmeno, sizeof ( jmeno ), & jmeno_ind ) ; / / Cteni vysledku while ( SQLFetch ( hstmt )! = SQL_NO_DATA ) { i f ( jmeno_ind! = SQL_NULL_DATA ) cout < < jmeno ; } c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 11/39
Odpojení od zdroje dat / / Uvolneni zastupce prikazu SQLFreeHandle (SQL_HANDLE_STMT, hstmt ) ; / / Odpojeni od databaze SQLDisconnect ( hdbc ) ; / / Uvolneni zastupce prikazu SQLFreeHandle (SQL_HANDLE_DBC, hdbc ) ; / / Uvolneni zastupce p r o s t r e d i SQLFreeHandle (SQL_HANDLE_ENV, henv ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 12/39
Rozhraní pro unifikovaný přístup k datům. Použití i mimo klient-server SŘBD data ve formě tabulek (CSV, XLS,...) Ovladače jsou k dispozici pro většinu databázových systémů. Inspirováno rozhraním ODBC Objektové rozhraní. Možnost spolupráce s ODBC. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 13/39
Architektura JDBC c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 14/39
Architektura JDBC c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 15/39
JDBC ovladač Datová vrstva informačních systémů Zprostředkování komunikace aplikace s konkrétním typem databáze. Implementován obvykle výrobcem databáze. Dotazovací jazyk SQL předá se databázi, ovladač vyhodnotí přímo. Reprezentován specifickou třidou: sun.jdbc.odbc.jdbcodbcdriver, com.mysql.jdbc.driver. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 16/39
Typy JDBC ovladač Typ 1: využívá ODBC (přes JDBC-ODBC bridge), obtížně konfigurovatelné. Typ 2: komunikace s nativním ovladačem. Typ 3: komunikuje s centrálním serverem (Network Server) sít ovým protokolem, pro rozsáhlé heterogenní systémy. Typ 4: založen čistě na jazyce Java, přímý přístup do databáze. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 17/39
Registrace ovladače Konkretní ovladač je pevně spojen s aplikací new com.mysql.jdbc.driver() Výběr ovladače za běhu aplikace S t r i n g drivername = "com. mysql. jdbc. D r i v e r " ; t r y { Class. forname ( drivername ) ; } catch ( ClassNotFoundExceptione ) { / / obsluha vyjimky } c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 18/39
Identifikace spojení jdbc:driver:database jdbc:odbc:datasource;attr=value;... Příklad: jdbc:mysql://localhost/tis?user=tis &password=tis &useunicode=true &characterencoding=iso-8859-2 c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 19/39
Připojení k databázi Connection con = DriverManager.getConnection( url_string, user_string, password_string ); 1 DriverManager se dotáže všech registrovaných ovladačů. 2 Rozpozná-li ovladač své url, vrátí objekt Connection. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 20/39
Objekt Statement Reprezentuje SQL příkaz: Statement PreparedStatement CallableStatement Vytvoření instance příkazu: Statement stmt= con.createstatement(); Provedení příkazu: ResultSet rs= stmt.executequery( "SELECT * FROM t"); int num = stmt.executeupdate( "DELETE * FROM t"); c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 21/39
Objekt ResultSet Reprezentuje výsledek dotazu SELECT: Statement stmt = con. createstatement ( ) ; ResultSet rs = stmt. executequery ( "SELECT FROM u z i v a t e l " ) ; while ( rs. next ( ) ) { S t r i n g l o g i n = rs. g e t S t r i n g ( " l o g i n " ) ; S t r i n g jmeno = rs. g e t S t r i n g ( " jmeno " ) ; } rs. close ( ) ; stmt. close ( ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 22/39
Ošetření chyb Datová vrstva informačních systémů public class SQLException extends Exception t r y {... } catch ( SQLException e ) { while ( e! = null ) { System. out. p r i n t l n ( e. getmessage ( ) ) ; System. out. p r i n t l n ( e. getsqlstate ( ) ) ; System. out. p r i n t l n ( e. geterrorcode ( ) ) ; e = e. getnextexception ( ) ; } } c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 23/39
Parametrizované příkazy Možnost předkompilace opakované provedení příkazu. Parametry označené znakem?, indexované od 1, INSERT INTO u z i v a t e l ( l o g i n, jmeno ) VALUES(?,? ) c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 24/39
Parametrizované příkazy PreparedStatement pstmt = con. preparestatement ( "INSERT... VALUES(?,? ) " ) ; pstmt. clearparameters ( ) ; pstmt. s e t S t r i n g ( 1, " wal007 " ) ; pstmt. s e t N u l l ( 2, Types.VARCHAR) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 25/39
Transakce Datová vrstva informačních systémů t r y { con. setautocommit ( false ) ; stmt. executeupdate (... ) ;... con. commit ( ) ; } catch ( SQLExceptione ) { con. r o l l b a c k ( ) ; } c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 26/39
Příklad, Oracle 1/2 DriverManager. r e g i s t e r D r i v e r (new OracleDriver ( ) ) ; S t r i n g connstr = " jdbc : o r a c l e : t h i n : @infra. cs. vsb. cz " + " :1521: d456 " ; Connection connection = DriverManager. getconnection ( connstr, " xxx ", " yyy " ) ; Statement statement = connection. createstatement ( ) ; boolean r e s u l t f = statement. execute ( "UPDATE PROBE_SET VALUE=1 WHERE ID = 2 " ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 27/39
Příklad, Oracle 2/2 ResultSet r e s u l t S e t = null ; i f ( r e s u l t f ) { r e s u l t S e t = statement. getresultset ( ) ; } i n t updatecount = statement. getupdatecount ( ) ; statement. close ( ) ; connection. close ( ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 28/39
Příklad - JSTL Datová vrstva informačních systémů < s q l : setdatasource var= " datasource " d r i v e r = " org. g j t.mm. mysql. d r i v e r " u r l = " jdbc : mysql : / / l o c a l h o s t / db " user= " guest " password= " guest " / > < s q l : query datasource= " $ { datasource } "... / > c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 29/39
ADO.NET Datová vrstva informačních systémů Přístup k datům na platformě.net. Možnost práce s XML daty. Propojení na další komponenty.net. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 30/39
Architektura ADO.NET Komponenty zaměřené na obsah DataSet DataTable, DataRow, DataColumn DataRelation Komponenty pro správu Connection Command DataReader DataAdapter c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 31/39
Architektura ADO.NET c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 32/39
Komponenty ADO.NET DataReader rychlý přístup k datům, pouze čtení směrem vpřed. DataSet obsahuje kopii dat z datového zdroje, čtení a zápis dat a schématu ve formátu XML. DataAdapter abstrakce přípojení a příkazu, naplnění a synchronizace dat pro DataSet. c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 33/39
Příklad, Oracle 1/3 using System. Data ; using System. Data. O r a c l e C l i e n t ;... OracleConnection connection = new OracleConnection ( " Data Source= i n f o ; User ID=xxx ; Password=yyy " ) ; connection. Open ( ) ; OracleCommand command = new OracleCommand ( s e l e c t from student, connection ) ; OracleDataAdapter dbadapter = new OracleDataAdapter ( command ) ; DataSet dataset = new DataSet ( " student " ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 34/39
Příklad, Oracle 2/3 t r y { dbadapter. F i l l ( dataset ) ; } catch ( Exception exc ) { throw new Exception ( exc. Message ) ; }.... c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 35/39
Příklad, Oracle 3/3.... / / draw the r e s u l t System. Windows. Forms. DataGrid studentdatagrid= new System. Windows. Forms. DataGrid ( ) ; studentdatagrid. DataSource = dataset ; studentdatagrid. Update ( ) ;... connection. Close ( ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 36/39
Vazba ASP.NET na data <%@ Import Namespace= " System. Data. Odbc"%> <formrunat=" server " > <asp : L i s t B o x i d = " ListBox1 " runat=" server " Width= " 355px " Height= " 180px " DataTextField=" nazev " DataValueField= " i d " / > < / form> c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 37/39
Vazba ASP.NET na data void Page_Load ( Objectsender, EventArgse ) { i f (! IsPostBack ) { OdbcDataAdapter da = new OdbcDataAdapter ( "SELECT id, nazev FROM katedry ", "DSN=KatIS " ) ; System. Data. DataSet ds = newsystem. Data. DataSet ( ) ; } } da. F i l l ( ds, " Katedra " ) ; ListBox1. DataSource = ds. Tables [ " Katedra " ]. DefaultView ; ListBox1. DataBind ( ) ; c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 38/39
Reference Datová vrstva informačních systémů ODBC http://www.microsoft.com/data/odbc/ http://www.unixodbc.org/ JDBC http://java.sun.com/products/jdbc ADO.NET http://www.msdn.com/ c 2006 Michal Krátký, Miroslav Beneš Tvorba informačních systémů 39/39