1. 程式人生 > >IFeatureClass.Search 與IFeatureClass.Update的區別

IFeatureClass.Search 與IFeatureClass.Update的區別

(1)

IFeatureClass.Search方法

返回一個物件遊標,可用於獲取指定查詢選擇的要素物件。

搜尋將返回IFeatureCursor,其中包含滿足IQueryFilter引用指定的屬性和/或空間約束的所有功能。如果將null值傳遞給filter引數,則特徵游標將返回要素類中的所有要素。

回收引數控制行物件分配行為。回收遊標可在每次提取時為單個要素物件重新水化,並可用於優化只讀訪問,例如,在繪製時。在多個對遊標的NextFeature的呼叫上維護對回收遊標返回的要素物件的引用是非法的。不應修改回收游標返回的功能。非回收遊標在每次獲取時返回單獨的功能物件。可以修改非循環遊標返回的特徵並以多型行為儲存。

地理資料庫保證在編輯會話期間獲取的非回收功能物件上的“唯一例項語義”。換句話說,如果搜尋游標檢索到的特徵已經被例項化並且正在被呼叫應用程式引用,則返回對現有特徵物件的引用。

搜尋方法返回的非回收功能遊標*必須*在將遊標中的要素複製到另一個類的插入遊標時使用。這是因為回收游標重用相同的幾何圖形,並且在某些情況下插入到插入游標中的所有要素可能具有相同的幾何圖形。使用非循環遊標可確保每個幾何體都是唯一的。

IFeatureClass.Update方法

返回可用於更新指定查詢所選功能的遊標。

Update會根據filter引數指定的屬性和/或空間查詢指定的要素開啟更新游標。如果要更新特定查詢選擇的多個要素並將每個要素更新為單獨的值,則更新游標比為每個要素執行單個要素級別更新要快。更新是在當前的“游標位置”上執行的。

更新遊標可用於Feature子類的例項(例如網路功能),並具有保證的多型行為。更新遊標可以在編輯會話的內部或外部使用。如果在編輯會話中使用,則在儲存編輯會話之前,不會將更改提交到基表。網路要素類,拓撲要素類,參與複合關係的要素類或與訊息傳遞的其他關係只能在編輯會話中更新。如果您嘗試在編輯會話之外的其中一個類上使用更新遊標,則它將失敗。此外,編輯操作中必須對參與拓撲或幾何網路的功能進行編輯。

在編輯會話中使用遊標時,應始終將其範圍限定為編輯操作。換句話說,應該在編輯操作開始後建立遊標,並且一旦停止或中止編輯操作就不應該使用遊標。

(2)

可以使用搜索游標或更新游標編輯現有行。使用搜索游標時,  將呼叫

NextRow,返回對行的引用。編輯行,並  呼叫IRow.Store  。使用更新遊標時,將呼叫NextRow,編輯行,並  以行作為引數呼叫ICursor.UpdateRow。重要的是要記住,使用更新遊標時,也很重要,呼叫儲存方法。

以同樣的方式,可以使用搜索游標或更新游標刪除行,使用IRow.Delete而不是IRow.Store,而 使用ICursor.DeleteRow代替ICursor.UpdateRow。

建議的方法取決於是否在編輯會話中進行編輯,如果ArcMap或Engine應用程式正在使用游標,以及編輯的要素是簡單還是複雜。下表顯示了在不同情況下使用的方法:

 

ArcMap中

引擎 - 簡單

發動機 - 複雜

內部編輯會話

搜尋游標

搜尋游標

搜尋游標

外部編輯會話

搜尋游標

更新游標

搜尋游標

在ArcMap中始終建議使用搜索游標,因為地圖快取的內容可能會滿足查詢,從而無需進行DBMS查詢。

在Engine應用程式中使用簡單功能和編輯會話時,建議使用搜索游標來利用編輯操作中的批量更新。另一方面,對於複雜的功能,更新呼叫被功能的自定義行為覆蓋,這意味著即使使用更新遊標也將呼叫功能的儲存方法。

在編輯會話中使用遊標時,應始終將其範圍限定為編輯操作。換句話說,應該在編輯操作開始後建立遊標,並且一旦停止或中止編輯操作就不應該使用遊標。