簡體   English   中英

C#Alter Table並以編程方式添加一列ASP.Net和SQL Server

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM