2016-05-05 3 views
1

Im Rahmen einer Internationalisierungsbemühung ist es erforderlich, die Verwendung von string.Format(...) für die Verwendung der Option string.Format(CultureInfo.InvariantCulture, ...) beim Formatieren von SQL-Abfragen zu refaktorieren. Dadurch soll sichergestellt werden, dass der Code weiterhin gültige SQL generiert, wenn er in einer Vielzahl von Sprachkulturumgebungen ausgeführt wird. In anderen Fällen, z. B. beim Formatieren von Zeichenfolgen für die Benutzeroberfläche, sollten die Verwendungen string.Format(...) unverändert bleiben.Erweitertes C# -Refactoring

Zum Beispiel würde der folgende Code müssen aktualisiert werden string.Format(CultureInfo.InvariantCulture, ...) verwenden:

string sql; 

if(somethign) 
{ 
    sql = string.Format("SELECT {0} FROM {1}", column, table); 
} 
else 
{ 
    sql = string.Format("SELECT {0} FROM {1}", column2, table2); 
} 

db.Query(sql); 

Leider ist dieses Muster der Zugriff auf die Datenbank verwendet wird mehrere tausend Mal in der Codebasis, und es gibt keine einfache Suchen und Befehl ersetzen Ich kann mir vorstellen, hier zu verwenden. Jeder Ansatz zum Suchen und Ersetzen muss so weit fortgeschritten sein, dass nur die Fälle isoliert werden, in denen der resultierende String als Parameter für db.Query() verwendet wird.

Einige Ideen, die ich in Betracht ziehe, schließen Resharper's Search mit Pattern ein (ich habe es nie benutzt), ein Roslyn-basiertes Tool geschrieben, um den Code intelligent zu refactorisieren (scheint zu kompliziert) oder eine Kombination von Unix-Kommandozeilen-Tools.

Ich bin auch offen für andere wichtigere Refactoring-Ansätze, sofern sie weitgehend automatisiert werden können.

Wie wird die Internationalisierung dieses Codes empfohlen?

+1

Roslyn wäre dafür perfekt geeignet und ehrlich gesagt gar nicht so schwer zu schreiben. Schauen Sie sich einen ['SyntaxRewriter'] (https://joshvarty.wordpress.com/2014/08/15/learn-roslyn-now-part-5-csharpsyntaxrewriter/) in Kombination mit einem [' MSBuildWorkspace'] (https://joshvarty.wordpress.com/2014/09/12/learn-roslyn-now-part-6-working-with-workspaces/), um Ihre Lösung zu laden und jeden darin enthaltenen Syntaxbaum neu zu schreiben. Für weitere Hintergrundinformationen zu Roslyn biete ich ein Papier an, das ich geschrieben habe: https://www.dropbox.com/s/rc9edahndlog0je/MainPaper.pdf?dl=0 –

+1

Das erinnert mich an [kleine Bobby Tische] (https://xkcd.com/327/). – Xiaoy312

+0

Wenn Sie dies umgestalten wollen, warum refaktorieren Sie es nicht in gespeicherte Prozeduren – drz

Antwort

-3

Sie können die String-Interpolation von C# verwenden. Also die Abfrage wird so aussehen:

Ich denke, der Standard der String-Interpolation ist aktuelle Kultur.

Auf der anderen Seite, empfehle ich immer noch nicht Ihre Abfrage in Ihrem Code zu konstruieren, da es anfällig für SQL-Injektion sein kann.

+0

keine sinnvolle Antwort? :( – alltej