SQL Server:更新查询在ASP.Net中不起作用

时间:2015-08-05 16:31:30

标签: sql asp.net sql-server database

我在更新查询时遇到问题。

我无法运行第二种方法。

这有效:

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 个答案:

答案 0 :(得分:2)

非工作方法中的问题是您没有参数化WhereValue

WhereColumn + "=" + WhereValue,

而不是

WhereColumn + "=@WhereValue"

因此,SQL将其转换为INT,然后无法将其正确地与a4行进行比较。

虽然更改第二种方法可以解决您的问题,但您的SQL中存在一些安全问题。如果有人向你传递了一个糟糕的表或列名,那么很可能会遭受SQL注入。至少,您应该检查以确保传递的值位于实际表和列名称的列表中 - 因此有人无法传递一个真正不应更新的表。想象一下,如果恶意用户为您的表名参数传递了此信息会发生什么:"TableName SET Column1 = 1; SELECT * FROM INFORMATION_SCHEMA.TABLES --"

实际上,最好有特定的函数来更新特定的表和值,并确保始终参数化值以避免SQL注入