用数据适配器以这种方式删除记录不好吗?

Is it bad to delete records in this fashion with data adapter?

我想知道这样做是否有任何后果。

            using (conn = new SqlConnection(cs))
        { 
        SqlCommand selectCommand = new SqlCommand("delete from Users where UserID = @id", conn);

        selectCommand.Parameters.AddWithValue("@id", id);

        ds = new DataSet();

        da.SelectCommand = selectCommand;

        da.Fill(ds);

        }

我看到大多数示例使用 sqlcommandbuilder 或 .delete() 或 .remove() 方法。如果我以这种方式进行所有 CRUD 操作,有什么区别?

结果是混乱,你在这里加倍混淆:

  • 删除记录的习惯方法是使用ExecuteNonQuery.
  • 存在删除行的方法,但您已将命令命名为 selectCommand。这混淆了方法的意图。你应该努力在你的代码中做到显而易见,而不是曲折。

遵循习俗。善待可能需要维护您的代码的开发人员。这包括你,如果你必须在你写完它几个月后打开它。如果是其他开发人员,他们会骂你是傻瓜,你将很难用这样的代码为自己辩护。

使用 ExecuteNonQuery 的一个附带好处是它将 return 删除的行数,因此它允许您在需要时验证删除:

 using (conn = new SqlConnection(cs)) { 
    SqlCommand deleteCommand = new SqlCommand("delete from Users where UserID = @id", conn);
    deleteCommand.Parameters.AddWithValue("@id", id);
    conn.Open();
    int rowsDeleted = deleteCommand.ExecuteNonQuery();
    if (rowsDeleted != 1) {
        // something unexpected happened
    }
}

我并不是说你应该为了习俗而遵循习俗。如果你有突破性的创新,一定要用它,但这不能算是创新。

正如温尼(在评论中)正确指出的那样,最好不要在不需要的地方使用 DataSet/DataAdapter 使事情复杂化。

您可以针对您的情况探索 ExecuteNonQuery

using (conn = new SqlConnection(cs))
{ 
    SqlCommand selectCommand = new SqlCommand("delete from Users where UserID = @id", conn);
    selectCommand.Parameters.AddWithValue("@id", id);

    selectCommand.Connection.Open();
    selectCommand.ExecuteNonQuery();          
}