我一直在尝试在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
应该更改表并添加新列。
答案 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')"