繁体   English   中英

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

[英]SQL Server : Update query not working in ASP.Net

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

我无法运行第二种方法。

这有效:

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

我不明白原因。

提前致谢。

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

WhereColumn + "=" + WhereValue,

代替

WhereColumn + "=@WhereValue"

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

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

确实,最好具有特定的功能来更新特定的表和值,并确保始终对这些参数进行参数设置以避免SQL注入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM