Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Radek
Neregistrovaný
Avatar
Radek:3.6.2013 22:14

Dobrý den,

chtěl bych se zeptat, jestli by byl někdo ochotný a napsal hlavičku k připojení programu na databázi. Nejlépe MS Access, dělal jsem to podle knížky Java bez předchozích znalostí a nepodařilo se mi. Pořád to píše jako něco, že soubor nebyl nalezen.

Databáze i tabulka se jmenuje Studenti.

package databaz;

import java.sql.*;
import javax.sql.*;

public class db01 {
String url="jdbc:odbc:Studenti";
String IDuzivatele="admin";
String heslo = "test";
String jmeno;
String prijmeni;
Statement pozadavek;
ResultSet vysledky;
Connection dB;

try {
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  dB = DriverManager.getConnection(url,IDuzivatele,heslo);
  } 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 {
        String dotaz = "SELECT * FROM Studenti WHERE IDStudenta = '1234'";
        pozadavek = dB.createStatement();
        vysledky = pozadavek.executeQuery(dotaz);
  } catch (SQLException v3) {
    System.err.println("Chyba SQL. "+v3.getMessage());
    System.exit(3);
  }
    boolean zaznamy=vysledky.next();
    if (!zaznamy) {
      System.out.println("Nebyla vracena žádná data");
      System.exit(4);
    } try {
    do {
      jmeno=vysledky.getString(1);
      prijmeni=vysledky.getString(2);
      System.out.println(jmeno+" "+prijmeni);
    } while (vysledky.next());
    pozadavek.close();
    } catch (SQLException v4) {
      System.err.println("Chyba při zobrazení dat. "v4.getMessage());
      System.exit(5);
    } finally {
        vysledky.close();
    dB.close();
  }
}

chyba:

java.sql.SQLException: [Microsoft][Ovladač ODBC pro Microsoft Access] Nelze nalézt soubor (neznámý).
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at DB.database.main(database.java:14)
 
Odpovědět
3.6.2013 22:14
Avatar
Radek
Neregistrovaný
Avatar
Radek:4.6.2013 1:37

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.
 
Nahoru Odpovědět
4.6.2013 1:37
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
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.

Nahoru Odpovědět
4.6.2013 10:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
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ě.

Nahoru Odpovědět
4.6.2013 10:42
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Nahoru Odpovědět
4.6.2013 10:44
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
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.

Nahoru Odpovědět
4.6.2013 10:51
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
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.

Nahoru Odpovědět
4.6.2013 10:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:4.6.2013 11:00

Vždyť to má 3 MB.

Nahoru Odpovědět
4.6.2013 11:00
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
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.

Editováno 4.6.2013 11:13
Nahoru Odpovědět
4.6.2013 11:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Radek
Neregistrovaný
Avatar
Radek:4.6.2013 11:19

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.

 
Nahoru Odpovědět
4.6.2013 11:19
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
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 :D 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?

Nahoru Odpovědět
4.6.2013 11:27
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
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ší.

Nahoru Odpovědět
4.6.2013 11:32
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
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?

Nahoru Odpovědět
4.6.2013 11:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Duff.Beerman
Člen
Avatar
Duff.Beerman:4.6.2013 15:00

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();
  }
}
Editováno 4.6.2013 15:01
 
Nahoru Odpovědět
4.6.2013 15:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.