我一直在尝试在 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'.
基本思想是让用户从供应商名称的复选框中选择,基于所选的供应商数量,数组将为 ex 创建供应商名称。如果我们选择了 3 个供应商,数组将保存 "Supplier1"
、"Supplier2"
、"Supplier3"
,然后是 SqlCommand
应该更改表并添加新列。
最佳答案
不能用参数来表示列名。
参数只能用于表达 WHERE 子句或 INSERT 或 UPDATE 语句的值。
您可以对查询文本使用字符串连接,将字符串值传递给存储过程或使用某种形式的动态 sql。
请谨慎使用这些方法,因为如果您不对传递给代码的值保持绝对控制,您将暴露于 Sql 注入(inject)。
作为动态 SQL 执行的示例添加,但仍然容易受到 SQL 注入(inject)攻击
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,也无法阻止通过 suppliernotxt
变量传递的 SQL 注入(inject)攻击
编辑 正如@RBarryYoung 在下面的评论中所解释的,对于这种动态 sql 情况,SQL 注入(inject)问题的一个很好的改进可能是使用 QUOTENAME function获取 Unicode 字符串,并在输入字符串周围使用所需的分隔符
string execSQL = "DECLARE @sup nvarchar(15); " +
"SET @sup = QUOTENAME('" + suppliernotxt + "'); " +
"EXEC ('ALTER TABLE ProductNormalDB ADD ' + @sup + ' nvarchar(20) NULL')"
关于C# 更改表并以编程方式添加列 ASP.Net 和 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20719449/