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

本文关键字:记录 删除 适配器 数据 方式 | 更新日期: 2023-09-27 17:53:23

我想知道这样做是否有什么后果。

            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的一个附带好处是,它将返回删除的行数,因此如果需要,它允许您验证删除:

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

我不是说你应该为了习惯而遵循习惯。如果你有一个突破性的创新,你可以利用它,但这并不是一个创新。

正如Winney正确指出的那样(在评论中),最好不要在不需要的地方使用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();          
}