2013-12-21 16 views
2

我一直试图在ASP.NET中以编程方式添加一列以修改SQL Server中的表。C#改变表格并以编程方式添加列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数据库的数组。出于某种原因,参数化的方法是行不通的,并显示以下错误:

Incorrect syntax near '@supplierlist'.

的基本思想是让用户从复选框选择供应商的名称,根据供应商的阵列的所选号码将为前者创建供应商名称。如果我们选择3个供应商,阵列将节省"Supplier1","Supplier2","Supplier3",然后SqlCommand应该改变表格并添加新列。

+2

你应该规范你的数据库。例如,您可以创建一个包含以下列的多对多表“AsocProductSupplier”:ProductID和SupplierID。 –

回答

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字符串与所需的分隔符AR ound输入字符串

​​
+0

我会建议在@ @ sup变量上使用T-SQL'QUOTENAME(..)'函数来[解决注入威胁](http://msdn.microsoft.com/zh-cn/magazine/ cc163523.aspx)。这是不能保证的(参数化的方式,它适用的地方),但它是第二好的,这是MS建议的这种情况。 – RBarryYoung

+0

@RBarryYoung感谢您的观察。我不知道这个解决方法。所以你建议:“ ”SET @sup = QUOTENAME('“ + suppliernotxt +“');“'或直接在ALTER TABLE语句? – Steve

+0

第一个,在'SET'语句中。 – RBarryYoung

相关问题