Dynamischen String in SQL Statement einbinden

fnerz

Mitglied
Hallo zusammen!

Ich möchte eine dynamischen String in ein SQL Statement einbinden, da der Filename variabel sein kann.

Code:
Connection con = null;
                Statement stmt = null;
                String query = null;
                
                String filen = filename.substring(0, filename.indexOf('.'));
                con = DriverManager.getConnection("jdbc:postgresql_postGIS://localhost:5433" + "user=postgres;password=dominik1;" + "database=geonetwork");
                query = "ALTER TABLE " + filen + " ADD GN_id INTEGER(10) ";
                stmt = con.createStatement();
                stmt.execute(query);

Erstmal eine kleine Anmerkung: Die Datenbank-Connectiondetails werden später noch in eine Properties Datei ausgelagert, also nicht gleich an den Kopf fassen;)

Problem ist nun, dass mir findbugs einen Bug raushaut, genauer gesagt diesen hier: org.fao.geonet.services.resources.UploadAndProcess.exec(Element, ServiceContext) passes a nonconstant String to an execute method on an SQL statement

Ich habe die ganze Sache schon mal mit String.Format versucht, allerdings hat dies an der Bugmeldung nichts geändert.

Gibt es irgendeine weitere Variante wie ich das Statement korrekt ausführen könnte ohne das findbugs meckert?

Besten Dank schon mal im Voraus!
 

Serrano

Mitglied
Hast du mit prepared statements versucht?
Java:
PreparedStatement prepStmt = con.prepareStatement("ALTER TABLE " + filen + " ADD GN_id integer (10)");
prepStmt.executeUpdate();
 

fnerz

Mitglied
wird das Problem nicht lösen.

entweder query als final deklarieren oder Warnung unterdrücken - leider kann man in diesem Fall kein PreparedStatement.setString() nutzen

Genau, mit prepared statements hatte es auch nicht hingehauen.

Das mit dem Unterdrücken in findbugs ist mir auch ein Rätsel. Ich habe über die Methode @SuppressWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING") angefügt, aber nix tat sich.

Mit final hatte ich es noch nicht versucht. Werde ich dann noch nachholen!
 

taro

Bekanntes Mitglied
Die Warnung solltest du mit folgender Zeile unterdrücken können:
Java:
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = {"SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE", "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" }, justification = "Irgend ein Grund")

Alternativ ist halt die Frage, ob das von dir genutzte DB-Design sinnig ist - zum einen wirst du bei Dateinamen wie a.b.c.txt unerwartete Ergebnisse bekommen, zum anderen lässt sich eine Datei nicht ohne weiteres umbenennen. Und zu guter letzt käme ich nie auf die Idee, eine Operation vom Dateinamen abhängig zu machen.
 
Zuletzt bearbeitet:

fnerz

Mitglied
Die Warnung solltest du mit folgender Zeile unterdrücken können:
Java:
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = {"SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE", "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" }, justification = "Irgend ein Grund")

Alternativ ist halt die Frage, ob das von dir genutzte DB-Design sinnig ist - zum einen wirst du bei Dateinamen wie a.b.c.txt unerwartete Ergebnisse bekommen, zum anderen lässt sich eine Datei nicht ohne weiteres umbenennen. Und zu guter letzt käme ich nie auf die Idee, eine Operation vom Dateinamen abhängig zu machen.

Ich würde das ganze gerne über eine ID machen, allerdings sind die IDs des Datensätze in der Datenbank abweichend von den IDs im Metadatenkatalog Geonetwork. Nur die Namen sind gleich. Deshalb muss die Operation zu Anfang wohl von dem Dateinamen abhängig sein. Ich möchte aber darauf eine ID-Spalte hinzufügen und die Zellen jeweils auf den Wert der ID vom Metadatenkatalog setzen, damit ich danach immer über IDs handeln kann.
Im Moment fällt mir als Anfänger da nur ein, mit einem dynamischen String zu arbeiten? Gibt es da schlauerer Methoden?

Ich habe die query nun auch mal als final deklariert, was jedoch nicht zur Beseitigung des Problems führte.

