C# 更改表并以编程方式添加列 ASP.Net 和 SQL Server

标签 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 数据库中的列名。由于某种原因,参数化方法不起作用并显示以下错误:

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/

相关文章:

asp.net - 停止执行 ASP.NET 应用程序

javascript - 回发后未调用模态对话框的 onshow

ASP.NET MasterPage 回发无法从主页运行

sql-server - 在所有服务器上删除触发器

c# - 向 HtmlWeb 类添加函数

c# - 如何使用 C# 在 Selenium WebDriver 中按下 'Esc' 键

c# - 将空值传递给日期时间? parameter 获取用随机值填充的参数

c# - 我如何在 C# 函数中转换 C++ 函数

sql-server - 如何使用 SQL Server 将存储过程的结果存储在变量中

sql - 有没有一种方法可以将 float 转换为小数而不进行四舍五入并保持其精度?