2012-03-28 8 views
1

Mögliche Duplizieren:
how to add { in String Format c#Wie zu bewahren "{0}" nach zwei string.Format ruft

Wenn ich immer die gleiche Sache bin Umschreiben, bin ich früher schreibe das, was ich ein String-Muster davon nenne.

Sagen wir, ich möchte SQL-Injection tun ORM Funktionalität zu erweitern ...

protected static string FULLTEXTPATTERN = "EXISTS CONTAINSTABLE([{0}],*,'\"{1}\"') WHERE [key] = {0}.id; 

Und ich habe in der Regel den Namen der Tabelle und den Wert, den ich in einem string.format (FULLTEXTPATTERN kombinieren, ...) und alles ist gut.

Stellen Sie sich vor, ich muss das in zwei Zeit tun. Zuerst injiziere ich den Tabellennamen, dann den gesuchten Wert. Also möchte ich etwas schreiben wie:

protected static string FULLTEXTPATTERN = "EXISTS CONTAINSTABLE([{0}],*,'\"{{0}}/*Something that returns {0} after string.format*/\"') WHERE [key] = {0}.id; 
... 
var PartialPattern= string.fomat(FULLTEXTPATTERN, "TableX"); 
//PartialPattern = "EXISTS CONTAINSTABLE([TableX],*,'\"{0}\"') WHERE [key] = {0}.id" 
... 
//later in the code 
... 
var sqlStatement = string.format(PartialPattern,"Pitming"); 
//sqlStatement = "EXISTS CONTAINSTABLE([TableX],*,'\"Pitming\"') WHERE [key] = {0}.id" 

Gibt es eine Möglichkeit, es zu tun?

+0

Verwenden Platzhalter. Wenn Ihre Bibliothek sie nicht unterstützt, wechseln Sie. (Tabellennamen können nicht in Platzhaltern gebunden werden, sodass diese manuell eingefügt werden müssen.) Dieser eingebettete Nachfolger "{0}" sieht wie ein Albtraum aus. Betrachte: 'EXISTS CONTAINSTABLE ({Tabelle}, *, @ Wert) WHERE ...' –

+1

Verwandte Frage: [Wie füge ich {im String-Format C#] hinzu (http://stackoverflow.com/questions/9084309/how-to -add-in-string-format-c-sharp/9084352 # 9084352) –

+0

Fragen Sie nur, wie Sie die literale Zeichenfolge '{0}' umgehen können? Wenn ja, haben Sie es bereits beantwortet - Sie verdoppeln die Klammern "{{0}}". Kannst du deine Frage klarer stellen? –

Antwort

0

Ist es möglich, die Generierung von SQL auf den Punkt zu verzögern, an dem Sie alle erforderlichen Eingaben haben, so dass Sie einen Aufruf von String.Format() und mehrere Felder verwenden können?

Alternativ können Sie die Abfrage iterativ mit einem StringBuilder statt String.Format() erstellen.

1

Logik sagt, dass man einfach {{{0}}} im Format-String setzen würde es nach dem zweiten string.Format Aufruf {0} haben zu verringern nach unten, aber Sie können nicht - das ist ein FormatException wirft. Aber das ist, weil Sie noch eine { und } benötigen, sonst ist es wirklich nicht im richtigen Format :).

Was Sie tun können - stellen Sie Ihren vollen Format auf diese (beachten Sie die 4 { und } Zeichen am Ende):

"EXISTS CONTAINSTABLE([{0}],*,'\"{{0}}\"') WHERE [key] = {{{{0}}}}.id"; 

Dann Ihre endgültige Zeichenfolge enthält die {0} Sie erwarten.

Als Beweis - führen Sie diesen Test:

[TestMethod] 
    public void StringFormatTest() 
    { 
     string result = string.Format(string.Format(
      "{0} {{0}} {{{{0}}}}", "inner"), "middle"); 
     Assert.AreEqual("inner middle {0}", result); 
    }