乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

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

      對(duì)于表的定義如下:



      在查詢數(shù)據(jù)庫(kù)select語句:select * from teleOffice,之后返回一個(gè)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 );

      另外一個(gè)DataTable 是我從Excel讀出來的DataTable Dt_Excel。其中,滿足兩個(gè)表的結(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"});

      想了一下原因:

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

      怎么辦呢?

      看來只能自己寫一個(gè)了!

      其實(shí)也很簡(jiǎ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;
              }

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

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

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

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

      引用:

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

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

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

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

      所以還是要慎用datatable.Rows.RemoveAt(i),若要?jiǎng)h除多行,可以連續(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é)果

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多