C#Alter Table并以编程方式添加一列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’附近的语法不正确。

基本思路是让用户从复选框中选择供应商的名称,根据所选的供应商数量,arrays将为ex创建供应商名称。 如果我们选择了3个供应商,arrays将保存"Supplier1""Supplier2""Supplier3" ,然后SqlCommand应该更改表并添加新列。

您不能使用参数来表示列的名称。
参数只能用于表示WHERE子句或INSERT或UPDATE语句的值。

您可以为查询文本使用字符串连接,将字符串值传递给存储过程或使用某种forms的动态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')"