Parametrisierte Abfragen (C#, Oracle): Wie, um mehr zu produzieren lesbare Darstellung?
Ich verwende parametrisierte Abfragen, in meinem C# - code für die Interaktion mit einer Oracle-Datenbank. Was kann ich tun, um log-Anweisungen in einer besser lesbaren Mode?
Angenommen ich habe eine parametrisierte Abfrage wie:
INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (:id, :name, :birthdate)
Idealerweise würde ich gerne sehen, der log-Eintrag mit allen Parametern ersetzt, so konnte ich kopieren und einfügen die Anweisung, für die spätere Verwendung:
INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (23, ‘Mike’, TO_DATE('2003/07/09', 'yyyy/mm/dd')
Mein Aktueller Ansatz ist, drucken Sie die Zeichenfolge des parametrisierten Abfrage und dann iterieren über alle Parameter und verwenden Sie ToString(). Das ist ein bisschen schwer zu Lesen, wenn es viele Parameter. Es ergäbe so etwas wie:
INSERT INTO PERSON (ID, NAME, BIRTHDATE) VALUES (:id, :name, :birthdate) [:id=23, :name=Mike, birthdate=2004/07/09 00:00:00]
Anderen Ansatz, den ich Plane, wäre die Verwendung der Zeichenfolge.Ersetzen() Funktion zum ersetzen der Platzhalter für parameter. Aber vielleicht gibt es einige besseren Weg, dies zu tun?
Vielen Dank im Voraus.
Edit 1:
Dachte ich, besser, einige code-Beispiel.
Ich verwende parametrisierte Abfragen, in dieser form (Hinweis: ich bin mit log4net):
using (OracleConnection connection = new OracleConnection(connectionString))
using (OracleCommand command = new OracleCommand(statement, connection))
{
command.Parameters.AddWithValue(":id", id);
command.Parameters.AddWithValue(":name", name);
command.Parameters.AddWithValue(":birthdate", birthdate);
command.Connection.Open();
log.DebugFormat("Executing statement: {0}.", command.CommandText);
//there I would add some more code to iterate over
//the parameters and print them out
command.ExecuteNonQuery();
command.Connection.Close();
}
Ich bin auf der Suche nach einem Weg, um sich der Erklärung, die der oracle-Befehl Objekt verwenden. Meine aktuelle Ansätze (siehe Frage) sind noch nicht sehr befriedigend, weil nicht sehr gut lesbar ist.
Ich gehofft, dass es wäre eine API (vielleicht sogar etwas in die OracleClient-namespace), die helfen würde, zu analysieren, die parametrisierte Abfrage für mich. Ich könnte noch einige weitere anspruchsvolle string-Ersetzung oder regex, aber ich sammeln wollten einige wissen. Habe ich bereits getan, einige reasearch, die auf es, aber nicht etwas gefunden.
InformationsquelleAutor Theo Lenndorff | 2009-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht ist es lohnt ein Blick auf die Art, wie Ihre getan in der NHibernate Quelle.
Finden Sie die Funktion "GetCommandLogString(IDbCommand-Befehl)" das könnte man fast copy/paste :p
InformationsquelleAutor Brendan Kowitz
Sich die Mühe mit dem Versuch, speichern Sie diese als ausführbare Anweisung für die spätere Nutzung ist, dass der parameter version läuft anders als die hart-codierten-string-version, da erstere nicht erforderlich ist, die Typisierung inline, z.B., die Sie nicht haben, um setzen Sie Anführungszeichen um den string-Parameter etc. Sie brauchen, um dies manuell tun, je nach dem Typ des jeweiligen Parameters.
Ich weiß nicht, was dein log-format ist, aber Sie könnten besser schreiben in die Protokolldatei der SQL ausführen, um eine parametized Abfrage statt; d.h., deklarieren Sie Variablen und Werte zuweisen, dann führen Sie die Abfrage aus. Es wird für weitere Zeilen (oder mehr Zeilen, wenn Sie vermeiden Sie, die Zeilenumbrüche), aber dann führen Sie einfach den code, und Sie müssen nicht sorgen zu machen über das ersetzen der Parameter selbst. Plus Ihre log-Einträge sind gegen SQL-injection 🙂
InformationsquelleAutor Geoff
Sowie die replace-Funktion verwenden. Warum nicht? Oder Sie können die Verwendung von string.format(). Oder reguläre Ausdrücke. Oder eine Kombination. Alles, was Sie wollen, ist string-manipulation.
InformationsquelleAutor tuinstoel
Können Sie auf diese Weise:
InformationsquelleAutor