我在更新查询时遇到问题。
我无法运行第二种方法。
这有效:
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)
);
我无法理解原因。
提前致谢。
答案 0 :(得分:2)
非工作方法中的问题是您没有参数化WhereValue
:
WhereColumn + "=" + WhereValue,
而不是
WhereColumn + "=@WhereValue"
因此,SQL将其转换为INT,然后无法将其正确地与a4
行进行比较。
虽然更改第二种方法可以解决您的问题,但您的SQL中存在一些安全问题。如果有人向你传递了一个糟糕的表或列名,那么很可能会遭受SQL注入。至少,您应该检查以确保传递的值位于实际表和列名称的列表中 - 因此有人无法传递一个真正不应更新的表。想象一下,如果恶意用户为您的表名参数传递了此信息会发生什么:"TableName SET Column1 = 1; SELECT * FROM INFORMATION_SCHEMA.TABLES --"
。
实际上,最好有特定的函数来更新特定的表和值,并确保始终参数化值以避免SQL注入