我想建立一個查詢,其中的表名將是動態的,我會從另一個查詢中得到它。這兩個查詢在不同的數據上下文中。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();
我想建立一個查詢,其中的表名將是動態的,我會從另一個查詢中得到它。這兩個查詢在不同的數據上下文中。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();
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
}
此代碼不起作用!您無法將表名稱作爲參數傳遞。 –
要養活動態表名進入第二個查詢,您可以使用存儲過程,而不是LINQ。
當你有你的存儲過程,然後通過傳遞tablename
(結果從第一個查詢調用它
這是一個粗略的例子只是給你一個想法:
CREATE PROCEDURE InsertProc
@tablename varchar(100)
AS
begin
select * from @tablename
end
表名稱不能作爲參數提供的,所以你必須手動構造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作爲參數
你能否提供整個查詢?第二個在我的操作 – alxem
在你必須寫上自己的SQL語句的情況。但是你應該使用'SqlCommand'類和它的'Parameters'屬性來避免注入攻擊。 – Oliver
@Oliver我該怎麼做? – alxem
在第二個查詢中,你所做的是查詢一個字符串,而不是表本身。顯然,這不會產生你想要的結果。如果你編寫自己的sql語句,注意你不能在sql中參數化標識符,所以你將不得不在c#代碼中創建查詢文本(儘量減少sql注入的風險,因爲你不涉及用戶輸入),或者創建一個使用動態sql的存儲過程(在這裏你可以更好地防禦來自sql注入攻擊的自己)。 –