# Auf Firebird 2.0 zugreifen mit Jaybird



## soucy (19. Aug 2006)

Hi,

Entweder bin ich einfach nur zu Dumm dazu oder ich mach irgendwas falsch ... ich hab nun das Example rund 5 mal komplett gelesen aber ich blicks einfach nicht :/

Ich habe eine Java Anwendung mit GUI, welche nun mit einer Firebird 2.0 DB über Jaybird 2.1.0 kommunizieren soll. Nun habe ich die firebirdsql-full.jar über Projektoptioen/Build-Path/External Jar's geladen. (eclipse als ide)

Jedoch sobald ich wie in x Beispielen im Netz gefunden, den Treiber bei dem DriverManager registrieren will, bringt es mir nen Fehler. Class.forName( "org.firebirdsql.jdbc.FBDriver" ); -> "Unhandled exception type ClassNotFoundException"

Ich kann eigentlich recht gut Englisch, aber da ich noch nicht so gewandt in Java bin, komme ich mit den Beispielen die ich bisher so gefunden habe einfach nicht zurecht.

Gibt es ein gutes leicht zu verstehendes Beispiel, oder hat hier jemand die Güte mir zu erklären, wie ich es schaffe das ich:

1. Mit meiner Java Anwendung auf die DB  ( C:\db.fdb ) zugreifen kann.  User: test PW: bla
2. Wie ich Daten aus einer Tabelle lesen, schreiben, löschen und updaten kann

Ich wäre über Hilfe sehr sehr dankbar, da ich seit 5 Tagen einfach nichts hinbekomme im Bezug auf die DB Connection und schon fast am verzweifeln bin ob ich das überhaupt noch schaffe :/


----------



## abollm (22. Aug 2006)

soucy hat gesagt.:
			
		

> Hi,
> 
> Entweder bin ich einfach nur zu Dumm dazu oder ich mach irgendwas falsch ... ich hab nun das Example rund 5 mal komplett gelesen aber ich blicks einfach nicht :/
> 
> ...



Mann, hast du ein Glück, dass ich mich zufälligerweise mit diesem Kram die letzten Tage herumschlagen musste. Hier ein lauffähiges Beispiel mit Firebird 1.0.3 (V6.2-972). Das Beispiel liest CSV-Daten aus einer Tabelle (fünf Spalten).


