JDBC Datenbank problem

hi ich hab ein problem und zwar weis ich leider nicht woran es liegen könnte…
Das Problem is folgendes… ich mache eine Abrage auf eine Access Datenbank… wenn ich das 1 mal mache geht das ganze ohne probleme… aber das programm in dem der zugriff verwendet wird greift mehrmals auf das „Statment“ zu und holt sich einen neuen „Resultset“… zu testzwecken hab ich eine for schleife gemacht die mir z.b 200 mal hintereinander einen Resultset aus dem Statment holt… je komplexer der Programmcode ist desto öfter bekomm ich eine java.sql.SQLException mit der nichtsagenden Meldung General Error… oder Function Proccessing Error… meistens bricht er beim 37 oder 38 durchgang damit ab da er eine Nullpointerexception wirft… was auch klar is da er versucht mit der next() methode auf einen nicht vorhandenen Resultset zu zugreifen…

Woran kann das liegen?? ODBC Treiber? JDBC version?AccessDatenbank? statische Deklaration der Methoden?
oder programmcode?

Danke für eure hilfe im voraus

Hier ist eine stark verkürzte Form des Programmcodes…

//Datei Datenbank.java

import java.sql.*;
import java.util.*;

public class Datenbank
{

private static Statement stmt = null;
private static Connection conn = null;
private static boolean lock=false;
//****Allgemeine Datenbankzugriffsmethoden****

public static void ODBCStarten()
{
if (stmt != null) return;
try{
Class.forName(„sun.jdbc.odbc.JdbcOdbcDriver“);
}catch(Exception e)
{System.out.println(e);}
String url = „jdbc:odbc:Test“;
try{
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();

}catch(Exception e)
{System.out.println(e);}

}

public static void ODBCBeenden()
{try{
stmt.close();
conn.close();
}catch(SQLException e)
{System.out.println(„Datenbank konnte nicht geschlossen werden“);}
}

private static ResultSet getResultSet(String Query)
{ ResultSet result=null;

try{
if (stmt == null) return null;
while(result==null)
{
result = stmt.executeQuery(Query);
}
}catch(Exception e)
{System.out.println("getResultSet : " + e);}
return result;
}

public static Vector getTestList()
{
Vector testList = new Vector();
RequestTest test = null;
ResultSet set = null;
set = getResultSet(„SELECT * FROM test;“);

try{
while(set.next())
{
test = new RequestTest(set.getLong(1),set.getString(2),set.getBoolean(3),set.getString(4));
testList.add(test);
}
}catch(SQLException e)
{System.out.println(„getTestlist|next :“ + e);}
return testList;
}

public static void main(String args[])
{
ODBCStarten();
int zaehler=1;
for (int j=0;j//class RequestTest.java

import java.util.Vector;

public class RequestTest
{
private long testID;
private boolean multiple;
private String name; // = Testname
private String ausfuellVorschrift;
private Vector fragen=null;
private Vector ergebnisse=null;

//
// Konstruktor initialisiert das Objekt mit Werten aus dem DB-Zugriff
//
public RequestTest(long testID, String name, boolean multiple, String ausfuellVorschrift)
{
this.testID = testID;
this.multiple = multiple;
this.name = name;
this.ausfuellVorschrift = ausfuellVorschrift;
}

public RequestTest(long testID, String name, boolean multiple, String ausfuellVorschrift, Vector fragen, Vector ergebnisse)
{
this.testID = testID;
this.multiple = multiple;
this.name = name;
this.ausfuellVorschrift = ausfuellVorschrift;
this.fragen = fragen;
this.ergebnisse = ergebnisse;
}
//
// Methoden zur Übergabe der Felder nach außen
//
public long getID()
{
return testID;
}

public boolean isMultiple()
{
return multiple;
}

public String getName()
{
return name;
}

public String getAusfuellvorschrift()
{
return ausfuellVorschrift;
}

public Vector getFragen()
{
return fragen;
}

public Vector getErgebnisse()
{
return ergebnisse;
}

public void setFragen(Vector fragen)
{this.fragen = fragen;
}

public void setErgebnisse(Vector ergebnisse)
{this.ergebnisse = ergebnisse;
}

}

hi ich hab ein problem und zwar weis ich leider nicht woran es
liegen könnte…
Das Problem is folgendes… ich mache eine Abrage auf eine
Access Datenbank… wenn ich das 1 mal mache geht das ganze
ohne probleme… aber das programm in dem der zugriff verwendet
wird greift mehrmals auf das „Statment“ zu und holt sich einen
neuen „Resultset“… zu testzwecken hab ich eine for schleife
gemacht die mir z.b 200 mal hintereinander einen Resultset aus
dem Statment holt… je komplexer der Programmcode ist desto
öfter bekomm ich eine java.sql.SQLException mit der
nichtsagenden Meldung General Error… oder Function
Proccessing Error… meistens bricht er beim 37 oder 38
durchgang damit ab da er eine Nullpointerexception wirft… was
auch klar is da er versucht mit der next() methode auf einen
nicht vorhandenen Resultset zu zugreifen…

Woran kann das liegen?? ODBC Treiber? JDBC
version?AccessDatenbank? statische Deklaration der Methoden?
oder programmcode?

Danke für eure hilfe im voraus

Hier ist eine stark verkürzte Form des Programmcodes…

//Datei Datenbank.java

Der „General Error“ (an dieser Stelle vielen Dank an Microsoft für die ausführlich Fehler Beschreibung!!!) vorallem dann, wenn

  1. Die Datentypen nicht übereinstimmen (int - String oder so)
  2. Wenn ein Primary Key gesetzt ist

Ein Lösungs ansatz wäre alle Statements mit PreparedStatements zu ersetzten. PreparedStatements sind in der Datenbank vor compliliert und deshalb fehlerfreier. Zu Überprüfen ist, ob alle ResultSets wieder geschlossen werden.

PreparedStatement myPrepStmt;
myPrepStmt= myConnecton.prepareStatement("Select * from anyTable where nummero= ? ");
myPrepStmt.setInt(1, myNummeroIsAnInt);
ResultSet myReSet;
myReSet= myPrepStmt.executeQurey();

while(myReSet.next())
{
System.out.println(myReSet.getInt(1));
}

myReSet.close();

Fragst du per FeldName oder Nummer ab? Letzters ist das richtige.

try{
if (stmt == null) return null;
while(result==null)
{
result = stmt.executeQuery(Query);
}
}catch(Exception e)
{System.out.println("getResultSet : " + e);}
return result;
}

Das ist nicht so schön, versuche es zumindest so:

PreparedStatement stmt=conn.prepareStatement(Qurey);

try{
// Löschen!! if (stmt == null) return null;
while(result == null) // wozu das?
{
result = stmt.executeQuery();

while(result.next())
{
variable= result.get();
}

result.close(); // gaaanz wichtig!
result= null;

}
}catch(Exception e)
{System.out.println("getResultSet : " + e);}
return result;
}

Fazit:

  • ResultSets immer nach gebrauch gut schliessen!
  • Statements sind immer PreparedStatement und wollen auch irgendwann geschlossen werden
  • PrimayKeys ???
  • DatenTypen müssen den FeldTypen in Access entsprechen
  • Statt „Select * fr…“ immer die Feldnamen angeben!
  • auf Grund de Instabilität und der Einschränkungen, die
    ResultSets mit sich bringen sollte man die Inhalte der einzalnen Felder lieber erst variablen zuordnen und nicht gleich in einen Methodenaufruf einsetzten…

P.S.: Wenn ich noch einen Tip geben darf

try
{
}
catch(Exception err)
{
err.printStackTrace(); // sagt viel mehr aus als
System.out.println(err);
// oder
System.out.println(err.getMessage());
}