繁体   English   中英

错误sqlcommand.ExecuteNonQuery()

[英]Error sqlcommand.ExecuteNonQuery()

我的sql server 2008数据库中有一个表

COMMENT(idcom,content,username);

该表有2条记录,其中username = lecturer

现在,我要删除所有具有用户名=讲师的评论:

首先,我在SQL Server中测试查询:

DELETE FROM COMMENT WHERE USERNAME='lecturer' ->正常:删除了2条记录。

然后我在我的C#代码中应用了该查询:

public bool delete(string userdeleted)
{
    string sql="DELETE FROM COMMENT WHERE USERNAME="+userdeleted; //userdeleted= lecturer
    try
     {
               SqlConnection sqlconnection = new SqlConnection();
                SqlCommand sqlcommand = new SqlCommand();
                sqlconnection.ConnectionString = connstring;
                sqlconnection.Open();
                sqlcommand.Connection = sqlconnection;
                sqlcommand.CommandType = CommandType.Text;
                sqlcommand.CommandText = sql;
                sqlcommand.ExecuteNonQuery();
                sqlconnection.Close();
                sqlcommand.Dispose();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
}

当我构建该代码时,程序会在catch语句内跳转并返回false ???。

尝试调试,它有一个错误: $exception:{"Invalid column name 'lecturer'."}sqlcommand.ExecuteNonQuery();

救命!!! 为什么代码不起作用,甚至在SQL SERVER中也能正常工作???

我怀疑userdeleted的价值只是lecturer而不是'lecturer' 因此,您的SQL语句为:

DELETE FROM COMMENT WHERE USERNAME=lecturer

那是眼前的问题-它正在寻找一个名为lecturer的专栏。 如果在SQL Server Studio中(或之前进行过测试的任何地方)使用该SQL,您将收到相同的错误。

但是,您不应该只添加引号-您应该使用参数化的SQL:

string sql="DELETE FROM COMMENT WHERE USERNAME=@username";
...

sqlcommand.Parameters.Add("@username", SqlDbType.NVarChar).Value = userdeleted;

参数化SQL在许多方面都很重要:

  • 它有助于防止SQL注入攻击
  • 它可以使SQL更加清晰(最终不会造成串联的麻烦,并且可以解决类似这样的引用问题)
  • 它避免了转换问题,尤其是对于日期/时间值

暂无
暂无

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

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