【发布时间】:2015-08-05 16:31:29
【问题描述】:
我在更新查询时遇到问题。
我无法运行第二种方法。
这行得通:
if (Methods.Update("TABLE1",
"Name", TextBoxName.Text,
"Column1", "1"
) == 1)
这不起作用:
if (Methods.Update("TABLE1",
"Name", TextBoxName.Text,
"Surname", TextBoxSurname.Text,
"Column1", "2"
) == 1)
我收到此错误:
将 nvarchar 值“a4”转换为数据类型 int 时转换失败。
工作方式:
public static int Update(string Table1, string Column1, string Column1Value, string WhereColumn, string WhereValue)
{
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["connection"].ConnectionString);
SqlCommand command = new SqlCommand("UPDATE " + Table1 + " SET " + Column1 + "= @Column1Value " + " WHERE " + WhereColumn + "=@WhereValue", connection);
command.Parameters.AddWithValue("@Column1Value", Column1Value);
command.Parameters.AddWithValue("@WhereValue", WhereValue);
try
{
if ((connection.State == ConnectionState.Closed) || (connection.State == ConnectionState.Broken))
{
connection.Open();
}
int i = Convert.ToInt16(command.ExecuteNonQuery());
return i;
}
finally
{
connection.Close();
}
}
不工作方法:
public static int Update(string Table1, string Column1, string Column1Value, string Column2, string Column2Value, string WhereColumn, string WhereValue)
{
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["connection"].ConnectionString);
SqlCommand command = new SqlCommand("UPDATE " + Table1 + " SET " + Column1 + "= @Column1Value," + Column2 + " = @Column2Value WHERE " + WhereColumn + "=" + WhereValue, connection);
command.Parameters.AddWithValue("@Column1Value", Column1Value);
command.Parameters.AddWithValue("@Column2Value", Column2Value);
command.Parameters.AddWithValue("@WhereValue", WhereValue);
try
{
if ((connection.State == ConnectionState.Closed) || (connection.State == ConnectionState.Broken))
{
connection.Open();
}
int i = Convert.ToInt16(command.ExecuteNonQuery());
return i;
}
finally
{
connection.Close();
}
}
我的表格内容:
TABLE1
------------------------
Name Surname Column1
Name1 Surname1 NULL
Name2 Surname2 NULL
Name3 Surname3 a4
Name4 Surname4 NULL
Name5 Surname5 1
Name6 Surname6 2
Name7 Surname7 3
我的表结构:
CREATE TABLE [User1].[TABLE1]
(
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
[Surname] NVARCHAR (50) NOT NULL,
[Column1] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([ID] ASC)
);
我无法理解原因。
提前致谢。
【问题讨论】:
-
除了手头的问题,您应该阅读本文并开始定义参数的数据类型。 blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…
-
如果您不小心,这可能会让您对 SQL 注入敞开大门。这种特定用法并不是因为值是硬编码的,而是实际与数据库交互的方法无法确保使用代码不会滥用它。
-
不是通用更新方法的忠实拥护者。防止 sql 注入的挑战是一个真正的难题。为什么不为您的表创建 CRUD 过程。最初需要做更多的工作,但也开始了分离数据层和业务层的道路。
-
@David 实际上这个实现很容易受到 sql 注入的攻击。它接收字符串值,将其构建为 sql 命令并执行它。
-
@SeanLange:是的,我就是这么说的。实施是脆弱的。实现的这种特定用法并不是因为易受攻击的部分没有暴露给用户输入,而是核心实现是。如果始终小心使用,就不会有网络漏洞。但我强烈向 OP 建议他明确地确保安全性,而不是假设代码将始终被谨慎使用。
标签: sql asp.net sql-server database