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')"