2010-06-27 18 views
15

Ich würde gerne wissen, wie Sie den Tabellennamen und einen Tabellenfeldnamen über SqlCommand auf C# übergeben.Tabellenname und Tabellenfeld auf SqlParameter C#?

Versucht, es so zu machen, wie es gemacht wurde, indem man den SqlCommand mit dem @ -Symbol einstellt, aber nicht funktioniert. Irgendwelche Ideen??

Antwort

5

SqlCommand-Parameter können nur zum Übergeben von Daten verwendet werden. Sie können sie nicht zum Ändern der SQL-Anweisung verwenden (z. B. das Hinzufügen zusätzlicher Felder zu einer SELECT-Anweisung). Wenn Sie die SQL-Anweisung ändern müssen, würde ich vorschlagen, einen StringBuilder zu verwenden, um die TSQL-Anweisung zu erstellen.

Um weiter zu gehen, verkettet .Net die SQL nicht vor dem Senden an SqlServer (zumindest nicht in der direkten Art, die Sie erwarten könnten). Es ruft tatsächlich eine gespeicherte Prozedur auf und übergibt die Argumente separat. Dadurch kann Sql Server den Abfrageplan zwischenspeichern und die Leistung von Sie tsql optimieren.

Wenn Sie das SqlCommand schreiben würde ...

var cmd = new SqlCommand("SELECT * FROM MyTable WHERE MyID = @MyID", conn); 
cmd.Parameters.AddWithValue("@MyID", 1); 
cmd.ExecuteNonQuery(); 

Dies ist Tsql, die auf SQL Server ausgegeben wird ...

exec sp_executesql N'SELECT * FROM MyTable WHERE MyID = @MyID',N'@MyID int',@MyID=1 

Sie mehr über sp_executesql on MSDN lesen kann.

+0

Danke ... wie ich supported :) habe schon einen "Trick" mit einem String Builder gemacht, aber sorge mich um die SQL Injection –

+0

Du solltest trotzdem einen SqlCommand mit Parametern für die Werte verwenden. Wenn Sie Benutzern erlauben, die Felder einzugeben, dann stellen Sie sicher, dass die Feldnamen gültig sind (zumindest nur gültige Zeichen enthalten), bevor Sie sie zum SQL hinzufügen. – Brian

10

Ich glaube, Sie versuchen, eine SQL-Anweisung wie

select @field from @table 

auszuführen, aber das wird nicht funktionieren. Sql kann keine Parameter für Feldnamen oder Tabellennamen haben, nur für Werte.

Wenn meine Vermutung nicht richtig war, bitte erweitern Sie Ihre Frage.

+0

Danke ... wie ich gesagt habe :) habe schon einen "Trick" mit einem String Builder gemacht, macht mir aber die SQL Injection Sorgen –

20

Wenn Sie sich Sorgen über SQL-Injektion machen, haben die SqlCommandBuilder Klasse (und andere DB spezifische Versionen von DbCommandBuilder) eine Funktion namens QuoteIdentifier, die Ihren Tabellennamen ordnungsgemäß entkommt.

var builder = new SqlCommandBuilder(); 
string escTableName = builder.QuoteIdentifier(tableName); 

Jetzt können Sie das entwichene Wert verwendet, wenn Ihre Aussage zu bauen und nicht über Injektions- kümmern müssen aber immer noch für alle Werte mit Hilfe von Parametern werden sollte.