方法一
DataTable dt = silkPlanDataset.MT_PL_ZS_TASK_DEL.GetChanges(DataRowState.Deleted);
  if (dt != null)
  {
  //dt.RejectChanges();
  DateTime dtime1 = DateTime.Now;
  DataColumn[] keys = new DataColumn[1];
  keys[0] = dt.Columns["ZS_TASK_DEL_ID"];
  dt.PrimaryKey = keys; //指定主键
  tran = conn.BeginTransaction();
  sql = "delete from MT_PL_ZS_TASK_DEL where ZS_TASK_DEL_ID =:ZS_TASK_DEL_ID";
  command = db.GetSqlStringCommand(sql);
  db.AddInParameter(command, "ZS_TASK_DEL_ID", DbType.String, "ZS_TASK_DEL_ID", DataRowVersion.Current);
  DataSet ds = new DataSet();
  ds.Tables.Add(dt);
  db.UpdateDataSet(ds, "MT_PL_ZS_TASK_DEL", null, null, command, tran);
  tran.Commit();
  DateTime dtime2 = DateTime.Now;
  TimeSpan tp = dtime2 - dtime1;
}
方法二
DataTable dt = silkPlanDataset.MT_PL_ZS_TASK_DEL.GetChanges(DataRowState.Deleted);
  if (dt != null)
  {
  //dt.RejectChanges();
  DateTime dtime1 = DateTime.Now;
  DataColumn[] keys = new DataColumn[1];
  keys[0] = dt.Columns["ZS_TASK_DEL_ID"];
  dt.PrimaryKey = keys; //指定主键
  tran = conn.BeginTransaction();
  sql = "delete from MT_PL_ZS_TASK_DEL where rowid =(select rowid from MT_PL_ZS_TASK_DEL where ZS_TASK_DEL_ID = :ZS_TASK_DEL_ID)";
  command = db.GetSqlStringCommand(sql);
  db.AddInParameter(command, "ZS_TASK_DEL_ID", DbType.String, "ZS_TASK_DEL_ID", DataRowVersion.Current);
  DataSet ds = new DataSet();
  ds.Tables.Add(dt);
  db.UpdateDataSet(ds, "MT_PL_ZS_TASK_DEL", null, null, command, tran);
  tran.Commit();
  DateTime dtime2 = DateTime.Now;
  TimeSpan tp = dtime2 - dtime1;
}采用企业库删除的时候,一次删除200条记录,方法二效率更高,为什么?
方法二是先查找了rowid 然后再删除.

解决方案 »

  1.   

    原因很简单,
    第1种做法因为WHERE子句中存储参数:ZS_TASK_DEL_ID,对于表的每条记录进行判断时都要进行一次参数绑定。
    而第2种做法确只需要绑定一次。
      

  2.   

    觉得应该是MT_PL_ZS_TASK_DEL 有索引的原因。
      

  3.   

    方法2还可以优化...in 改为 exist
      

  4.   

    是根据主关键字删除的,所以直接用= 没有用in 或者exist2楼的回答没看明白,两个sql 都带了参数,不是都要判断吗
      

  5.   

    微软企业库的数据集更新真垃圾,还不如自己组织sql,执行效率高,用数据集删除
    方法1 200条记录 需要23秒
    方法2 200条记录 需要17秒
    方法3 自己组织删除语句,逐条删除,一次提交只要 0.5秒