不工作在 ASP.Net 中的 SQL Server︰ 更新查询

发布时间: 2017/3/26 3:12:28
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正在使用更新查询的问题。

第二种方法不能跑

此作品︰

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)
);

我不能理解的原因。

在此先感谢。

解决方法 1:

中非工作方法的问题是你不参数化 WhereValue :

WhereColumn + "=" + WhereValue,

而不是

WhereColumn + "=@WhereValue"

所以 SQL 是它强制转换为 INT,然后又不适当的反应比较它 a4 行。

虽然更改第二个方法将解决您的问题,你在您的 SQL 在这里有一些安全问题。 它将很有可能遭受 SQL 注入像这样,如果有人通过你坏的表或列名称。 至少,你应该检查以确保正在传递的值列表中存在的实际的表和列的名称-所以人不能通过你真的不应该更新的表。 想象会发生什么如果恶意用户通过这你表名称参数为︰ "TableName SET Column1 = 1; SELECT * FROM INFORMATION_SCHEMA.TABLES --"

真的,它可能会最好有特定的功能,用于更新特定表和值,并确保你总是要参数化的值,以避免 SQL 注入

官方微信
官方QQ群
31647020