2010-07-25 34 views
5

有沒有辦法如何做到這一點?這是行不通的:C#SqlCommand - 不能使用列名的參數,如何解決?

SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE [email protected]; "); 
prikaz.Parameters.AddWithValue("name", name); 
prikaz.Parameters.AddWithValue("slot", slot); 

我能想到的唯一的事情就是使用SP並聲明和設置列的變量。對我來說似乎有些尷尬。

+0

考慮到你的'Users'表規格化,因此解決您的問題需要將設計解決爲第五種正常形式。 – onedaywhen 2010-07-26 09:33:15

回答

4

你不能在普通的SQL中做到這一點 - 如果你必須有可配置的列名(或表名),你必須使用動態SQL - 沒有其他方法可以實現這一點。

string sqlCommandStatement = 
    string.Format("SELECT {0} FROM dbo.Users WHERE [email protected]", "slot"); 

,然後使用sp_executesql存儲過程在SQL Server來執行SQL命令(和根據需要指定其他參數)。

動態SQL有其優點和缺點 - 閱讀由SQL Server MVP Erland Sommarskog熟練編寫的最終文章The Curse and Blessings of Dynamic SQL

+1

上面給出的示例代碼沒有演示動態SQL,它只是顯示了string.Format函數的用法。正如所寫,它令人困惑。 – Yellowfog 2010-07-26 05:48:51

+0

@Yellowfog:現在把這個已被格式化的字符串用於調用「sp_executesql」,並且你有你的動態SQL ..... – 2010-07-26 05:59:51

+0

那麼,你有你的SQL,但它不是特別的'動態',是我的點。據我所知,它是指在事物的數據庫端構建的SQL,而不是Web服務器端。或者,我是否以這種方式接受這個詞是不尋常的? – Yellowfog 2010-07-26 08:43:22

7

如前所述,您無法對基本查詢進行參數化,因此您必須在運行時自行構建查詢。你應該白名單的這種輸入,以防止注入攻擊,但從根本:

// TODO: verify that "slot" is an approved/expected value 
SqlCommand command = new SqlCommand("SELECT [" + slot + 
      "] FROM Users WHERE [email protected]; ") 
prikaz.Parameters.AddWithValue("name", name); 

這樣@name仍然是參數化等

相關問題