2017-10-16 78 views
1

我想建立一個查詢,其中的表名將是動態的,我會從另一個查詢中得到它。這兩個查詢在不同的數據上下文中。C#查詢動態表名

CODE

var tablename = (from tab in db.Tabs 
       where tab.id == tabid 
       select tab.name).FirstOrDefault(); 

var pid = (from p in tablename 
      select p.id).FirstOrDefault(); 
+0

在你必須寫上自己的SQL語句的情況。但是你應該使用'SqlCommand'類和它的'Parameters'屬性來避免注入攻擊。 – Oliver

+0

@Oliver我該怎麼做? – alxem

+0

在第二個查詢中,你所做的是查詢一個字符串,而不是表本身。顯然,這不會產生你想要的結果。如果你編寫自己的sql語句,注意你不能在sql中參數化標識符,所以你將不得不在c#代碼中創建查詢文本(儘量減少sql注入的風險,因爲你不涉及用戶輸入),或者創建一個使用動態sql的存儲過程(在這裏你可以更好地防禦來自sql注入攻擊的自己)。 –

回答

0
using(SqlConnection sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    SqlCommand com = new SqlCommand(); 
    SqlDataReader sqlReader; 

    com.CommandText = "Select id from @tableName"; 
    com.CommandType = CommandType.Text; 
    com.Parameters.Add(new SqlParameter("@tableName", tableName); 

    com.Connection = sqlCon; 
    sqlCon.Open(); 
    sqlReader = com.ExecuteReader(); 

    var dt = new DataTable(); 
    dt.Load(sqlReader); //Query output is in dt now 
} 
+1

此代碼不起作用!您無法將表名稱作爲參數傳遞。 –

0

要養活動態表名進入第二個查詢,您可以使用存儲過程,而不是LINQ。

當你有你的存儲過程,然後通過傳遞tablename(結果從第一個查詢調用它

SP DOC:https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/create-a-stored-procedure

這是一個粗略的例子只是給你一個想法:

CREATE PROCEDURE InsertProc 
    @tablename varchar(100) 
    AS 
    begin 
    select * from @tablename 
end 
+0

我不想用SP做。有沒有可能用代碼做到這一點? – alxem

+0

uhm ..我不知道任何其他方式,對不起 – grepLines

+0

'context.Database.ExecuteSqlCommand(「select * from」+ tablename);' - 不要忘記SQL注入 – ASpirin

2

表名稱不能作爲參數提供的,所以你必須手動構造SQL字符串在任何一個功能或然後才能執行它的存儲過程。

create PROC read_from_dynamic_table(@TableName NVARCHAR(50)) 
AS 
BEGIN 
DECLARE @SQLSelectQuery NVARCHAR(MAX)='' 
SET @SQLSelectQuery = 'SELECT * FROM ' + @TableName 

    exec(@SQLSelectQuery) 
END 

然後你可以用表的名字叫PROC作爲參數

+0

你能否提供整個查詢?第二個在我的操作 – alxem