Diskuze: JDBC ODBC práce s databází
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.




Trochu jsem to poupravil
package DB;
import java.sql.*;
public class db01
{
String url="jdbc:odbc:DB02";
String jmeno;
String prijmeni;
Connection dB;
Statement pozadavek;
String dotaz;
ResultSet vysledky;
public db01() {
connect();
}
public void connect() {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dB = DriverManager.getConnection(url);
dotaz = "SELECT * FROM Studenti WHERE ID = '2'";
pozadavek = dB.createStatement();
vysledky = pozadavek.executeQuery(dotaz);
boolean zaznamy = vysledky.next();
if (!zaznamy)
{
System.out.println("Nebyla vracena žádná data");
System.exit(1);
}
} catch (ClassNotFoundException v1)
{
System.err.println("Nepodařilo se zavést most JDBC/ODBC."+v1.getMessage());
System.exit(1);
} catch (SQLException v2)
{
System.err.println("Nepodařilo se připojit k databázi. "+v2.getMessage());
System.exit(2);
}
try
{
do
{
jmeno=vysledky.getString(1);
prijmeni=vysledky.getString(2);
System.out.println(jmeno+" "+prijmeni);
}
while (vysledky.next());
pozadavek.close();
vysledky.close();
dB.close();
} catch (SQLException v3)
{
System.err.println("Chyba při zobrazení dat. "+v3.getMessage());
System.exit(3);
}
}
public static void main(String[] args) {
db01 a01 = new db01();
a01.connect();
}}
a CHYBA:
Nepodařilo se připojit k databázi. [Microsoft][Ovladač ODBC pro Microsoft Access] Nesoulad datových typů ve výrazu.
Kit:4.6.2013 10:21
Autor knihy "Java bez předchozích znalostí" ji prý psal bez předchozích znalostí. Najdi si lepší učebnici.
V tom tvém zápisu se bohužel moc nevyznám. Takové divné odsazování to hrozně znepřehledňuje.
David Hartinger:4.6.2013 10:42
Nedávno jsem toto řešil. JDBC je jen sada rozhraní, aby se s každou databází pracovalo v Javě stejně. Abys mohl pracovat s konkrétní databází, potřebuješ ovladač (Connector). Je to soubor .jar, který stáhneš na webu té konkrétní databáze a potom ho přidáš jako knihovnu k vlastnostem projektu. Zkus to stáhnout tady: http://www.jarfinder.com/…bcOdbcDriver
Já jsem dělal zatím jen s MySQL, odbc nevím co je, ale funguje to všechno stejně.
David Hartinger:4.6.2013 10:51
Vzpomínám si, že jsi jednou hledal jak pracovat s SQLite v Javě - https://bitbucket.org/…/sqlite-jdbc Tady je implementace pro jdbc pro SQLite. Možná na to napíši tutoriál.
Kit:4.6.2013 10:56
Mezitím jsem to našel, ale zarazila mě ta velikost přes 100 MB. Takhle jsem si dietní databázovou knihovnu nepředstavoval. Aplikaci jsem raději napsal v Pythonu, který má SQLite už v základní výbavě. Šlape jako hodinky.
Kit:4.6.2013 11:11
I to je moc. Originál má něco kolem 150 KB. Nechápu, co na té aplikaci má 3 MB.


