小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

DataTable 刪除重復行的問題

 woshishenxiande 2011-06-22
DataTable 刪除重復行的問題
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。其中,滿足兩個表的結構相同條件。

使用DataTable.Merge(DataTable):

Dt_Excel.Merge(Dt_select);

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

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

用DataView進行轉換:

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

           dataGridView2.DataSource = Dt_Excel;//查看結果

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

我又經過了幾次下列的嘗試:

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

 

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

           dataGridView2.DataSource = Dt_Excel;//查看結果

刪除重復行,成功!

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

想了一下原因:

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

怎么辦呢?

看來只能自己寫一個了!

其實也很簡單。

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沒有變化,強大的搜索呀!終于找到了!

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

引用:

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

Delete()之后需要datatable.AccepteChanges()方法確認完全刪除,因為Delete()只是將相應列的狀態(tài)標志為刪除,還可以通過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()方法確認刪除。

自此問題全都解決了!

日志記載一下!

方便下次使用!

 

           dataGridView2.DataSource = Dt_Excel;//查看結果

同樣失?。?/span>

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

           dataGridView2.DataSource = Dt_Excel;//查看結果

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多