[英]C# Alter Table and Add a column programmatically ASP.Net & SQL Server
我一直在嘗試在ASP.NET中以編程方式添加列來修改SQL Server中的表。
請參閱以下代碼:
string suppliernotxt = supplieridlist[1].ToString();
//SqlCommand cmd2 = new SqlCommand("ALTER TABLE [ProductNormalDB] ADD suppliernotxt nvarchar(20) NULL", con);
SqlCommand cmd2 = new SqlCommand("ALTER TABLE ProductNormalDB ADD @supplierlist nvarchar(20) NULL", con);
cmd2.Parameters.AddWithValue("@supplierlist", suppliernotxt);
//cmd2.Parameters.AddWithValue("@supplierlist", suppliernotxt.ToString());
//cmd2.Parameters["@supplierlist"].Value = supplieridlist[x];
cmd2.ExecuteNonQuery();
supplieridlist
是一個數組,它獲取要添加到SQL Server數據庫中的所有列名。 由於某種原因,參數化方法不起作用並顯示以下錯誤:
'@supplierlist'附近的語法不正確。
基本思路是讓用戶從復選框中選擇供應商的名稱,根據所選的供應商數量,陣列將為ex創建供應商名稱。 如果我們選擇了3個供應商,陣列將保存"Supplier1"
, "Supplier2"
, "Supplier3"
,然后SqlCommand
應該更改表並添加新列。
您不能使用參數來表示列的名稱。
參數只能用於表示WHERE子句或INSERT或UPDATE語句的值。
您可以對查詢文本使用字符串連接,將字符串值傳遞給存儲過程或使用某種形式的動態sql。
請謹慎使用這些方法,因為如果您不對傳遞給代碼的值保持絕對控制,那么您將接觸到Sql Injection。
添加作為動態SQL執行的示例,但仍然容易受到SQL注入攻擊
string suppliernotxt = supplieridlist[1].ToString();
string execSQL = "DECLARE @sup nvarchar(15); " +
"SET @sup = '" + suppliernotxt + "'; " +
"EXEC ('ALTER TABLE ProductNormalDB ADD ' + @sup + ' nvarchar(20) NULL')"
SqlCommand cmd2 = new SqlCommand(execSQL, con);
cmd2.ExecuteNonQuery();
正如您所看到的,即使使用動態SQL,也沒有任何東西阻止SQL注入攻擊通過suppliernotxt
變量傳遞
編輯正如下面@RBarryYoung的評論中所解釋的,對於這種動態sql情況,SQL注入問題的一個很好的改進可能是使用QUOTENAME函數來獲取帶有輸入字符串周圍所需分隔符的Unicode字符串
string execSQL = "DECLARE @sup nvarchar(15); " +
"SET @sup = QUOTENAME('" + suppliernotxt + "'); " +
"EXEC ('ALTER TABLE ProductNormalDB ADD ' + @sup + ' nvarchar(20) NULL')"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.