ODBC 動態資料指標

動態資料指標很單純,顧名思義就是「動態」的指標。 這種指標可以偵測在開啟資料指標之後,對結果集成員資格、順序和值所做的任何變更。 例如,假設動態資料指標擷取兩個資料列,而其他應用程式接著更新其中一個資料列並刪除另一個資料列。 如果動態資料指標之後試圖擷取這些資料列,會找不到已刪除的資料列,但會顯示已更新資料列的新值。

動態資料指標會偵測其本身和其他人所做的所有更新、刪除和插入等操作。 (這受限於交易的隔離等級,如 SQL_ATTR_TXN_ISOLATION 連線屬性所設定)。SQL_ATTR_ROW_STATUS_PTR 陳述式屬性所指定的資料列狀態陣列,會反映這些變更,而且可以包含 SQL_ROW_SUCCESS、SQL_ROW_SUCCESS_WITH_INFO、SQL_ROW_ERROR、SQL_ROW_UPDATED 和 SQL_ROW_ADDED。 此資料列狀態無法傳回 SQL_ROW_DELETED,因為動態資料指標不會在資料列集外傳回已刪除的資料列,因此無法再辨識結果集中已刪除的資料列是否存在,或其資料列狀態陣列中的對應元素。 只有在呼叫 SQLSetPos 來更新資料列時,才會傳回 SQL_ROW_ADDED,而不是在另一個資料指標更新資料列時傳回。

在資料庫中實作動態資料指標的其中一種方式,是建立選擇性索引,用於定義結果集的成員資格和順序。 只要有其他人進行變更,索引也會隨之更新,因此根據這類索引的資料指標會區分所有變更。 此索引所定義之結果集中的其他選取範圍,可以藉由沿著索引處理來進行。

動態資料指標可以模擬,方法是要求結果集依唯一索引鍵排序。 有了這類限制,每次資料指標擷取資料列時,都會執行 SELECT 陳述式來擷取。 例如,假設結果集是由這個陳述式所定義:

SELECT * FROM Customers ORDER BY Name, CustID  

若要擷取此結果集中的下一個資料列集,則模擬資料指標會將下列 SELECT 陳述式中的參數,設定為目前資料列集最後一個資料列中的值,然後執行:

SELECT * FROM Customers WHERE (Name > ?) AND (CustID > ?)  
   ORDER BY Name, CustID  

此陳述式會建立第二個結果集,其中第一個資料列集是原始結果集中的下一個資料列集,在此案例中為 Customers 資料表中的資料列集。 資料指標會將這個資料列集傳回至應用程式。

請注意,以這種方式實作的動態資料指標,實際上會建立許多結果集,這可讓其偵測對原始結果集的變更。 應用程式永遠不會得知這些輔助結果集是否存在,看起來就只像是資料指標能偵測對原始結果集的變更。