SQLite ResultSetMetaData abfragen

Burny91

Mitglied
Hallo Allerseits,

ich programmiere gerade einen SQL-Browser und hänge an folgendem Problem. Ich habe eine GUI welche den Befehl an einen DBConnector sendet um zur DB zu "connecten". In der DBConnectorklasse führe ich auch den execute Befehl für die Statements aus. Nun will ich das ResultSet was ich danach erhalte in einem DefaultTableModel anzeigen. Die Aufbereitung des DFTs soll in einer Extraklasse passieren (Preparer). Nun will ich von der Preparerklasse aus auf das ResultSetMetaData zugreifen, um die Spaltenanzahl des ResultSets abzufragen. Doch nun erhalte ich folgende Fehlermeldung nach dem ich den Code aus der Preparerklasse ausgeführt habe:

Java:
Exception in thread "main" java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state
	at org.sqlite.RS.checkCol(RS.java:62)
	at org.sqlite.RS.getColumnCount(RS.java:319)
	at MainFiles.Preparer.<init>(Preparer.java:18)
	at MainFiles.Preparer.main(Preparer.java:46)

Wie kann ich nun auf das ResultSetMetaData zugreifen um getColumnCount() auszuführen?

Preparer
Java:
private DBConnector dBIns;
private ResultSetMetaData meta;

