2009-07-29 79 views
1

我想爲一個查詢作爲命令參數提供的表名,就像這樣:如何在Npgsql中提供查詢的表名作爲命令參數?

public class Foo 
{ 
    private const String myTableName = "mytable"; 

    public void Bar() 
    { 
     NpgsqlCommand command = new NpgsqlCommand("SELECT * from :tableName", connection); 
     command.Parameters.Add(new NpgsqlParameter("tableName", DbType.String)); 
     command.Parameters[0].Value = myTableName; 
    } 
} 

這似乎導致此查詢:"SELECT * from E'mytable'"導致錯誤(介意單引號)。

我真的需要爲此做字符串連接嗎?它不會從安全角度看不要緊,因爲表的名稱不能被用戶,但字符串連接爲始終創建SQL查詢的改變讓我毛骨悚然......

感謝, 埃裏克

回答

3

表名不能作爲參數發送。表名在解析時被解析,因爲它們是計劃和類似事情所需要的。參數僅在執行器(或優化器,如果需要)時被替換。

所以是的,你將需要使用字符串替換它。這當然不是安全問題(甚至是成爲一個安全問題的風險),只要表名來自您班級的常量。

但是,如果你從用戶輸入構建表名,你需要非常小心。但通常情況下,如果您需要從用戶輸入中構建表名,那麼首先在數據庫中設計的東西設計得非常糟糕,應該加以解決(是的,當然也有例外)。

+0

表名總是常量。謝謝。 – EricSchaefer 2009-07-30 11:19:35

相關問題