Frage

Ich bin mit C # und .NET 3.5. Ich brauche zu generieren und zu speichern, einige T-SQL-Insert-Anweisungen, die später auf einem Remote-Server ausgeführt werden.

Zum Beispiel, ich habe eine Reihe von Mitarbeitern:

new Employee[]
{
   new Employee { ID = 5, Name = "Frank Grimes" },
   new Employee { ID = 6, Name = "Tim O'Reilly" }
}

, und ich muss mit einer Reihe von Strings, um am Ende, wie folgt aus:

"INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
"INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"

Ich bin auf der Suche zu einem bestimmten Code, der die Insert-Anweisungen mit String.Format schafft, aber das fühlt sich nicht richtig. Ich hielt mit SqlCommand (in der Hoffnung zu tun so etwas wie diese ), aber es keine Möglichkeit bietet den Befehlstext mit Parametern zu kombinieren.

Ist es genug, nur einfache Anführungszeichen zu ersetzen und einen String bauen?

string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
    employee.ID,
    replaceQuotes(employee.Name)
    );

Was soll ich besorgt sein, wenn dies zu tun? Die Quelldaten ist ziemlich sicher, aber ich möchte nicht zu viele Annahmen machen.

EDIT: Ich will nur darauf hinweisen, dass in diesem Fall, ich habe keine SqlConnection oder irgendeine Art und Weise, um direkt mit SQL Server zu verbinden. Diese besondere App muss SQL-Anweisungen generieren und sie an anderer Stelle ausgeführt werden Schlange - sonst würde ich SqlCommand.Parameters.AddWithValue werden ()

War es hilfreich?

Lösung

Verwenden Sie parametrisierte Befehle. Übergeben Sie die Parameter zusammen mit Ihrem Remote-Server als auch, und erhält, dass in SQL Server zu nennen, noch die Unterscheidung zwischen dem SQL selbst zu erhalten und den Parameterwert.

Solange Sie nie behandeln Daten als Code mischen, sollten Sie in Ordnung sein.

Andere Tipps

Erstellen Sie Ihr SqlCommand Objekt in etwa so:

SqlCommand cmd = new SqlCommand(
        "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);

SqlParameter param  = new SqlParameter();
param.ParameterName = "@id";
param.Value         = employee.ID;

cmd.Parameters.Add(param);

param  = new SqlParameter();
param.ParameterName = "@name";
param.Value         = employee.Name;

cmd.Parameters.Add(param);

cmd.ExecuteNonQuery();

Fix Ihre ersetzen Zitate funktionieren so:

void string replaceQuotes(string value) {
     string tmp = value;
     tmp = tmp.Replace("'", "''");
     return tmp;
}

Cheers!

Hmm ich mit allen anderen stimmen zu, dass Sie parametrisierte Abfragen verwenden sollten und es dabei zu belassen. Aber wie wollen Sie diese SQL-Anweisungen zum Remote-Server übergeben? Haben Sie irgendeine Art von Service wie ein Web-Service haben, die beliebigen SQL-Befehle akzeptieren und ausführen oder Ihre Client-Anwendung geht die DB direkt schlagen?

Wenn Ihr durch eine Art Proxy geht dann egal, wie viel Sie Ihre Daten auf dem Client sanieren, könnte ein Hacker umgehen nur Ihre App und auf den Service. In diesem Fall tun, was Cade empfiehlt und die Daten als XML zum Beispiel passieren oder Format was auch immer Sie wählen (JSON, Binary etc ..) Dann Recht SQL bauen, bevor Sie tatsächlich den Befehl ausführen.

Injektion zu vermeiden, müssen Sie die Daten auf den Remote-Server versenden (möglicherweise in XML) und dann auf dem Remote-Server, sollte die Daten wieder auf dem geeigneten Datentypen und in parametrisierte Abfragen oder gespeicherte Prozeduren verwendet umgewandelt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top