public Preparer() {
	dBIns = DBConnector.getInstance();
	dBIns.connect();
	dBIns.fireStatement("select last_name from president where last_name = 'Bush'");
	meta = dBIns.getResultSetMetaData();
	try {
		meta.getColumnCount();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	dBIns.disconnect();
}


DBConnector
Java:
private ResultSetMetaData meta;
private ResultSet resultSet;

public void fireStatement(String inputstat){
	try {
		//Um Befehle an die DB zu schicken brauchen wir ein Statement Objekt
		Statement stat = conn.createStatement();
		/*
		 * Das SQL-Statement wird ueber executeQuery() abgeschickt und in einem
		 * ResultSet gespeichert.
		 */
		resultSet = stat.executeQuery(inputstat);
		/*ResultSetMetaData gibt uns die Tabelleninformationen
		 *wieder (Spaltenanzahl, Spaltennamen, ...) 
		 */
		meta = resultSet.getMetaData();
		System.out.println(meta.getColumnCount());
		for (int i = 1; i < meta.getColumnCount(); i++){
			System.out.println("Spalte: " + meta.getColumnName(i));
		}
		
		//Die abgefragten Ergebnisse werden auf der Konsole ausgegeben 
		while(resultSet.next()){
			for(int i = 1; i <= meta.getColumnCount(); i++){
				System.out.print(resultSet.getString(i));
				System.out.print("|");
			}
			System.out.println();
		}
		
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
	

/**
 * The method getResultSetMetaData returns the meta data of the table.
 * @return Metadata of the table
 */
public ResultSetMetaData getResultSetMetaData(){
	return meta;
}

Hoffe auf Baldige Hilfe,

Mit freundlichen Grüßen

burny
 

DerEisteeTrinker

Bekanntes Mitglied
Variante 1: Anzahl als Rückgabewert der Methode "fireStatement"

Variante 2: die Anzahl zwischenspeichern und einen Getter erstellen, der für die MetaDaten fällt weg


Variante 2 hat den Vorteil, dass du noch mehr Daten, die eventuell wichtig sind auslesen kannst.


Noch ein Hinweis schau dir mal die Design-Patterns zu DAO und Fabrik / AbstrakteFabrik an :rtfm:
 

Burny91

Mitglied
Hi,

ich habe deine Variante 2 ausprobiert:

Variante 2: die Anzahl zwischenspeichern und einen Getter erstellen, der für die MetaDaten fällt weg

Nun hänge ich an einem weiteren Problem: Ich will den Vector für das DFT mit den Spaltennamen füllen. Doch mein Getter funktioniert nicht. Oder besser gesagt während ich den Vector erstelle kann ich nicht auf meine Instanz von DBConnector zugreifen. Wie umgehe ich das?

*getCOLUMN_NAMES() gibt mir ein Array mit den Spaltennamen zurück*

Java:
public class Preparer {

	public DBConnector dBIns = DBConnector.getInstance();
	private ResultSetMetaData meta;

	public Preparer() {
		dBIns.connect();
		dBIns.fireStatement("select last_name from president where last_name = 'Washington'");
		System.out.println("SPALTENN: " + dBIns.getCOLUMN_COUNT());
		dBIns.disconnect();
	}

	public Vector COLUMN_IDENTIFIER = new Vector() {
		{
			for (int i = 1; i <= dBIns.getCOLUMN_COUNT(); i++) {
//					add(meta.getColumnName(i));
				add(dBIns.getCOLUMN_NAMES()[i]);
				System.out.println(dBIns.getCOLUMN_NAMES()[i]);
			}
		}
	};
	
	/*TODO Klasse soll das DFT aufbereiten, in dem es die Daten aus dem DBConnector
	 * ausliest das DFT erstellt und der JTable von der GUI uebergibt.
	 * 
	 */
	public static void main (String[] args){
		Preparer prep = new Preparer();
		System.out.println("VECTORGROESSE: " + prep.COLUMN_IDENTIFIER.size());
		
		}
	}
 

DerEisteeTrinker

Bekanntes Mitglied
Wie sieht denn die Implementierung von
Java:
dBIns.getCOLUMN_NAMES()
aus?

Wenn ich raten darf, dann übergibst du da nur das Array aus den MetaDaten. Ich würde alles was du aus den MetaDaten brauchst kopieren (clonen), auch die Strings. So dass alles was du mit deinen Gettern erreichst nicht auf die MetaDaten mehr zugreift
 

Burny91

Mitglied
So hatte ich es mir auch gedacht:

Java:
COLUMN_NAMES = new String[meta.getColumnCount()];
//		Spaltennamen werden einem Array zugewiesen
		for (int i = 1; i < meta.getColumnCount(); i++){
//			System.out.println("Spalte: " + meta.getColumnName(i));
			COLUMN_NAMES[i] = meta.getColumnName(i);
//			System.out.println("Column_Name length: " + COLUMN_NAMES.length);
						
}

public String[] getCOLUMN_NAMES() {
	return COLUMN_NAMES;
}

Ich habe das clonen bis jetzt nur mit der Spaltenanzahl und den Spaltennamen gemacht.
Für den Vector brauch ich im nachhinein noch die Datensätze. Folglich müsste ich diese auch noch in einer Liste speichern. Richtig so?
 

Burny91

Mitglied
Die Schleife ist schon korrekt. Wenn i = 0 ist bekomme ich eine SQL-Column Exception. Meine Spalten gehen nur von 1-7.

Aber du hast recht. Ich sollte in dem Array bei 0 anfangen. Deswegen habe ich es so umgeändert.

Java:
for (int i = 1; i < meta.getColumnCount(); i++){
	COLUMN_NAMES[i-1] = meta.getColumnName(i);
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Airwolf89 Problem mit ResultSetMetaData Datenbankprogrammierung 11
S Aus ResultSetMetaData Klasse dynamisch erzeugen Datenbankprogrammierung 3
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
J Datenbank abfragen Datenbankprogrammierung 6
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
O SQL Abfragen mit Mini Datenbank Datenbankprogrammierung 12
M Sql Abfragen Datenbankprogrammierung 1
D 2 Abfragen zusammenfassen Datenbankprogrammierung 7
D MySQL Geburtsdatum per KW abfragen Datenbankprogrammierung 1
W Daten in Java intern abfragen Datenbankprogrammierung 1
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
D geänderte SELECT Abfragen Datenbankprogrammierung 15
D foreignkey abfragen und speichern Datenbankprogrammierung 74
K Viele verschiedenen SQL Abfragen Datenbankprogrammierung 2
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
R JPA dynamisch auf NULL abfragen Datenbankprogrammierung 2
A MySQL Tabelle ID abfragen und Spalte ausgeben Datenbankprogrammierung 4
K HSQLDB Einzelne Tabellen abfragen? Datenbankprogrammierung 4
F myBatis und komplexe Abfragen Datenbankprogrammierung 3
M MySQL Spaltennamen abfragen Datenbankprogrammierung 2
B Abfragen fehlgeschlagen Datenbankprogrammierung 6
D MySQL Applet MYSQL Abfragen Sicherheit Datenbankprogrammierung 2
E Datenbank Abfragen in eine GUI schreiben Datenbankprogrammierung 8
I Tabelle mit "|" getrennten Werten -> einzelnen Wert davon abfragen Datenbankprogrammierung 15
N Daten aus Datenbank abfragen und anzeigen in der Praxis?? Datenbankprogrammierung 2
S MySQL Server Informationen abfragen Datenbankprogrammierung 6
turmaline [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen Datenbankprogrammierung 11
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
H Derby SQL-Abfragen in Datei abspeichern Datenbankprogrammierung 2
trash SQL, ganze Tabelle abfragen Datenbankprogrammierung 3
E MySQL 2 Fragen zur Syntax von SQL-Abfragen Datenbankprogrammierung 8
brainray Bei MySQL alle Datenbanken eines Servers abfragen Datenbankprogrammierung 3
N mehrere Abfragen nacheinander wie mit MS Access mit JAVA Datenbankprogrammierung 3
MQue größte id in einer Tabelle abfragen Datenbankprogrammierung 4
A Leere Zelle von einer DB abfragen Datenbankprogrammierung 3
S Abfragen auf Vorhanden Datenbankprogrammierung 23
G Mehrere Tabellen abfragen Datenbankprogrammierung 7
G SQL Abfragen hardcoded im Quelltext? Datenbankprogrammierung 15
G Prolog abfragen mit Java Datenbankprogrammierung 3
M H2 DAtenbank in .sql datei schreiben/abfragen ? Datenbankprogrammierung 3
A Abfragen, wer zur Zeit angemeldet ist Datenbankprogrammierung 3
S Datentypen einer Tabelle Abfragen? Datenbankprogrammierung 2
G Rechte abfragen Datenbankprogrammierung 8
L MySQL : Funktionsweise von '%' in Abfragen Datenbankprogrammierung 2
G INSERT abfragen ob erfolgreich? Datenbankprogrammierung 5
B Eingefügter Datensatz erneut abfragen. Datenbankprogrammierung 10
E Datentyp numeric abfragen? Datenbankprogrammierung 2
P Daten aus 2 Tabellen mit java abfragen Datenbankprogrammierung 9
F die DN eines LDAP verzeichnisses abfragen Datenbankprogrammierung 2
M Abfragen auf ResultSets Datenbankprogrammierung 3
E Einzelne SQL Abfragen, oder alles zusammen? (veraendert!!!) Datenbankprogrammierung 11
A Viele Abfragen auf einmal: Performance Datenbankprogrammierung 2
Z Zeilen-Anzahl abfragen bei Datenbank Datenbankprogrammierung 4
W RsultSet auf null abfragen funktioniert nicht Datenbankprogrammierung 4
isowiz SELECT SUM() Ergebnis in Java abfragen Datenbankprogrammierung 6
S MySQL Abfragen blockiern den Arbeitsspeicher Datenbankprogrammierung 6
G Anzahl der Datensaetze abfragen Datenbankprogrammierung 11
V Anzahl der Datensätze abfragen Datenbankprogrammierung 9
S Bereiche einer Datenbank abfragen Datenbankprogrammierung 3
N Mehrere Abfragen gleichzeitig - was passiert da? Datenbankprogrammierung 6
D Reihenfolge der Abfragen Datenbankprogrammierung 7
L mehrere Abfragen mit einem Statement!? Datenbankprogrammierung 5
G Select-Abfragen sind sehr langsam Datenbankprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben