對于表的定義如下:

在查詢數(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é)果