日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

DataTable 刪除重復(fù)行的問題

 woshishenxiande 2011-06-22
DataTable 刪除重復(fù)行的問題
2010-05-19 19:01

對于表的定義如下:



在查詢數(shù)據(jù)庫select語句:select * from teleOffice,之后返回一個DataTable Dt_Select。

代碼參考:

string connectionStr = @"Database=spatial;Server=127.0.0.1,7788;User ID=sa;Password=90900909;";//Integrated Security=true
            SqlConnection Conn = new SqlConnection(connectionStr);
            string SQL_SELECT = "select * from teleOffice";
            SqlDataAdapter ad = new SqlDataAdapter();
            SqlCommand myCmd = new SqlCommand(SQL_SELECT,Conn);
            ad.SelectCommand = myCmd;
           DataTable Dt_select = new DataTable();
            ad.Fill(Dt_select );

另外一個DataTable 是我從Excel讀出來的DataTable Dt_Excel。其中,滿足兩個表的結(jié)構(gòu)相同條件。

使用DataTable.Merge(DataTable):

Dt_Excel.Merge(Dt_select);

自然就出現(xiàn)了重復(fù)行的問題。怎么解決呢?

在網(wǎng)上搜索了比較常見的解決方法:

用DataView進(jìn)行轉(zhuǎn)換:

            DataView dv = Dt_Excel.DefaultView;
            DataTable dtDistinct = dv.ToTable(true,new string[] { "TeleOfficeId", "TeleOfficeName", "GPSX", "GPSY", "Province", "city" });

           dataGridView2.DataSource = Dt_Excel;//查看結(jié)果

我試了好幾次,通過DataGridView查看Dt_Excel之后,我失望了!完全沒有達(dá)到“歸并刪除”的效果:重復(fù)行沒有被刪除。這是怎么回事呢?

我又經(jīng)過了幾次下列的嘗試:

嘗試一: 只顯示teleOffice表的varchar()

 

            DataView dv = Dt_Excel.DefaultView;
            DataTable dtDistinct = dv.ToTable(true,new string[] { "TeleOfficeId", "TeleOfficeName" });

           dataGridView2.DataSource = Dt_Excel;//查看結(jié)果

刪除重復(fù)行,成功!

嘗試二:DataView dv = Dt_Excel.DefaultView;
            DataTable dtDistinct = dv.ToTable(true,new string[] { "Province", "city"});

想了一下原因:

因為定義的GPSX 和GPSY 是float類型的,而"Province", "city"兩個屬性雖是varchar類型的,但是數(shù)據(jù)表中,卻是空值。所以不能進(jìn)行“歸并刪除”!

怎么辦呢?

看來只能自己寫一個了!

其實也很簡單。

private DataTable deleteRow(DataTable Dt)
        {
            for (int i = 0; i < Dt.Rows.Count; i++ )
            {              
                for ( int j = Dt.Rows.Count -1; j >= i; j --)
                {
                    int k = 0;
                    for (; k < Dt.Columns.Count; k++ )
                    {
                        if (Dt.Rows[i][k].ToString() != Dt.Rows[j][k].ToString())
                        {
                            break;
                        }
                    }
                    if (k == Dt.Columns.Count)
                    {//the Rows[i] and Row[j] are the same
                        Dt.Rows.RemoveAt(j);                        
                        break;
                    }
                }
            }
            return Dt;
        }

這個函數(shù)返回的Dt即為所求!

在使用Dt.Rows.RemoveAt(j); 之前,也遇到了問題:

我使用的是:Dt.Rows[j].delete() 時候出現(xiàn)“不能通過已刪除的行訪問該行的信息”的錯誤。單步跟蹤Dt.Rows.Count,發(fā)現(xiàn)執(zhí)行Dt.Rows[j].delete() 之后Dt.Rows.Count沒有變化,強大的搜索呀!終于找到了!

解決辦法如下:(果然是前輩的親身體驗?。〗鉀Q了問題不說,還找到了病根,在此感謝?。。。?/span>

引用:

采用datatable.Rows[i].Delete()刪除行后再訪問該表時出現(xiàn)“”的錯誤。原因如下:

Delete()之后需要datatable.AccepteChanges()方法確認(rèn)完全刪除,因為Delete()只是將相應(yīng)列的狀態(tài)標(biāo)志為刪除,還可以通過datatable.RejectChanges()回滾,使該行取消刪除。

所以如果要徹底刪除datarow,需要Delete()和AccepteChanges()方 法同時使用,或者采用datatable.Rows.RemoveAt(i)方法直接刪除,其中i表示行索引,還有一個就是 datatable.Rows.Remove(DataRow dr)刪除指定行。

不過使用datatable.Rows.RemoveAt(i)要注意,如果連續(xù)使用 datatable.Rows.RemoveAt(0);datatable.Rows.RemoveAt(1);這時并不是刪除了原表中的0,1行,而 是刪除0行后,原來的1行就變成了0行,所以datatable.Rows.RemoveAt(1)實際刪除的是原表的2行。

所以還是要慎用datatable.Rows.RemoveAt(i),若要刪除多行,可以連續(xù)用Delete(),然后采用AccepteChanges()方法確認(rèn)刪除。

自此問題全都解決了!

日志記載一下!

方便下次使用!

 

           dataGridView2.DataSource = Dt_Excel;//查看結(jié)果

同樣失??!

嘗試三:DataView dv = Dt_Excel.DefaultView;
            DataTable dtDistinct = dv.ToTable(true,new string[] { "GPSX", "GPSY"});

           dataGridView2.DataSource = Dt_Excel;//查看結(jié)果

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多