C#Alter Table并以编程方式添加一列ASP.Net& SQL Server

时间:2013-12-21 13:20:54

标签: c# 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应该更改表并添加新列。

1 个答案:

答案 0 :(得分:8)

您不能使用参数来表示列的名称 参数只能用于表示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 function来获取Unicode带有输入字符串周围所需分隔符的字符串

string execSQL = "DECLARE @sup nvarchar(15); " + 
                 "SET @sup = QUOTENAME('" + suppliernotxt + "'); " +
                 "EXEC ('ALTER TABLE ProductNormalDB  ADD ' + @sup + ' nvarchar(20) NULL')"