91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DataTabel中關于ImpotRow的一點嘗試

發布時間:2020-06-22 12:10:42 來源:網絡 閱讀:676 作者:270jia40 欄目:編程語言


最近的一個項目中,要求用一個視圖來表示數張表聯合查詢的結果,這個倒好做。但是在頁面顯示的時候,要求按一定順序來顯示,如果是每一行數據在一張表里的話,只需在視圖中添加一列當標識就可以,但是有幾行數據是在一張表里的,查詢出來后的順序不符合頁面顯示,雖然可以改變表的排序方式,但是感覺太麻煩,以后可能不好改,所以就用了一種笨方法,可能會對效率有影響,如果有更好的方法,大家一定要告訴我(⌒_⌒)。

 

我的方法就是將數據拿出來后,在業務邏輯層,用DataTable實例的Select()方法,查詢出指定的列,然后將其加入到一個空的,表架構相同的表中(Clone()方法),這是希望整行插入到表中的,如果一個單元格一個單元格的復制,那就太沒效率了(''),雖然我這個也沒什么效率啦……


然后在插入的時候遇到了問題

 DataTable dt = new DataTable();
 dt.Columns.Add("A");
 dt.Columns.Add("B");
 dt.Columns.Add("C");
DataRow dr = dt.NewRow();
 
//處理dr中的數據
 
dt.Rows.Add(dr);

這是標準寫法。

DataTable dt = new DataTable();
 dt.Columns.Add("A");
 dt.Columns.Add("B");
 dt.Columns.Add("C");
DataRow dr = dt.NewRow();
 
DataTable dt2 = dt.Clone();
 
//處理dr中的數據
 
dt2.Rows.Add(dr);

但是這樣寫就會報錯,“該行已經屬于另一個表。

這是因為drTable屬性是指向dt的。

但是現在查看dt.Row.Count時,發現是0,而不是1呢?

這涉及到一個DataRowState 的問題

DataRowState 有5種狀態

Detached該行已被創建,但不屬于任何 System.Data.DataRowCollectionSystem.Data.DataRow 在以下情況下立即處于此狀態:創建之后添加到集合中之前;或從集合中移除之后。
Unchanged該行自上次調用 System.Data.DataRow.AcceptChanges() 以來尚未更改。
Added

該行已添加到System.Data.DataRowCollection 中,System.Data.DataRow

.AcceptChanges()尚未調用。
Deleted該行已通過 System.Data.DataRow System.Data.DataRow.Delete() 方法被刪除。
Modified該行已通過 System.Data.DataRow System.Data.DataRow.Delete() 方法被刪除。


DataRow dr = dt.NewRow();
//創建dr后,dr的DataRowState為Detached
 
dt2.Rows.Add(dr);
// dr的DataRowState為Added

也就是狀態的更改。


  但是如果我們把dt2.Rows.Add(dr)換成dt2.Rows.ImportRow(dr)后,發現dt中仍然沒有dr,也就是dt.Row.Count0。這是因為ImportRow方法負責復制dr到dt中,包括DataRowState。但是復制的時候會改標dr的Table的指向,也就是指向當前調用ImportRow方法的DataTable。


例如:

DataTable dt,dt2;
DataRow dr;
 
dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
 
dr = dt.NewRow();
 
dt2 = dt.Clone();
 
if (dt2.Rows[0].Table == dt)
{
     Console.WriteLine("dt2=dt");
 }
 
 if (dt.Rows[0] == dr)
 {
     Console.WriteLine("dt=dr");
 }
 
 if (dt2.Rows[0] == dr)
 {
     Console.WriteLine("dt2=dr");
 }

輸出結果:

dt=dr


  但是我們的目標是將挑選出來的行,添加到相同結構的空表中,對于挑選的結果行,是能添加到空表中的,因為如果是從一個DataTable中取出DataRow,那么這個DataRow的DataRowState是Add,也就是使用ImportRow方法添加到空表后可以看到結果,如果是通過dt = new DataTable()創建的且未添加到DataTable的DataRow,使用ImportRow方法添加到空表后是看不到結果的。


DataTable dt,dt2;
DataRow dr,dr2;
 
dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
 
dr = dt.NewRow();
 
dr2 = dt.NewRow();
 
dt2 = dt.Clone();
 
dt.Rows.Add(dr);
 
dt2.ImportRow(dr2);
 
Console.WriteLine(dt2.Rows.Count.ToString());
 
dt2.ImportRow(dt.Rows[0]);
 
Console.WriteLine(dt2.Rows.Count.ToString());


 

結果:

0

1

 

注意:ImportRow方法是復制DataRow,也就是說會創建一個新的DataRow,而不是引用原來的DataRow。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杨浦区| 万年县| 永仁县| 兴化市| 平山县| 合肥市| 绵竹市| 铜陵市| 顺义区| 宁津县| 尤溪县| 杨浦区| 洞口县| 礼泉县| 黔西| 铅山县| 铜梁县| 外汇| 军事| 孟村| 当雄县| 洛隆县| 合阳县| 青川县| 新乡市| 淳安县| 榆树市| 潞城市| 昌平区| 宜丰县| 天镇县| 江津市| 西丰县| 绿春县| 南昌县| 龙泉市| 绥江县| 金山区| 屏山县| 宣城市| 广汉市|