SQL programozási felületek
Henri Rousseau, ‘Az álom’ ADO ESQL OCI PHP JDBC ADO ODBC SQL JSQL 1910 lehetőségek kavalkádja XSQL PL/SQL DAO OLEDB TSQL Henri Rousseau, ‘Az álom’
EXEC SQL UPDATE tabla SET .. if (res < 0) {… E-SQL DEFINE CLASS sracs AS GRID sracs.RECORDSOURCE=”SELECT … OPI CLI re = SQLEXECUTE(cs, ”SELECT * …”) O-CLI re = CON.executeQuery(”SELECT * …”) DBMS ODBC OPI : Object Parameter Interface (sajat elnevezés) SQL JDBC native
Beágyazott SQL SQL parancsok kiadása programból: - gazda nyelvi környezetbe beépített SQL parancsok - beágyazott SQL : interaktív SQL szintaktikát követ - CLI: függvényeket definiál az adatkapcsolathoz 3GL program scanf(”%d”,&lv); … INSERT INTO ARU VALUES(C.NEXTVAL,:lv); if (sqlca.errcode==0) { printf(“Sikeres beszuras\n”); } DBMS
Forrás állomány = gazdanyelv + SQL Beágyazott SQL rendszerek struktúrája Forrás állomány = gazdanyelv + SQL Előfordító Gazdanyelvi forrás Fordító Object gépi kód Linker DBMS Library EXE állomány DBMS KL
Gazdanyelvi változók deklarációja és beépítése Adatok fogadása - egy rekord jön át: SELECT m-lista INTO v-lista FROM …; EXEC SQL BEGIN DECLARE SECTION; int lv; EXEC SQL END DECLARE SECTION; main() { printf (“Kerem a tipust:”); scanf(”%s”,&tip); EXEC SQL SELECT COUNT(*), MIN(ar) INTO :db, :mar FROM AUTO WHERE tipus = :tip; printf (“Db = %d Max ar = %d\n”, db, mar); }
- több rekord jön át: Kurzor mechanizmus DBMS Alkalmazás kurzor EXEC SQL DECLARE CURSOR k1 FOR SELECT rsz, ar FROM auto FOR UPDATE OF ar; … OPEN k1; while () { EXEC SQL FETCH k1 INTO :r1, :a1; EXEC SQL UPDATE auto SET ar=:ua WHERE CURRENT OF k1; } EXEC SQL CLOSE k1;
Közvetett hibakezelés WHENEVER hiba valasz; SQLERROR, NOT FOUND STOP, CONTINUE, GOTO c, DO fv indikátor változók : :r1:r2 WHENEVER NOT FOUND GOTO ki; while () { EXEC SQL FETCH k1 INTO :r1:e1, :a1; if (e1>0) printf (”rsz=%s ar=%d”,r1,a1); } ki:
Beágyazott SQL mintapélda EXEC SQL DECLARE autokurz CURSOR FOR SELECT tip, ar FROM auto WHERE tip LIKE 'FIAT%' OR tip LIKE 'LADA%' FOR UPDATE OF ar; EXEC SQL OPEN autokurz; EXEC SQL WHENVER NOT FOUND GOTO vege; while (1) { EXEC SQL FETCH autokurz INTO :atip,:aar:aai; if (aai < 0) continue; if (tip[0] == 'F') { EXEC SQL UPDATE auto SET ar = ar*1.15 WHERE CURRENT OF autokurz; } else { EXEC SQL UPDATE auto SET ar = ar*1.12 } vege: EXEC SQL CLOSE autokurz;
ODBC CLI Open Database Connectivity (MS, ~1993) Célja egységes API elérési felület biztosítása a különböző relációs jellegű adatforrások felé (a heterogenitási problémák leküzdése) Oracle SQLServer Informix DB2 Sybase VFP Access Excel Txt ODBC
Elvégzendő funkciók ODBC INSERT APPEND parancs konverzió adat konverzió kapcsolat felvétel funkció bővítés hibakezelés információ nyújtás párhuzamosság DATETIME DATE SQLCONNECT CONNECT ISOLATION LEVEL … UPDATE SELCET ERROR() SQLTABLES SELECT SQLCONNECT(1) SQLCONNECT(2)
ODBC struktúra ODBC Driver 1 Driver manager Driver 1 Driver 1 ODBC ODBC N Egylépcsős Kétlépcsős
ODBC API (C) Kapcsolattartás: handlerek session h. connection h. connection h. command h. command h. command h. e = sqlAllocEnv() c = sqlAllocConnect(e) p = sqlAllocStmt(c) sqlFreeEnv() sqlFreeConnect() sqlFreeStmt() sqlConnect(c,elérés) sqlPrepare() sqlExecDirect(p,parancs) sqlExec() sqlFetch(p) sqlBindCol() sqlGetData() sqlError() sqlSetStmtOption() sqlTables()
SQLAllocEnv(&henv); //session létesítés SQLAllocConnect(henv,&hdbc); //kapcsolat leíró foglalás SQLConnect(hdbc,(unsigned char*) ”HELLO”,SQL_NTS,NULL,0, NULL,0); SQLAllocStmt(hdbc,&hstmt); //parancs leíró foglalás SQLExecDirect(nstmt,(unsigned char*) “SELECT * FROM Minta “, SQL_NTS); //parancs végrehajtás for (rc=SQLFetch(hstmt);rc==SQL_SUCCESS; rc=SQLFetch(hstmt)){ //rekordok lekérdezése SQLGetData(hstmt,1,SQL_C_CHAR,SzData, Siyeof(sydata),&cbData); //mező lekérdezése MessageBox(NULL,syData,”ODBC”,MB_OK); //az eredmény kiírása } SQLFreeStmt(hstmt,SQL_DROP); //parancs leírás SQLDisconnect(hdbe); //lekapcsolódás SQLFreeConnet(hdbe); //leíró felszabadítás SQLFreeEno(henv) //session leíró
ODBC források menedzselése
VFP-ODBC egyszerűsített nyilvántartás - egy leíró struktúra (egész típusú azonosító) egyszerűsített adatkezelés - VFP lokális kurzorba tölti át az eredményt hdbe=SQLConnect(DSN, felhasználó, jelszó) SQLExec(hdbc,”SQL”,cursornev) SQLColumns(hdbc,”tabla”) SQLCommit (hdbc) SQLTables(hdbc) SQLSETProp(hdbc,parameter,ertek) SQLGetProp(hdbe,parmeter) SQLRollback(hdbc) SQLDisConnect(hdbc)
pw = allt(thisform.jszo.value) con = sqlconnect("LocalServer","ujabb",pw) if con < 0 …… endif p = sqlexec(con,"SELECT max(kod) db FROM dolg","cu1") if p > 0 select cu1 kod = cu1.db + 1 endif p = sqlexec(con,"INSERT INTO DOLG VALUES(" + allt(str(kod))+ ",'" + allt(thisform.nev.value)+"') ")
MS elérési felületek ODBC DAO/JET DAO RDO ADO DAO JET RDO OLEDB ODBC OLEDB-D SQLServer
ADO felület Universal Data Access RDBMS OODBMS ISAM MAPI LDAP XML … Objektum orientált szemléletű ADO.Net környezet
ADO.Net objektum modell Framework Data Provider: (adatkapcsolat) - Connection - Error, Property - Command - Parameter, Property - DataReader - Field, Property - DataAdapter DataSet: (lokális kezelés) - DataTable - DataRelationCollection DataReader: ReadOnly kurzor
Objektumok kapcsolata DataReader Connection ExecuteNonQuery() ExecuteReader() CreateCommand() Command Open() Prepare() BeginTransaction() CreateParameter() ConnectionString CommandText CommandType Transaction CommandTimeout DataParameter
RecordsAffected DataReader NextResult() FieldCount GetInt() Close() Read() DataRecord GetString() GetName() getFieldType() Transaction Commit() IsolationLevel DataParameter SourceColumn Rollback() DbType Value
{ SqlConnection nW = new SqlConnection ( ”Data Source=LocalHost”,….); SqlCommand sC = nW.CreateCommand(); sC.CommandText = ”SELECT ar FROM b …”; nW.Open(); SqlDataReader mR = sC.ExecuteReader(); while (mR.Read()) { …. mR.GetInt(1); … mR.GetString(..)… } mR.Close(); nW.Close();
{ OleDbConnection nW = new OleDbConnection (…); nW.Open(); OleDbCommand sC = new OleDbComamnd(nul, nW); … sC.CommandText = ”INSERT INTO … VALUES(@i,…)”; sC.Parameters.Add(”@i”,11); sC.Prepare(); sC.ExecuteNonQuery(); sC.Parameters[0].Value = 13; nW.Close(); }
DataSet (memória adatcache) Tables Relations View Rows Primary Key Constraints Columns FilterName ReadOnly DataType Attributes AutoIncrement Size BaseType DefaultValue IsArray
ADO-VFP Con = CREATEOBJECT(”ADODB:CONNECTION”) && registry : HKEY_CLASSES_ROOT
JDBC Kapcsolati típusok ODBC JDBC D 1 JDBC-ODBC DBMS D 1 Java JDBC-DBAPI J-Net Net JDBC tiszta JDBC
JDBC – API (Java) Logikailag olyan objektum szerkezet mint az ADO-nál gazdagabb metódus és tulajdonságkészlet Class. forName(”.. driver…”) c = DriverManager.getConnection(elérés) s = c.createStatement() r = s.executeQuery(parancs) r.next() r.getStrting(mezo) r.getInt(mezo) try {…} catch (SQLException e) { }
public static void main(String[] args) { String url = "jdbc:odbc:hinfodbc"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection(url,"scott","tiger"); rs = stmt.executeQuery("SELECT * FROM dolgozo"); while (rs.next()) { int i = rs.getInt("kod"); String s = rs.getString("nev"); System.out.println(i + " : " + s + " : " + j); } rs.close(); stmt.close(); con.close(); catch (SQLException ex) { System.out.println("SQL hiba:" + ex.getSQLState()); } }