Díky
už to funguje, jen nevím jak použít block finale. Píše mi to, že musím to mít v try catch. Nevíte někdo jak tomu zabránít, v případě toho posledního catch mě štve, že vždycky hodí chybu.
package DB;
import java.sql.*;
public class db01
{
String url="jdbc:odbc:myDB";
String jmeno;
String prijmeni;
static Connection dB;
Statement pozadavek;
String dotaz;
static ResultSet vysledky;
public db01()
{
connect();
}
public void connect()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dB = DriverManager.getConnection(url);
} catch (ClassNotFoundException v1)
{
System.err.println("Nepodařilo se zavést most JDBC/ODBC."+v1.getMessage());
System.exit(1);
} catch (SQLException v2)
{
System.err.println("Nepodařilo se připojit k databázi. "+v2.getMessage());
System.exit(2);
}
try
{
dotaz = "SELECT * FROM Studenti WHERE Jméno = 'Ferda' and ID=2";
pozadavek = dB.createStatement();
vysledky = pozadavek.executeQuery(dotaz);
} catch (SQLException v3)
{
System.err.println("Chyba SQL. "+v3.getMessage());
System.exit(3);
}
try
{
boolean zaznamy = vysledky.next();
if (!zaznamy)
{
System.out.println("Nebyla vracena žádná data");
System.exit(3);
}
do
{
jmeno=vysledky.getString(2);
prijmeni=vysledky.getString(3);
System.out.println("ID je "+vysledky.getString(1)+" a jméno: "+jmeno+" "+prijmeni+". Adresa: ");
}
while (vysledky.next());
pozadavek.close();
} catch (SQLException v4)
{
System.err.println("Chyba při zobrazení dat. "+v4.getMessage());
System.exit(4);
}
finally
{
try
{
vysledky.close();
dB.close();
} catch (Exception v5)
{
System.err.println("Chyba při ukončení spojení. "+v5.getMessage());
System.exit(5);
}
}
}
public static void main(String[] args)
{
db01 a01 = new db01();
a01.connect();
}
}
a výsledek:
ID je 2 a jméno: Ferda Srab. Adresa:
Chyba při ukončení spojení. ResultSet is closed
Kdo by věděl o nějaký radě, budu rád a moc to ocením.
David Hartinger:4.6.2013 11:27
Máš v tom strašný bordel, jestli někdo tohle učí v knize, tak za to
bych ho proplesknul Pamatuj
si, že nikdy nemáš ukončovat aplikaci System.exit, aplikace má skončit
sama, jen tak se v ní potom vyznáš.
Proč máš připojení pojmenované jako dB? Výsledky se zavřou samy, stačí zavřít spojení.
Na práci s databází si udělej třídu. Bude mít metody pripoj(), odpoj() a dále několik metod které potřebuješ, např. najdiUzivatele(), pridejUzivatele() atd.
Můžeš mi napsat, co je tedy zač ta odbc?
David Hartinger:4.6.2013 11:32
Já nevím, proč tohle tak řešíš. I kdyby měl 10mb, tak v čem je rozdíl? Stáhne se to za vteřinu, zabírá to miliontinu disku. Již není důvod tolik řešit velikost, proto se tvůrci knihoven ty své ani nesnaží udělat co nejmenší.
Kit:4.6.2013 11:52
Možná se to stahuje rychle, ale zbytečně to zdržuje při spouštění aplikace. Pak někdo nadává, že je to pomalá databáze.
Nevím proč řešíš, že se mi na některé aplikace hodí lépe Python, ve kterém už spoustu práce udělal někdo přede mnou a spouštění aplikace je rychlejší. Tu aplikaci spouštím cca 10× za minutu, v Javě běží 0.7 s, v Pythonu 0.15 s. Pokaždé čekám na výsledek a časový rozdíl je znát. Program v Pythonu je výrazně kratší, nic nemusím stahovat, vše je standardní. Proč bych v daném případě neměl dát přednost Pythonu?
Takhle to v té knížce přímo není. Tam jsou jen úryvky kódů a já to spojoval podle svého úsudku.
Nakonec se podařilo
přípojení navázáno
teď
už jen GUI tlačítka.
V ovládacích panelech jsou Nástroje pro správu -> Datové zdroje (ODBC) to je k zapnutí nějakého Driveru na Microsoft Access pro spojení názvu a cesty k databázi.
Final:
package DB;
import java.sql.*;
public class db01
{
String url="jdbc:odbc:myDB";
String jmeno;
String prijmeni;
Connection dB;
Statement pozadavek;
String dotaz;
ResultSet vysledky;
public void connect()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dB = DriverManager.getConnection(url);
} catch (ClassNotFoundException v1)
{
System.err.println("Nepodařilo se zavést most JDBC/ODBC."+v1.getMessage());
System.exit(1);
} catch (SQLException v2)
{
System.err.println("Nepodařilo se připojit k databázi. "+v2.getMessage());
System.exit(2);
}
try
{
dotaz = "SELECT * FROM Studenti WHERE Jméno = 'Ferda' and ID=2";
pozadavek = dB.createStatement();
vysledky = pozadavek.executeQuery(dotaz);
} catch (SQLException v3)
{
System.err.println("Chyba SQL. "+v3.getMessage());
System.exit(3);
}
try
{
boolean zaznamy = vysledky.next();
if (!zaznamy)
{
System.out.println("Nebyla vracena žádná data");
System.exit(3);
}
do
{
jmeno=vysledky.getString(2);
prijmeni=vysledky.getString(3);
System.out.println("ID je "+vysledky.getString(1)+" a jméno: "+jmeno+" "+prijmeni+". Adresa: ");
}
while (vysledky.next());
pozadavek.close();
} catch (SQLException v4)
{
System.err.println("Chyba při zobrazení dat. "+v4.getMessage());
System.exit(4);
}
finally
{
try
{
vysledky.close();
dB.close();
} catch (Exception v5)
{
System.err.println("Chyba při ukončení spojení. "+v5.getMessage());
System.exit(5);
}
}
}
public static void main(String[] args)
{
db01 a01 = new db01();
a01.connect();
}
}
Zobrazeno 14 zpráv z 14.