领悟旧事

Learned Helplessness
分类新闻>>技术文章>>
删除Access中重复的记录
来源:http://www.xx0594.com/
时间:2017-4-12
作者:  浏览人数:846
本文主要用到两项技术:
    1、删除重复纪录——在73000多条纪录里查找重复,我用3分钟完成了代码,电脑运行了近3个小时——这个结果我乍看让意外,细思却在情理之中。我完全不考虑效率,电脑运行的次数是73000的阶乘!这个数有多大——1X2X3X4X5X……X73000,不知道是多大了。
    2、重点是第二步,利用OleDbConnection来删除数据库里的纪录。这晨多说一下:
     (1)、用OleDbConnection conn = getConn()语句建立数据库连接;
     (2)实例化OleDbDataAdapter对象,用select语句取得要删除的记录。而不是使用delete语句;
     (3)建立一个DataSet对象,并把执行select语句得到的记录添加到其中;
      (4)、建立OleDbCommandBuilder对象,并与前面的OleDbDataAdapter对象关联,以监视RowUpdating事件的发生。在删除了指定的记录后,要通过执行OleDbDataAdapter对象的Update命令来更新数据库,语句: OleDbCommandBuilder mybuilder = new OleDbCommandBuilder(myDataAdapter);
      (5)、删除DataSet中包含表的特定记录
      (6)、执行OleDbDataAdapter对象的Update命令更新数据库:myDataAdapter.Update(ds,"表")
        (7)、关闭数据库连接。

    三、重点:具体代码如下:
        protected void Repeat_Btn_Click(object sender, EventArgs e)
        {
            OleDbConnection dbconn = XianShiWen.MyClass.getConn("GuShiWen.mdb"); //数据库连接
            OleDbDataAdapter da;
            ArrayList RepeatID = new ArrayList();//用来保存重复记录的ID。
            String delStr;
            dbconn.Open();//打开数据库。
            da = new OleDbDataAdapter("Select * from [Poems]", dbconn);//根据条件进行查询。
            DataSet ds = new DataSet(); //创建DataSet对象
            da.Fill(ds); //用OleDbDataAdapter对象da填充、更新刚创建的DataSet对象。
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)//在查询的条件结果中进行更新(修改)。
            {
                for(int j=i+1;j<ds.Tables[0].Rows.Count;j++)//开始比较
                {//当题目、作者、原文都相同时,我们认为是纪录重复了。
                    if(ds.Tables[0].Rows[i]["TiMu"].ToString() == ds.Tables[0].Rows[j]["TiMu"].ToString() &&
                       ds.Tables[0].Rows[i]["zuozhe"].ToString() == ds.Tables[0].Rows[j]["zuozhe"].ToString() &&
                       ds.Tables[0].Rows[i]["yuanwen"].ToString() == ds.Tables[0].Rows[j]["yuanwen"].ToString() )
                    {
                        RepeatID.Add(ds.Tables[0].Rows[j]["ID"].ToString());//记住重复记录的ID。
                    }
                }
            }
            for (int i = 0; i < RepeatID.Count; i++)//输出结果。
            {
                Response.Write(RepeatID[i]+" ");
                if (i % 10 == 0) Response.Write("<BR>");
            }
            //下面开始删除重复的记录。
            for (int i = 0; i < RepeatID.Count; i++)
            {
                delStr = "select * from [poems] where ( id=" + RepeatID[i]+" )";//已经保存的重复记录的ID。
                OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(delStr, dbconn);
                OleDbCommandBuilder mybuilder = new OleDbCommandBuilder(myDataAdapter); //建立OleDbCommandBuilder
                ds = new DataSet();//建立DataSet()实例
                myDataAdapter.Fill(ds, "poems");//poems是数据库里的表。
                foreach (DataRow dr in ds.Tables["poems"].Rows) //由于在开始选择了所有的记录,此处用集合方式
                {
                    if (dr["id"].ToString().Equals(RepeatID[i]))
                    {
                        dr.Delete();
                    }
                }
                myDataAdapter.Update(ds, "poems");//更新表。
            }
            dbconn.Close(); 
        }

关闭窗口
 访问量:507968
任何第三方若要引用、转摘本站信息,均需征得本站书面同意,否则视为侵权。本站信息为个人观点,若因引用本站信息而产生的任何情况,均与本站无关。Email:linmutou@163.com
闽ICP备14017840号-2