2008-10-10 8 views
49

Ich habe ein Problem mit dem java.text.MessageFormat-Objekt.Java MessageFormat - Wie kann ich Werte zwischen einfachen Anführungszeichen einfügen?

Ich versuche SQL-Insert-Anweisungen zu erstellen. Das Problem ist, wenn ich so etwas tun:

MessageFormat messageFormat = "insert into {0} values ('{1}', '{2}', '{3}', {4})"; 
Object[] args = { str0, str1, str2, str3, str4 }; 
String result = messageFormat.format(args); 

ich dies von result für den Wert erhalten:

"insert into <str0> values ({1}, {2}, {3}, <str4>)" 

Wie Sie sehen können, ist das Problem, dass eine der Zielorte, die Eingeschlossene Anführungszeichen werden nicht durch Argumente ersetzt. Ich habe versucht, doppelte Anführungszeichen wie folgt zu verwenden: ''{1}'' und Escape-Zeichen wie folgt: \'{1}\' aber es gibt immer noch das gleiche Ergebnis.

edit: Ich habe vergessen zu erwähnen, dass ich auch versucht '''{1}'''. Das Ergebnis ist: "insert into <str0> values ('{1}', '{2}', '{3}', <str4>)". Es behält die ursprünglichen Anführungszeichen bei, fügt aber immer noch keine Werte ein.

Wie kann ich dieses Problem beheben? Für die Aufzeichnung verwende ich JDK 6u7.

+1

Stellt sich heraus, dass ''' {0} ''' schließlich funktioniert. Ich musste nur mein Build-Verzeichnis vollständig säubern, da mein Build-Prozess nicht korrekt aktualisiert wurde und ich es nicht bemerkt habe. Hoppla! –

+0

[Diese Antwort] (http://stackoverflow.com/questions/17569608/format-a-message-using-messageformat-format-in-java#17569639) erklärt den Grund, warum das zusätzliche Zitat benötigt wird. –

Antwort

91

ich doppelte Anführungszeichen nur ausprobiert und es funktionierte gut für mich:

MessageFormat messageFormat = new MessageFormat("insert into {0} values (''{1}'', ''{2}'', ''{3}'', {4})"); 
Object[] args = {"000", "111", "222","333","444","555"}; 
String result = messageFormat.format(args); 

Das Ergebnis ist:

insert into 000 values ('111', '222', '333', 444) 

Ist das, was Sie brauchen?

+1

Ich hatte das schon einmal versucht, aber es hat nicht funktioniert. Etwas war mit dem Bauprozess vermasselt ... nach einer vollständigen Reinigung -> Umbau, funktionierte diese Methode! *Stöhnen*. Vielen Dank! –

+0

Sie sind herzlich willkommen :) – serg

0

Das erste, was mir in den Sinn kam, war str1, str2, str3 zu ändern, um die einfachen Anführungszeichen um sie herum zu haben.

 
Object[] args = { str0, "'" + str1 + "'", "'" + str2 + "'", "'" + str3 + "'", str4 }; 

Entfernen Sie dann natürlich die einfachen Anführungszeichen aus Ihrer Abfragezeichenfolge.

+0

Danke. Dies ist meine aktuelle Problemumgehung, aber ich würde etwas schneller/sauberer bevorzugen. –

6

Innerhalb eines String kann ein Paar von einfachen Anführungszeichen jedes beliebiges Zeichen außer einfachen Anführungszeichen zu zitieren verwendet werden. Zum Beispiel repräsentiert die Musterzeichenfolge "'{0}'" die Zeichenfolge "{0}", keine FormatElement. Ein einzelnes Anführungszeichen selbst muss durch doppelte einfache Anführungszeichen '' in einem String dargestellt werden. Zum Beispiel Musterkette "'{''}'" wird als eine Folge von '{ (Beginn des Zitierens und einer linken geschweiften Klammer) interpretiert, '' (Apostroph) und }' (eine rechte geschweifte Klammer und Ende zitiert), nicht'{' und '}' (zitierte linke und rechte geschweifte Klammern): Darstellung der Zeichenfolge "{'}", nicht"{}".

Von: MessageFormat (Java Platform SE 8)

+0

Danke. Ich habe das schon in den Java-Dokumenten gelesen, aber ich war verwirrt (und konnte nicht bekommen, was ich von ihm wollte), obwohl es definitiv eine große Möglichkeit gibt, dass ich es falsch gemacht habe. Pflege um zu erarbeiten? –

+1

Ich denke, der wichtige Teil ist: "Ein einzelnes Anführungszeichen selbst muss durch doppelte ganze Anführungszeichen in einem String dargestellt werden" - der Rest erklärt nur, wie einfache Anführungszeichen und geschweifte Klammern in Kombination analysiert werden. Ganz ein Satz ... – wemu

2

Verwenden triple Apostrophe:

MessageFormat messageFormat = "insert into {0} values ('''{1}''', '''{2}''', '''{3}''', '''{4}''')"; 
+1

Dies führt nur dazu, "" in Werte einzufügen ('{1}', '{2}', '{3}', ) "'. Es hat jetzt die einfachen Anführungszeichen, aber die Argumentwerte werden immer noch nicht eingefügt. –

25

Es tut uns leid, wenn dies auf der Seite ist, aber es sieht so aus, als ob Sie versuchen, das PreparedStatement zu replizieren, das bereits in JDBC ist.

Wenn Sie versuchen, SQL zu erstellen, um gegen eine Datenbank zu laufen, dann schlage ich vor, dass Sie sich PreparedStatement ansehen, es tut bereits, was Sie versuchen (mit einer etwas anderen Syntax).

Tut mir leid, wenn das nicht das ist, was Sie tun, ich dachte nur, ich würde darauf hinweisen.

+0

Ich wusste auch nicht, danke! –

Verwandte Themen