Hinsichtlich der Zeile, welche die Warnung unterdrücken soll: Sind da noch irgendwelche Anpassungen notwendig?
Derzeitige Meldungen: edu cannot be resolved to a type, the attribut value is undefined for the annotation type SupressWarning, the attribut justification is undefined for the annotation type SupressWarning

Nochmals besten Dank für jeden Tipp!
 

taro

Bekanntes Mitglied
zur Annotation zitiere ich mal die Dokumentation von findbugs
FindBugs supports several annotations to express the developer's intent so that FindBugs can issue warnings more appropriately. You need to use Java 5 to use annotations, and must place the annotations.jar and jsr305.jar files in the classpath while compiling your program.

Quelle: Chapter 10. Annotations


Ich würde das ganze gerne über eine ID machen, allerdings sind die IDs des Datensätze in der Datenbank abweichend von den IDs im Metadatenkatalog Geonetwork. Nur die Namen sind gleich. Deshalb muss die Operation zu Anfang wohl von dem Dateinamen abhängig sein. Ich möchte aber darauf eine ID-Spalte hinzufügen und die Zellen jeweils auf den Wert der ID vom Metadatenkatalog setzen, damit ich danach immer über IDs handeln kann.
Im Moment fällt mir als Anfänger da nur ein, mit einem dynamischen String zu arbeiten? Gibt es da schlauerer Methoden?

Ich kenne Geonetwork nicht, deswegen:

Zeige doch bitte einmal "anschaulich", was du vorliegen hast und was du erreichen willst.

So wie ich es lese, hast du mehrere Dateien mit Datensätzen, welche du 1 zu 1 in eine DB überführen möchtest. Dabei hast du für jede Datei eine eigene Tabelle - die Frage die sich mir hier stellt: Warum?
 

fnerz

Mitglied
zur Annotation zitiere ich mal die Dokumentation von findbugs





Ich kenne Geonetwork nicht, deswegen:

Zeige doch bitte einmal "anschaulich", was du vorliegen hast und was du erreichen willst.

So wie ich es lese, hast du mehrere Dateien mit Datensätzen, welche du 1 zu 1 in eine DB überführen möchtest. Dabei hast du für jede Datei eine eigene Tabelle - die Frage die sich mir hier stellt: Warum?

Hallo Taro!

Die Dateien sind bereits in die PostGIS Datenbank überführt worden. Dies hat ein Student zuvor gemacht. Hier ist aber bereits das genannte Problem, da der Student nicht diesselben IDs genutzt hat. Beispiel: ID der Datei1 im Geonetwork: 50, ID der Datei in der Datenbank: 2.
Mein Betreuer hat mir nun die Aufgabe zugeteilt, dass ich alle Tabellen mit einer weiteren ID-Spalte versehen soll, dessen Wert der ID im Geonetwork entspricht.

Zum groben Ablauf was erreicht werden soll:
-Ein User lädt eine eine Shapefile-Datei in Geonetwork hoch (Shapefile ist eine Datei, die Geometriedaten beinhaltet und weitere Informationen enthält, also X und Y Koordinaten, Höhe, Name des Ortes usw). Die Datei wird gleichzeitig in eine postGIS Datenbank als Tabelle hochgeladen.
- Die Tabelle kann direkt aus der postGIS Datenbank heraus in QuantumGIS (ein Geoinformationssystem zum Bearbeiten von räumlichen Daten) geladen und aktualisiert werden (Bsp: Einfügen von neuen Straßen als Liniendaten, Bäumen als Punktddaten etc.)
Die ganzen räumliche Tabellen werden somit immer aktuell geladen.
- Die aktuellen Tabelle der jeweiligen Datei soll im Geonetwork bei Interesse wieder runtergeladen werden können. Dazu wird die postGIS Tabelle wieder in eine Shapefile umgewandelt, sodass der Nutzer die Karte in einer der gängigen Geoinformationssystem-Softwareprodukte anschauen kann (nicht bearbeiten).
Hier tritt das Problem auf, da wie bereits erwähnt die IDs nicht übereinstimmen.
Im Geonetwork wird nach dem Klicken auf dem Download-Button gesagt: "Lade die postGIS-Tabelle mit der ID xx runter und wandle sie zuvor in eine ShapeFile um." Geonetwork geht dabei von der ID aus, unter dem die Datei damals nach dem Hochladen im Katalog gespeichert wurde. Das haut natürlich nicht korrekt hin, da die ID in der Datenbank nicht gefunden wird bzw. eine andere Tabelle angefragt wird, die garnicht interessiert.

Da ich die IDs in der Datenbank nicht manuell anpassen kann, möchte ich nun wie beschrieben die Tabellen vor dem Download editieren und mit einer weiteren ID Spalte ausstatten, welche den Wert besitzt, unter der die Datei im Geonetwork gespeichert ist.
Und diese in meinen Augen eigentlich einfache Aufgabe haut nicht hin, weil mir entweder findbugs einen Strich durch die Rechnung macht oder anderer Probleme auftreten.

Ich hoffe, dass es anschaulich genug war. :)

Viele Grüße
 
Zuletzt bearbeitet:

fnerz

Mitglied
Die Warnung solltest du mit folgender Zeile unterdrücken können:
Java:
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = {"SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE", "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" }, justification = "Irgend ein Grund")

Das hat nun hingehauen.
Es hatte nur noch gefehlt, die annotations.jar in den classpath hinzufügen. Besten Dank für die Zeile!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D SQL Server Android App: 'int java.lang.String.length()' on a null object reference Datenbankprogrammierung 15
T JPA: Nach String statt Primärschlüssel suchen Datenbankprogrammierung 9
M Oracle String aus Column splitten und x Rows daraus erstellen Datenbankprogrammierung 1
C String in Datenbank einfügen Datenbankprogrammierung 11
E Conversion failed when converting date and/or time from character string. Datenbankprogrammierung 3
D String übergeben Datenbankprogrammierung 7
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
M SQLite Suche nach String Datenbankprogrammierung 4
C Objekte aus DB in Strings umwandeln also von List<Objekt> in String Datenbankprogrammierung 6
A ByteArray zu String dann wieder zu ByteArray Datenbankprogrammierung 2
D HSQLDB SQL ORDER BY nur mit fixen String machbar? Datenbankprogrammierung 16
N String Array in While Schleife befüllen Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
R Zeichenkette in String zählen Datenbankprogrammierung 3
P GWT Applikation-The method forName(String) is undefined for the type Class Datenbankprogrammierung 10
B Mysql speichert keine 0 alls String Datenbankprogrammierung 11
B MySQL Datenbank Connection als String zurückgeben Datenbankprogrammierung 7
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
I DB-Zelleninhalt mit String vergleichen klappt nicht Datenbankprogrammierung 3
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
M SQL String Datenbankprogrammierung 2
G Sonderzeichen im String codieren Datenbankprogrammierung 4
K Date in SQL-String konvertieren Datenbankprogrammierung 3
B String aus txtDatei auslesen und in Datenbank schreiben. Datenbankprogrammierung 8
T Mittels SQL-String ein Berechnung vornehmen Datenbankprogrammierung 2
C SQL String zwei Tabellen vergleichen und gleiche Zeile löschen Datenbankprogrammierung 25
C Split String für SQl query Datenbankprogrammierung 10
J String[] in eine SQL-Anweisung implementieren Datenbankprogrammierung 13
F ResultSet to String[] Datenbankprogrammierung 3
S Connection String MS Access mit Systemdatenbank / Arbeitsgruppeninformationsdatei Datenbankprogrammierung 4
G Hilfe um String an Datenbank zu schicken Datenbankprogrammierung 3
M SELECT longtext -> als String behandeln Datenbankprogrammierung 6
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
padde479 Connection String Oracle Datenbankprogrammierung 5
T SQL Date String in java.util.Date umwandeln Datenbankprogrammierung 3
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
A JPA + @OneToMany + String ArrayList Datenbankprogrammierung 4
S Char to String aus DB Datenbankprogrammierung 2
Q string Vergleich Datenbankprogrammierung 2
M Konvertierung eines Ojects to String Datenbankprogrammierung 3
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
D INSERT String enthält ' wie kann man das Escapen? Datenbankprogrammierung 4
G MsSQL | Statement.execute(String s) Datenbankprogrammierung 3
G CLOB to String - Encoding Problem Datenbankprogrammierung 6
D String[][] Array in Access Datenbank speichern Datenbankprogrammierung 5
K Hibernate: Liste von String-Werten Datenbankprogrammierung 2
S String probleme Datenbankprogrammierung 3
R Nach String in MySQL datenbank suchen Datenbankprogrammierung 7
M Datum's String in MSSQL oder MySQL wie konvertieren ? Datenbankprogrammierung 3
T String in DB(Oracle) schreiben mit Leerzeichen Datenbankprogrammierung 4
K ResultSet: Erste Zeile ausgeben, Datensatz in String speiche Datenbankprogrammierung 13
E Fehler bei String-Insert in MySQL-DB Datenbankprogrammierung 8
L Datum (String) in MySQL-Tabelle (date) speichern Datenbankprogrammierung 4
C SQLException wenn String auf VARCHAR geschrieben wird Datenbankprogrammierung 10
T Methode getColumnIndex(String columnName) ? Datenbankprogrammierung 6
K string literal too long was tun ? Datenbankprogrammierung 9
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
Kotelettklopfer SQLite Verhindern von doppelter Statement Ausführung Datenbankprogrammierung 25
L SQL-Statement SQL Statement doppelte Einträge finden Datenbankprogrammierung 9
C MySQL SQL Statement wir nicht ausgeführt Datenbankprogrammierung 11
G Datenbank Statement Datenbankprogrammierung 22
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
B MySQL Umkreissuche - brauche Hilfe bei SQL Statement Datenbankprogrammierung 12
M CSV Import - Dynamisches SQL Statement Datenbankprogrammierung 15
D Wiederverwendung / Recycling / Queuing von Statement Objekten Datenbankprogrammierung 1
D SQL Statement gesucht... Datenbankprogrammierung 15
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
L SQL Statement mit Switch-Case funktioniert nicht Datenbankprogrammierung 6
U PostgreSQL SELECT Statement Datenbankprogrammierung 5
A Problem mit Create-Statement Datenbankprogrammierung 9
LadyMilka MySQL Syntaxfehler im Statement Datenbankprogrammierung 3
A JDBC Prepared Statement Autoincrement Datenbankprogrammierung 3
P SQL-Statement Bei meinem Statement ist ein Fehler? Datenbankprogrammierung 2
P sql statement alter table foreign key Datenbankprogrammierung 4
T sql Statement Datenbankprogrammierung 9
B JDBC MySQL Statement Datenbankprogrammierung 3
A Sql Statement - Alle Zahlen größer 9 Datenbankprogrammierung 3
F Sql Statement Datenbankprogrammierung 12
A SQL-Statement prüfen Datenbankprogrammierung 3
W Statement als Klassenvariable Datenbankprogrammierung 27
I Select-Statement optimieren Datenbankprogrammierung 14
D SQLite Statement nimmt keine Namen aus getter-Methoden Datenbankprogrammierung 11
alex_fairytail MySQL SQL Statement Delete zwischen Datum1 und Datum2 Datenbankprogrammierung 5
M Access Update Statement Fehler update -> unmöglich? Datenbankprogrammierung 3
R Derby/JavaDB LIKE Statement mit Wildcard Datenbankprogrammierung 20
N Update Prepared Statement Fehler bei Argumenten Datenbankprogrammierung 3
R Select Statement als temporärer Table Datenbankprogrammierung 7
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
R Derby/JavaDB Select TOP Statement geht nicht Datenbankprogrammierung 3
S Null Pointer exception statement Datenbankprogrammierung 8
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
K statement.execute liefert false Datenbankprogrammierung 6
C PostgreSQL Prepared Statement Datenbankprogrammierung 7
N Prepared Statement mit unbekannter Anzahl von Where-Clauses Datenbankprogrammierung 30
S SQL Statement: executeUpdate Datenbankprogrammierung 15
F wie funktioniert if Statement in SELECT? Datenbankprogrammierung 2
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
M MySQL größere von zwei Zahlen in Update Statement Datenbankprogrammierung 2
J [Hibernate] Select Statement Datenbankprogrammierung 4
S HSQLDB DELETE-Statement funktioniert nicht Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben