2012-09-21 11 views
2

如何使用參數佔位符將列名稱值作爲SQL參數傳遞?如何使用佔位符作爲SQL參數傳遞列名值

的目標是有這個工作:

var sql = "SELECT * FROM Condos WHERE @0 LIKE @1"; 
var sqlData = db.Query(sql,choice,"%"+searchString+"%"); 

choice是將存儲column name

@0column name(我沒有成功,以它作爲參數傳遞)

變量

@1是一個​​(我沒有問題)

已經閱讀並嘗試了很多東西:

下面一個不拋出任何錯誤,但不會帶來任何數據

var sql = "SELECT * FROM Condos WHERE @0 LIKE @1"; 
var sqlData = db.Query(sql,choice,"%"+searchString+"%"); 

下面一個拋出Column name not valid = '@0'

var sql = "SELECT * FROM Condos WHERE [@0] LIKE @1" 
var sqlData = db.Query(sql,choice,"%"+searchString+"%"); 

下面一個投球Column name not valid = 'choice'

var sql "SELECT * FROM Condos WHERE choice LIKE @0"); 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

be低一個拋出Must declare scalar variable "@choice"

var sql "SELECT * FROM Condos WHERE @choice LIKE @0"); 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

下面一個不拋出任何錯誤,但不會帶來任何數據

var sql = "SELECT * FROM Condos WHERE '@choice' LIKE @0"; 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

下面一個不拋出任何錯誤,但不會帶來任何數據

var sql = "SELECT * FROM Condos WHERE '@choice' LIKE @0"; 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

下面一個不拋出任何錯誤,但不會帶來任何數據

var sql = "SELECT * FROM Condos WHERE '"+choice+"' LIKE @0"; 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

以下之一:BIG CRASH

var sql = "SELECT * FROM Condos WHERE '"[email protected]+"' LIKE @0"; 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

下面一個拋出Column name not valid = 'NameShort'

這恰恰是正確的列名

var sql = "SELECT * FROM Condos WHERE ['"+choice+"'] LIKE @0"; 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

以下之一:BIG CRASH

var sql = "SELECT * FROM Condos WHERE ['"[email protected]+"'] LIKE @0"; 
var sqlData = db.Query(sql,"%"+searchString+"%"); 

幫助!!!!!!!!!!!!!!

+1

你使用的是什麼rdbms? SQL服務器,MySQL,甲骨文? – Taryn

+0

SQL Server 2008 Express在WebMatrix – user1455103

回答

1

簡短的回答是,你不能;參數僅支持,而不支持列名稱

正如Richard所說的(無論是在代碼中還是通過使用SQL Server exec()函數)或者使用某種類型的庫(如LINQ),您必須回退直接插入文本可讓您動態構建查詢,然後將其轉換爲文本表示。

如果你走直接文本插入路線,要非常確定你不允許直接插入用戶輸入;自己做一些翻譯以避免SQL注入攻擊。

+0

謝謝。 「你自己做一些翻譯」是什麼意思? – user1455103

+0

我的意思是你需要做一些事情,比如檢查列名是否與一個有效的列名完全匹配,而不是僅僅做一個盲「where」+列+「='foo'」。一個switch語句,一個if塊,構造一個表達式,以確保該列是該表的有效列名,而不是潛在的危險值。 – technophile

+0

好的謝謝。理解......並完成! – user1455103

0

我看你已經嘗試過什麼,你剛剛離開了明顯的:

var sql = "SELECT * FROM Condos WHERE " + choice + " LIKE @1"; 
var sqlData = db.Query(sql,choice,"%"+searchString+"%"); 

你需要躲避列名的唯一原因是當它是一個保留字,如Order。在這種情況下,您將需要使用特定於數據庫的標識符轉義字符。

例如,MySQL的:

var sql = "SELECT * FROM Condos WHERE `" + choice + "` LIKE @1"; 
var sqlData = db.Query(sql,choice,"%"+searchString+"%"); 

SQL服務器

var sql = "SELECT * FROM Condos WHERE [" + choice + "] LIKE @1"; 
var sqlData = db.Query(sql,choice,"%"+searchString+"%"); 
+0

感謝理查德的意見,但它沒有解決!沒有錯誤,但沒有數據!我可以爲每個選擇創建一個不同的SQL語句(這就是我現在使用的),但我不覺得它是非常「優雅」的! – user1455103

+0

理查德。我不是個白癡,會要求你保持禮貌。我可能不是(但)像你一樣的專家,但作爲一名新手,我的表現相當不錯!我嘗試了你的建議,但沒有成功。我必須承認我在嘗試解決方案時犯了一個錯誤:我使用佔位符@ 0而不是@ 1。如果用戶沒有選擇任何東西,但它已經解決,還有一個額外的問題。那麼SQL注入呢? – user1455103

相關問題