SQL Server中的更新查询无效

时间:2014-02-23 17:46:04

标签: c# asp.net sql-server

我有一个用于更新数据库的类方法..但它不起作用,我找不到有什么问题..

try catch块中没有错误.. id的数据库类型为intcatagory的类型为nvarchar(50)

我也尝试将idint转换为string但不起作用且没有错误..

数据库列名和变量名相同。连接字符串保存在web.config文件中,该文件用于插入数据。

public string update(int id, string catagory)
{
        //creating database connection
        SqlConnection objConnection = new SqlConnection(strConnection);
        objConnection.Open();
        string error = "";

        try
        {
            //firing command
            string strCommand = "UPDATE Data SET catagory = '" + catagory + "' WHERE (id = '" + id + "')";
            SqlCommand objCommand = new SqlCommand(strCommand, objConnection);
            objCommand.ExecuteNonQuery();
        }
        catch(System.Data.SqlClient.SqlException ex)
        {
            error = ex.ToString();
        }

        //closing database connection
        objConnection.Close();

        return error;
    }

3 个答案:

答案 0 :(得分:3)

如果id列为int,则无需使用单引号。只需像WHERE (id = " + id + ")一样使用它。单引号用于字符列类型。

但不要这样使用

您应始终使用 parameterized queries 。这种字符串连接对 SQL Injection 攻击开放。

string strCommand = "UPDATE Data SET catagory = @catagory WHERE id = @id";
SqlCommand objCommand = new SqlCommand(strCommand, objConnection);
objCommand.Parameters.AddWithValue("@catagory", catagory);
objCommand.Parameters.AddWithValue("@id", id);
objCommand.ExecuteNonQuery();

在SQL Server的未来版本中,DATA也可能是 reserved keyword 。您可能需要在将来的方括号中使用它,例如[DATA]

请使用using statement来处理您的SqlConnectionSqlCommand

答案 1 :(得分:1)

问题: DATA可能是未来版本的SqlServer中的保留字。

来自MSDN:

  

可以在SQL Server的未来版本中将数据保留为新数据   功能已实现。

解决方案:将保留字括在方括号中[data] 试试这个:

string strCommand = "UPDATE [Data] SET catagory = '" + catagory + "' WHERE (id = " + id + ")";

建议1:您不需要将整数参数括在单引号中。

建议2:您的更新查询对sqlinjection攻击开放,请使用参数化查询来避免它们。

建议3:您可以使用return方法的ExecuteNonQuery()值来识别UPDATE命令的状态。

使用Parameterised Queries

完成代码
    try
    {
        //firing command

        string strCommand = "UPDATE [Data] SET catagory = @catagory WHERE (id =@id)";
        SqlCommand objCommand = new SqlCommand(strCommand, objConnection);
        objCommand.Parameters.AddWithValue("@catagory",catagory);
        objCommand.Parameters.AddWithValue("@id",id);
        int status;
        status = objCommand.ExecuteNonQuery();
        if(status>0)
           MessageBox.Show("Data Updated Successfully!");
        else
           MessageBox.Show("Update Failed!");

    }

答案 2 :(得分:0)

始终使用参数化查询,用于反injection

  1. 第一个参数指定SQL语句。
  2. 第二个参数是SqlConnection。
  3. 第三个参数是SqlTransaction。 这是一个reference
  4. using statement会自动处理并关闭您的sql connectionsql command

         public string update(int id, string catagory)
                {
                        //creating database connection
                       using( SqlConnection objConnection = new SqlConnection(strConnection))
                {
                        objConnection.Open();
                        string error = "";
    
                        try
                        {
                            string strCommand = "UPDATE Data SET catagory = @catagory WHERE id = @id ";
                            using( SqlCommand objCommand = new SqlCommand(strCommand, objConnection))
                           {
                            objCommand.Parameters.AddWithValue("@catagory",catagory);
                            objCommand.Parameters.AddWithValue("@id",id);
                            objCommand.ExecuteNonQuery();
                           }
                        }
                        catch(System.Data.SqlClient.SqlException ex)
                        {
                            error = ex.ToString();
                        }
    
                        return error;
    
                    }
                }
    
相关问题