C# SQL Server中的更新查询不是';行不通

C# SQL Server中的更新查询不是';行不通,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我有一个更新数据库的类方法。。但它不起作用,我也找不出是怎么回事 try catch块中没有错误。。在数据库中,id的类型是int,分类的类型是nvarchar(50) 我还尝试将id从int转换为string,但不起作用,也没有错误 数据库列名和变量名相同。连接字符串保存在用于插入数据的web.config文件中 public string update(int id, string catagory) { //creating database connection

我有一个更新数据库的类方法。。但它不起作用,我也找不出是怎么回事

try catch
块中没有错误。。在数据库中,
id
的类型是
int
分类的类型是
nvarchar(50)

我还尝试将
id
int
转换为
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;
    }

问题:
数据在未来版本的SqlServer中可能是保留字

从MSDN:

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

解决方案:将保留字括在方括号内,作为
[数据]
试试这个:

string strCommand = "UPDATE [Data] SET catagory = '" + catagory + "' WHERE (id = " + id + ")";
建议1:不需要将整数参数括在单引号内

建议2:您的更新查询可能受到sqlinjection攻击。请使用参数化查询来避免这些攻击

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

完成代码:使用参数化查询

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

    }

问题:
数据在未来版本的SqlServer中可能是保留字

从MSDN:

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

解决方案:将保留字括在方括号内,作为
[数据]
试试这个:

string strCommand = "UPDATE [Data] SET catagory = '" + catagory + "' WHERE (id = " + id + ")";
建议1:不需要将整数参数括在单引号内

建议2:您的更新查询可能受到sqlinjection攻击。请使用参数化查询来避免这些攻击

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

完成代码:使用参数化查询

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

    }

如果
id
列是
int
,则不需要对其使用单引号。只需像
WHERE(id=“+id+”)
一样使用它。单引号用于字符列类型

但不要用这种方式 你应该经常使用。这种类型的字符串连接对攻击是开放的

另外,
数据
可能会出现在SQL Server的未来版本中。将来可能需要在方括号中使用它,如
[DATA]


顺便说一下,使用来处理您的
SqlConnection
SqlCommand

如果
id
列是
int
,则不需要对其使用单引号。只需像
WHERE(id=“+id+”)
一样使用它。单引号用于字符列类型

但不要用这种方式 你应该经常使用。这种类型的字符串连接对攻击是开放的

另外,
数据
可能会出现在SQL Server的未来版本中。将来可能需要在方括号中使用它,如
[DATA]


顺便说一下,使用来处理您的
SqlConnection
SqlCommand

始终使用参数化查询来进行反查询

  • 第一个参数指定SQL语句
  • 第二个参数是SqlConnection
  • 第三个参数是SqlTransaction。 这是一个
  • using语句
    自动处理并关闭
    sql连接
    sql命令

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

    始终使用参数化查询,以进行反查询

  • 第一个参数指定SQL语句
  • 第二个参数是SqlConnection
  • 第三个参数是SqlTransaction。 这是一个
  • using语句
    自动处理并关闭
    sql连接
    sql命令

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

    @Sudhakartilapudi
    DATA
    目前不是保留关键字。但它可能在未来发生。这并不是OP的代码不起作用的主要原因。@SonerGönül:是的,亲爱的,我刚刚找到了那个信息:)谢谢你的剩余部分。@SonerGönül我像你一样尝试过,但在刷新数据库后,它仍然没有改变。@Sudhakartilapudi你收到任何异常或错误消息吗?你确定你的连接字符串是正确的吗?请提供更多详细信息。@WahidMasud:那么,您是否使用
    状态
    尝试了我的最新代码?尝试使用altest代码,看看它返回的是成功还是失败消息?@sudhakardatilapudi
    DATA
    现在不是保留关键字。但它可能在未来发生。这并不是OP的代码不起作用的主要原因。@SonerGönül:是的,亲爱的,我刚刚找到了那个信息:)谢谢你的剩余部分。@SonerGönül我像你一样尝试过,但在刷新数据库后,它仍然没有改变。@Sudhakartilapudi你收到任何异常或错误消息吗?你确定你的连接字符串是正确的吗?请提供更多详细信息。@WahidMasud:那么,您是否使用
    状态
    尝试了我的最新代码?尝试使用altest代码,看看它返回的是成功消息还是失败消息?不要将字符串连接到SQL命令中,这会使您的代码容易受到SQL注入攻击,而且效率较低。改用参数化查询。另请参见,它是一个类别(而不是类别)。不要将字符串连接到SQL命令中,这会使您的代码容易受到SQL注入攻击,而且效率较低。改用参数化查询。另请参见,它是一个类别(而不是分类)