1

我的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'."}在 line sqlcommand.ExecuteNonQuery();

帮助!!!为什么即使在 SQL SERVER 中运行良好,代码也不起作用???

4

1 回答 1

9

我怀疑 的值userdeletedis justlecturer而不是'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 更清晰(你最终不会有大量的连接,并修复这样的引用问题)
  • 它避免了转换问题,尤其是对于日期/时间值
于 2013-11-08T17:40:16.550 回答