Derby/JavaDB '<columnName>' is not a column in table or VTI '<value>'.

Kros

Mitglied
Hallo

Versuche über
Code:
 statement.executeUpdate(qryDML);
einen Datensatz in die embedded Derby Datenbank zu schreiben. Dabei erhalte ich exception:
Code:
'<columnName>' is not a column in table or VTI '<value>'.

Da ich mir sehr sicher bin, dass der Spaltenname stimmt, wollte ich euch fragen ob es für diese Fehlermeldung auch noch andere Gründen geben kann, ausser, dass die Spalte in der Datenbank nicht gefunden wurde. Und was bedeutet das VTI?

Grüsse Kros
 
Zuletzt bearbeitet:
:toll:

Das war doch nur die allgemeine Meldung aus der Doku. Die effektive Fehlermeldung lautet:

Code:
'VORNAME' is not a column in table or VTI 'APP.TBLPERSON'.

und der SQL String lautet:
Code:
INSERT INTO APP.TBLPERSON (Vorname) VALUES ('halloMeinNameIst')

und ja ich bin sicher das ich in der Tabelle TBLPERSON eine Spalte mit dem Namen VORNAME habe.
 
Mit einer Meldung aus der Doku ist dir aber wenig zu helfen. Funktioniert denn ein insert auf einer andere Spalte? Sprich ein generelles Problem oder nur mit dieser Spalte? Funktioniert ein select?

Funktioniert das Statement ausserhalb der Anwendung?

Hinter VTI verstecken sich die Table Function.
 
In meiner Datenbank habe ich aktuell 3 Tabellen mit unterschiedlich vielen Spalten.

Ich lasse mir die Datenbanktabellen in einem JFrame anzeigen. Welche Tabelle angezeigt werden soll, wähle ich mit einem JComboBox aus, welches über die jeweilige SELECT Anweisung das ResultSet hohlt und mittels DefaultTableModel weiterverarbeitet. Das ganze funktioniert tip top.

Das INSERT funktioniert jedoch nicht. In der Zwischenzeit habe ich versucht andere Spalten mittels Update anzusprechen. Das hat nur bei einer Spalte funktioniert.

Tabelle TBLPRODUKT
"INSERT INTO APP.TBLPRODUKT (TFIRMA) VALUES ('halloMeinNameIst')"; -> Funktioniert, die Daten werden in die DB übernommen.

Tabelle TBLPERSON
"INSERT INTO APP.TBLPERSON (Name) VALUES ('halloMeinNameIst')"; -> Funktioniert nicht
"INSERT INTO APP.TBLPERSON (Vorname) VALUES ('halloMeinNameIst')";-> Funktioniert nicht
"INSERT INTO APP.TBLPERSON (Geschlecht) VALUES ('halloMeinNameIst')";-> Funktioniert nicht
"INSERT INTO APP.TBLPERSON (Geburtsdatum) VALUES ('halloMeinNameIst')";-> Funktioniert nicht

Tabelle TBLPRODUKT
"INSERT INTO APP.TBLPRODUKT (Produktname) VALUES ('halloMeinNameIst')";-> Funktioniert nicht
"INSERT INTO APP.TBLPRODUKT (IDFIRMA) VALUES ('halloMeinNameIst')";-> Funktioniert nicht

Ein Insert über den Data Source Explorer in Eclipse funktioniert für alle Spalten.

Habt ihr eine Idee wie ich das Problem eingrenzen könnte?
 
das insert mittels Data Source Explorer hast du aber mit dem gleichen User gemacht? Sonst könnte ich mir noch vorstellen, dass das Recht für insert fehlt.

Ansonsten vielleicht mit execute() probieren anstelle von executeUpdate()
 
Jup mit dem gleichen User. Mit execute() erhalte ich das selbe Ergebnis (Ergebnis im Sinn von geht nicht ;( )

Kann es daran liegen dass ich meine DB-Connection die ganze Zeit geöffnet lasse? Das ganze läuft akteull so ab:

Treiber laden
Code:
Class.forName(treiber);
Verbindung aufbauen
Code:
conn = DriverManager.getConnection("jdbc:derby:" + dbName, user, passwd);
Erste Abfrage durchführen (Auflistung aller Tabellen in einem ResultSet und dann weiter in ein ComboBox)
Zweite Abfrage durchführen (Die ausgewählte Tabelle in einem JTable anzeigen)
Dritte Abfrage (Daten zur Tabelle hinzufügen)

Das alles über die selbe Verbindung ohne diese zu Beenden. Könnte es daran liegen?
 
Habe nun eine neue Datenbank erstellt und darin wieder eine neue Tabelle angelegt. Das Problem ist das selbe. Nun habe ich noch den Code soweit heruntergekürzt, dass nur noch das nötigste für die SQL Anweisung steht, dennoch erhalte ich die selbe Fehlermeldung:

Java:
			String sql = "INSERT INTO TBLFIRMA (FirmenName) VALUES ('GUGGUS')";
			
				
				String dbHost = "";
				String treiber = "org.apache.derby.jdbc.EmbeddedDriver";
				String dbPort = "";
				String dbName = "sani;create=true";
				String user = "";
				String passwd = "";
				
				try {
					System.out.println("TreiberLaden");
					Class.forName(treiber);
				} catch (ClassNotFoundException cnfe) {
					System.out.println("Treiber kann nicht geladen werden: "
							+ cnfe.getMessage());
				}
				
				try {
					System.out.println("Verbindung aufbauen");
					Connection con;
					con = DriverManager.getConnection("jdbc:derby:" + dbName,
							user, passwd);
					
					con.createStatement().execute(sql);
					
				} catch (SQLException sqle) {
					System.out.println("Verbindung ist fehlgeschlagen: "
							+ sqle.getMessage());
				}

Meldungen in der Konsole
Java:
TreiberLaden
Verbindung aufbauen
Verbindung ist fehlgeschlagen: 'FIRMENNAME' is not a column in table or VTI 'APP.TBLFIRMA'.
INSERT INTO TBLFIRMA (FirmenName) VALUES ('GUGGUS')

Ich gebs auf
 
Hallo nochmal, habe das Problem noch etwas eingegrenzt.

Situation 1: Wie ich es bis jetzt gemacht habe:
  • Im Data Source Explorer eine Tabelle angelegt
  • Eine Insert Anweisung über den Programmcode abgesendet

Situation 2: Wie ich es jetzt versucht habe
  • Über den Programcode eine Tabelle angelegt
  • Eine Insert Anweisung über den Programmcode abgesendet

Situation 2 funktioniert wunderprächtig. Verstehen kann ich es allerdings nicht wirklich. Hat da jemand eine Idee?

Grüsse
 
ich denke es hat bei einer Spalte funktioniert? Kannst mal das create=true weglassen, das sollte eigentlich die db nur erzeugen, wenn sie nicht existiert. Kommt dann ein Fehler?
Greifst sonst mit dem DS Explorer auf ne falsche db zu? Wenn du jetzt einmal die Tabelle über das Prog angelegt hast bleibt sie erhalten?
 
Ja stimmt, bei der einten Tabelle (mit nur einer Spalte) hat es auch schon vorher funktioniert.

Ob mit create=true oder ohne, hab ich versucht, ändert aber nichts.

Nun habe ich versucht mittels Javacode, in beide Datenbanken je eine neue Tabelle einzufügen und gleichzeitig einen Datensatz zu speichern. Beide neuen Tabellen sind im DS Explorer ersichtlich. Auch der neue Datensatz ist in der jeweiligen Tabelle gespeichert.

Ich werde meine Tabellen mal Grundsätzlich mittels Javacode erstellen. Dennoch interessiert es mich wo mein Fehler liegt. Ich gehe davon aus, dass irgendwelche Einstellung im DS Explorer dazu führen.

Gruss und Danke
 
OK nun bin ich wohl voll und ganz plemplem 😱

Habe mein GUI so erweitert, dass ich nun in einem JTextArea den SQL String direkt eingeben kann und über einen Button diesen an die Datenbank sende. So wollte ich die einzelnen Tabellen halt direkt erstellen und die Insert Anweisungen direkt testen können.

Nun habe ich so wieder zwei Tabellen erstellt und die Insert Anweisung funktioniert nun bei der einten Tabelle und bei der anderen nicht.

Kann es sein das mein Datenbank Treiber defekt ist?

edit: Neuer Treiber heruntergeladen -> Problem nicht weg
 
Zuletzt bearbeitet:
So... Nun funktioniert es.

Tabellen- und Spaltennamen mit Kleinbuchstaben oder gemischt mit Klein- und Grossbuchstaben gemischt geschrieben funktioniert nicht.

Tabellen- und Spaltennamen mit ausschliesslich Grossbuchstaben geschrieben Funktioniert

Ob beides (Tabllen- und Spaltennamen) Gross geschrieben werden muss weiss ich nicht, funktioniert aber.
 

Zurück
Oben