```
/* Original version of this file was part of InterClient 2.01 examples
 * 
 * Copyright InterBase Software Corporation, 1998.
 * Written by com.inprise.interbase.interclient.r&d.PaulOstler :-)
 * 
 * Code was modified by Roman Rokytskyy to show that Firebird JCA-JDBC driver
 * does not introduce additional complexity in normal driver usage scenario.
 * 
 * An example of using a JDBC 2 Standard Extension DataSource.
 * The DataSource facility provides an alternative to the JDBC DriverManager,
 * essentially duplicating all of the driver manager’s useful functionality.
 * Although, both mechanisms may be used by the same application if desired,
 * JavaSoft encourages developers to regard the DriverManager as a legacy
 * feature of the JDBC API.
 * Applications should use the DataSource API whenever possible.
 * A JDBC implementation that is accessed via the DataSource API is not
 * automatically registered with the DriverManager.
 * The DriverManager, Driver, and DriverPropertyInfo interfaces
 * may be deprecated in the future.
 * 
 * mod. by ABollm
 * 
 */

package ib;

public final class DataSourceExample
{
  static public void main (String args[]) throws Exception
  {
    // Create an Firebird data source manually;
    
	org.firebirdsql.pool.FBWrappingDataSource dataSource = 
        new org.firebirdsql.pool.FBWrappingDataSource();

    // Set the standard properties
    //dataSource.setDatabase ("localhost/3050:c:/database/test_charset.fdb");
    dataSource.setDatabase ("localhost/3050:c:/IB/FBDB.GDB");
    dataSource.setDescription ("An example database of FirebirdDB");

	/*
	 * Following properties were not deleted in order to show differences 
	 * between InterClient 2.01 data source implementation and Firebird one.
	 */
	
    //dataSource.setDataSourceName ("Employee");
    //dataSource.setPortNumber (3060);
    //dataSource.setNetworkProtocol ("jdbc:interbase:");
    //dataSource.setRoleName (null);
    
    // Set the non-standard properties
    //dataSource.setCharSet (interbase.interclient.CharacterEncodings.NONE);
    //dataSource.setSuggestedCachePages (0);
    //dataSource.setSweepOnConnect (false);
	
    // this some kind of equivalent to dataSource.setNetworkProtocol(String)
    // possible values are "type4", "type2" and "embedded".
	dataSource.setType("TYPE4");
    
    // SQL Role can be set like this:
    // 
    // dataSource.setRoleName("USER");
    
    // Character encoding for the connection is set to NONE
    dataSource.setEncoding("ISO8859_1");
    
    // other non-standard properties do not have setters
    // you can pass any DPB parameter
    //
    // dataSource.setNonStandardProperty("isc_dpb_sweep", null);
    // dataSource.setNonStandardProperty("isc_dpb_num_buffers", "75");
	
    // Connect to the Firebird DataSource
    try {
			dataSource.setLoginTimeout(10);
			java.sql.Connection c = dataSource.getConnection("sysdba",
					"masterkey");

			java.sql.Statement stmt = c.createStatement();
			java.sql.ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable");
			while (rs.next()) {
				if (rs.isFirst()) {
					System.out.println("Spalte 1; Spalte2 ...");
				}
			System.out.println("\""+rs.getString(1) + "\";\""
					+ rs.getString(2) + "\";\"" + rs.getString(3)+ "\";\"" + rs.getString(4) 
					+ "\";\"" + rs.getString(5) + "\"");
			}
			stmt.close();

			// At this point, there is no implicit driver instance
			// registered with the driver manager!
			System.out.println("got connection");
			c.close();
		} catch (java.sql.SQLException e) {
			e.printStackTrace();
			System.out.println("sql exception: " + e.getMessage());
		}
  }
}
```

Du musst eigentlich nur noch die Angaben für die Firebird-DB, die Tabelle und die Login-Angaben auf deine Randbedingungen anpassen.

Hth


----------



## Guest (22. Aug 2006)

> Unhandled exception type ClassNotFoundException



hört sich für mich nach einem Compilerfehler an. Hast du denn einen Try-Catch Block um den Aufruf?


----------



## soucy (22. Aug 2006)

Erstmal vielen Dank abollm.

Habe deinen Code nun auf meine DB angepasst.

Wenn ich das Programm nun aber ausführe bringt mir eclipse:


```
org.firebirdsql.jdbc.FBDriverNotCapableException: Not yet implemented.
	at org.firebirdsql.jdbc.FBStatementFetcher.first(FBStatementFetcher.java:159)
	at org.firebirdsql.jdbc.FBResultSet.first(FBResultSet.java:1252)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.firebirdsql.pool.ResultSetHandler.invoke(ResultSetHandler.java:70)
	at $Proxy2.first(Unknown Source)
	at FH_PM.main(FH_PM.java:60)sql exception: Not yet implemented.
```

Was bedeutet dieses "Not yet implemented" ?


----------



## abollm (22. Aug 2006)

soucy hat gesagt.:
			
		

> Erstmal vielen Dank abollm.
> 
> Habe deinen Code nun auf meine DB angepasst.
> 
> ...



Zunächst kann ich dir auch nicht helfen, denn ich war heilfroh, dass ich nach gut einem Tag die mir gestellte Aufgabe erfolgreich lösen konnte. Ich habe zwar Ahnung von Java und einigen Datenbanken (Oracle, MySQL, MS-Access), aber bezüglich Firebird bin ich Anfänger wie du.

Gut, du hast eine aktuellere Firebird-Version und auch eine neuere Version des JDBC-Treibers als ich. Welche Jar-Files hast du in Eclipse alle in dein Projekt eingebunden?

Die obigen Fehlermeldungen deuten stark darauf hin, dass noch etwas fehlt. 

Bei mir sieht das wegen der notwenigen, einzubindenden Jars in Eclipse wie folgt aus (du brauchst hier nur die Jaybird-Jars in den Unterordnern "...Eclipse311\Jaybird\" und  "...Eclipse311\Jaybird\lib\"  zu beachten):







Irgendwo in der Doku zu den Jaybird-Klassen hatte ich den Hinweis gefunden, dass man alle diese Jar-Dateien für den DB-Zugriff einbinden sollte.

Hoffe das hilft, ansonsten vielleicht hier mit zusätzlichen Informationen erneut fragen.


----------



## soucy (23. Aug 2006)

Ok hab meinen Fehler gefunden  War einfach nur nen buchstabendreher, den eclipse nicht gemerkt/markiert hat 

Nun habe ich noch ne Frage und zwar wie kann ich nen String zuschneiden? Also wenn nen String in der DB max. 30 Zeichen haben kann da aber nur ein "Hallo" drinsteht hab ich später in der Java Variable über getString(x); Hallo und zig Leerzeichen bis die 30 Zeichen voll sind.

Wie schneide ich das nun ab?


----------



## abollm (23. Aug 2006)

soucy hat gesagt.:
			
		

> [..]
> Nun habe ich noch ne Frage und zwar wie kann ich nen String zuschneiden? Also wenn nen String in der DB max. 30 Zeichen haben kann da aber nur ein "Hallo" drinsteht hab ich später in der Java Variable über getString(x); Hallo und zig Leerzeichen bis die 30 Zeichen voll sind.
> 
> Wie schneide ich das nun ab?



Das ist eigentlich ganz einfach, hängt allerdings von den Regeln ab, wie genau du den String abschneiden willst. Ich habe hier einmal einen Schnipsel, aus dem du erkennen kannst, wie mit Hilfe von "substring" ein String abgeschnitten wird (vorletzte Zeile Code unten). Eine andere Möglichkeit, die von dir erwähnten Leerzeichen abzuschneiden, geht entweder direkt mit Hilfe von bestimmten SQL-Hilfsfunktionen in der Datenbank (ich kenne mich aber mit Firebird leider nur sehr wenig aus), oder aber direkt mit Hilfe einer Java-Funktion, hier trim(), mit der du allerdings auch die Blanks am Beginn eines Strings entfernst (s. letzte Zeile Code unten):


```
[..]
      NurDaten01 d = new NurDaten01();
      d.i = 47;
      d.f = 1.4f;
      d.d = 1.4d;
      //d.bd = 1e12;
      d.b = false;
      d.s = "     <- 5 Blanks + Mein erster String + 10 Blanks ->         ";
  
      //Zuerst Ausgabe des aktuellen Datums
      GregorianCalendar cal = new GregorianCalendar();
      //cal.setTimeZone(TimeZone.getTimeZone("ECT")); 
      printCalendarInfo(cal);
      System.out.println("---\n");
      //Nun Ausgabe der Informationen zum 22.6.1910,
      //dem Geburtstag von Konrad Zuse
      cal.set(Calendar.DATE, 22);
      cal.set(Calendar.MONTH, 5 - 1);
      cal.set(Calendar.YEAR, 1910);
      printCalendarInfo(cal);
      
      System.out.println("---\n");
      System.out.println("Ausgabe NurDaten02 (d):");
      System.out.println("=====================");
      System.out.println("Wert fuer i: "+ d.i);
      System.out.println("Wert fuer d: "+ d.d);
      System.out.println("Wert fuer d * d: "+ sqr(d.d));
      System.out.println("Wert fuer b: "+ d.b);
      System.out.println("Wert fuer s: "+ d.s);
      System.out.println("Substrring fuer s: "+ d.s.substring(0,4));
      System.out.println("String ohne Blnaks am Anfnag und Ende: "+ d.s.trim());
[..]
```

Die letzte Code-Zeile enthält den Befehl zum Abschneiden (Substring(anfang,ende).

Ansonsten in die API schauen.


----------

