瞭解資料指標類型
關聯式資料庫中的作業是在完整的資料列集上作用的。由 SELECT 陳述式所傳回的資料列集包括所有滿足陳述式 WHERE 子句之條件的資料列。由陳述式傳回的完整資料列集稱為結果集。應用程式不一定能夠以一個單位有效地運用整個結果集。這些應用程式需要一個機制,一次運用一個資料列或小型資料列區塊。資料指標就是一種結果集的擴充,提供此種機制。
資料指標擴充結果集藉由下列方式處理:
允許定位於結果集的特定資料列。
從結果集的目前位置,擷取一個資料列或資料列區塊。
支援結果集目前位置上資料列的資料修改。
支援以不同可見性層級來檢視其他使用者對結果集所呈現的資料庫資料所做的變更。
注意
如需 SQL Server 資料指標類型的完整描述,請參閱《SQL Server 線上叢書》中的<資料指標類型 (Database Engine)>主題。
JDBC 規格支援順向資料指標與可捲動的資料指標,這些資料指標可區分或無法區分其他工作所做的變更,而且可以是唯讀的或可更新的。這個功能是由 Microsoft SQL Server 2005 JDBC Driver SQLServerResultSet 類別所提供。
JDBC 驅動程式支援下列資料指標類型:
結果集 (資料指標) 類型 | SQL Server 資料指標類型 | 特性 | 選取 方法 | 回應 緩衝 | 描述 |
---|---|---|---|---|---|
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) |
N/A |
順向、唯讀 |
直接 |
完整 |
應用程式必須單一 (順向) 通過結果集。這是預設的行為,而且與 TYPE_SS_DIRECT_FORWARD_ONLY 資料指標的行為相同。驅動程式會在陳述式執行時間,將完整的結果集從伺服器讀入記憶體中。 |
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) |
N/A |
順向、唯讀 |
直接 |
適應性 |
應用程式必須單一 (順向) 通過結果集。它與 TYPE_SS_DIRECT_FORWARD_ONLY 資料指標的行為相同。驅動程式會因為應用程式的要求而從伺服器讀取資料集,因此會將nd thus minimizes the 用戶端的記憶體使用量降到最低。 |
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) |
向前快轉 |
順向、唯讀 |
資料指標 |
完整或適應性 |
應用程式必須使用伺服器資料指標單一 (順向) 通過結果集。它與 TYPE_SS_SERVER_CURSOR_FORWARD_ONLY 資料指標的行為相同。 |
TYPE_FORWARD_ONLY (CONCUR_UPDATABLE) |
動態 (順向) |
順向、可更新的 |
直接或資料指標 |
完整或適應性 |
應用程式必須單一 (順向) 通過結果集以更新一或多個資料列。 根據預設,當應用程式呼叫 SQLServerResultSet 物件的 setFetchSize 方法時,提取大小是固定的。 若要取得此案例的適應性緩衝,應用程式必須提供 String 值 "adaptive" 來呼叫 SQLServerStatement 物件的 setResponseBuffering 方法。 |
TYPE_SCROLL_INSENSITIVE |
靜態 |
可捲動、不可更新 |
直接或資料指標 |
完整或適應性 |
應用程式需要資料庫快照集。 |
TYPE_SCROLL_SENSITIVE |
索引鍵集 |
可捲動而且可更新。資料列更新可以看到,而且刪除會顯示為遺失資料。從結果集內部插入可以看到,但是從資料集外部插入則看不到。 |
直接或資料指標 |
完整或適應性 |
應用程式必須僅針對現有的資料列查看變更的資料。 |
TYPE_SS_DIRECT_FORWARD_ONLY |
N/A |
順向、唯讀 |
直接或資料指標 |
完整或適應性 |
整數值 = 2003。提供完整緩衝的唯讀用戶端資料指標。系統不會建立任何伺服器資料指標。 |
TYPE_SS_SERVER_CURSOR_FORWARD_ONLY |
向前快轉 |
順向 |
直接或資料指標 |
完整或適應性 |
整數值 = 2004。快速、可存取所有資料。 |
TYPE_SS_SCROLL_STATIC |
靜態 |
系統不會反映其他使用者的更新 |
直接或資料指標 |
完整或適應性 |
整數值 = 1004。應用程式需要資料庫快照集。這是 SQL Server 專用的 JDBC TYPE_SCROLL_INSENSITIVE 同義字。 |
TYPE_SS_SCROLL_KEYSET |
索引鍵集 |
系統會反映其他使用者的更新;資料列成員資格是固定的 |
直接或資料指標 |
完整或適應性 |
整數值 = 1005。應用程式必須僅針對現有的資料列查看變更的資料。這是 SQL Server 專用的 JDBC TYPE_SCROLL_SENSITIVE 同義字。 |
TYPE_SS_SCROLL_DYNAMIC |
動態 |
可捲動而且可更新。資料列更新可以看到,而且刪除在目前的提取緩衝區中,會顯示為暫時遺失的資料。從結果集內部以及從結果集外部插入都可以看到。 |
直接或資料指標 |
完整或適應性 |
整數值 = 1006。應用程式必須針對現有的資料列查看變更的資料,並查看在資料指標存留時間期間插入以及刪除的資料列。 |
資料指標定位
TYPE_FORWARD_ONLY、TYPE_SS_DIRECT_FORWARD_ONLY 和 TYPE_SS_SERVER_CURSOR_FORWARD_ONLY 資料指標僅支援 next 定位方法。
TYPE_SS_SCROLL_DYNAMIC 資料指標不支援 absolute 和 getRow 方法。結合動態資料指標之 first 和 relative 方法的呼叫近似 absolute 方法。
只有 TYPE_FORWARD_ONLY、TYPE_SS_DIRECT_FORWARD_ONLY、TYPE_SS_SERVER_CURSOR_FORWARD_ONLY、TYPE_SS_SCROLL_KEYSET 和 TYPE_SS_SCROLL_STATIC 資料指標支援 getRow 方法。具有全部順向資料指標類型的 getRow 方法會傳回目前透過資料指標讀取的資料列數目。
注意
當應用程式進行不支援的資料指標定位呼叫時,或進行不支援的 getRow 方法呼叫時,會擲回一個例外狀況訊息:「不支援使用此資料指標類型來執行要求的作業」。
只有 TYPE_SS_SCROLL_KEYSET 和相等的 TYPE_SCROLL_SENSITIVE 資料指標會公開已刪除的資料列。如果資料指標定位在已刪除的資料列上,則無法使用資料行值,而且 rowDeleted 方法會傳回 "true"。get<Type> 方法的呼叫會擲回一個例外狀況訊息:「無法從已刪除的資料列取得值」。無法更新已刪除的資料列。如果您嘗試在刪除的資料列上呼叫 update<Type> 方法,會擲回一個例外狀況訊息:「無法更新已刪除的資料列」。TYPE_SS_SCROLL_DYNAMIC 資料指標在移出目前的提取緩衝區之前的行為都相同。
向前資料指標和動態資料指標會以類似的方式公開已刪除的資料列,但是只有在資料指標仍可在提取緩衝區中存取時才是如此。若是向前資料指標,這是十分簡單的。若是動態資料指標,當提取大小大於 1 時,則比較複雜。應用程式可以在提取緩衝區定義的視窗內前後移動資料指標,但是在遺失已更新的原始提取緩衝區時,已刪除的資料列將會消失。如果應用程式不想使用動態資料指標查看暫時刪除的資料列,則應使用 Fetch Relative (0)。
如果 TYPE_SS_SCROLL_KEYSET 或 TYPE_SCROLL_SENSITIVE 資料指標資料列的索引鍵值隨著資料指標一起更新,不管更新的資料列是否符合資料指標的選取條件,資料列都會保留在結果集的原始位置中。如果資料列是在資料指標外部更新,已刪除的資料列將會出現在資料列的原始位置,但是只有在具有新索引鍵值的另一個資料列在已經刪除後出現在資料指標時,資料列才會出現在資料指標中。
若是動態資料指標,更新的資料列將保留在提取緩衝區中的位置中,直到遺失提取緩衝區所定義的視窗為止。更新的資料列後來可能會重複出現在資料集中的不同位置,也可能完全消失。必須防止在結果集中產生暫時不一致的應用程式應該使用的提取大小為 1 (預設 CONCUR_SS_SCROLL_LOCKS 並行有 8 個資料列,而其他並行有 128 個資料列)。
資料指標轉換
SQL Server 有時候可以選擇實作要求之外的資料指標類型,也就是所謂的隱含性資料指標轉換 (或資料指標轉化)。如需有關隱含性資料指標轉換的詳細資訊,請參閱《SQL Server 線上叢書》中的<使用隱含性資料指標轉換>主題。
如果有 SQL Server 2000,當您透過 ResultSet.TYPE_SCROLL_SENSITIVE 和 ResultSet.CONCUR_UPDATABLE 結果集更新資料時,會擲回例外狀況訊息:「資料指標為 READ ONLY」。這個例外狀況的發生是因為 SQL Server 2000 已經針對該結果集完成隱含資料指標轉換,而且沒有傳回已經要求之可更新的資料指標。
若要解決這個問題,您可以執行下列其中一種解決方案:
確保基礎資料表擁有主索引鍵。
建立陳述式時,使用 SQLServerResultSet.TYPE_SS_SCROLL_DYNAMIC 而非 ResultSet.TYPE_SCROLL_SENSITIVE。
資料指標更新
對於資料指標類型和並行支援更新的資料指標,支援就地更新。如果資料指標沒有定位在結果集 (get<Type> 方法呼叫不成功) 中的可更新資料列,update<Type> 方法的呼叫將會擲回例外狀況訊息:「結果集目前沒有資料列」。針對資料指標為 CONCUR_READ_ONLY 的資料行呼叫更新方法時,JDBC 規格會說明引發例外狀況。在資料列無法更新的情況下,例如,因為競相更新或刪除之類的開放式並行衝突,在呼叫 insertRow、updateRow 或 deleteRow 前,可能不會引發例外狀況。
呼叫 update<Type> 後,get<Type> 無法存取受影響的資料行,直到呼叫 updateRow 或 cancelRowUpdates 為止。這樣可以避免使用不同於伺服器所傳回之類型更新資料行所產生的問題,而且後續的 getter 呼叫可能會叫用產生不正確結果的用戶端類型轉換。get<Type> 的呼叫將會擲回例外狀況訊息:「直到呼叫 updateRow() 或 cancelRowUpdates() 之後,才能存取已更新的資料行」。
注意
如果在尚未更新任何資料行時呼叫 updateRow 方法,JDBC 驅動程式將會擲回例外狀況訊息:「尚未更新任何資料行時呼叫 updateRow()」。
呼叫 moveToInsertRow 後,如果在結果集上呼叫非 get<Type>、update<Type>、insertRow, 和資料指標定位方法 (包括 moveToCurrentRow) 的任何方法,則會擲回例外狀況。moveToInsertRow 方法會將結果集有效地放入插入模式中,然後資料指標定位方法會中止插入模式。相對的資料指標定位呼叫會移動相對於呼叫 moveToInsertRow 前之位置的資料指標。資料指標定位呼叫後,最終的目的地資料指標位置會變成新的資料指標位置。
如果在插入模式不成功時進行資料指標定位呼叫,呼叫失敗後的資料指標位置為呼叫 moveToInsetRow 前的原始資料指標位置。如果 insertRow 失敗,資料指標仍然會在插入資料列上,而且資料指標仍然會在插入模式下。
插入資料列中的資料行一開始會處於未初始化的狀態。update<Type> 方法的呼叫會將資料行狀態設定為已初始化。未初始化之資料行的 get<Type> 方法呼叫會擲回例外狀況。insertRow 方法的呼叫會將插入資料列中的所有資料行返回到未初始化的狀態。
如果在呼叫 insertRow 方法時未初始化任何資料行,則會插入資料行的預設值。如果沒有預設值,但是資料行允許為 NULL,則會插入 NULL。如果沒有預設值,而且資料行不允許 NULL,則伺服器將會傳回錯誤,而且將會擲回例外狀況。
注意
getRow 方法的呼叫在插入模式時會傳回 0。
JDBC 驅動程式不支援定位更新或刪除。根據 JDBC 規格,setCursorName 方法沒有效果,而 getCursorName 方法將會擲回例外狀況 (如果呼叫的話)。
唯讀和靜態資料指標絕對是不可更新的。
SQL Server 會將伺服器資料指標限制為單一結果集。如果有批次或預存程序包含多個陳述式,則必須使用順向唯讀用戶端資料指標。
資料指標回應緩衝
SQL Server 資料指標類型在上表中所指出的任何結果集緩衝最多為 SQLServerResultSet 物件的 setFetchSize 方法所指定之資料列數目。Microsoft SQL Server 2005 JDBC Driver 1.2 版在此類情況下會忽略 responseBuffering 設定的值,但應用程式覆寫 TYPE_FORWARD_ONLY (CONCUR_UPDATABLE) 案例中所指定之 responseBuffering 設定的情況下除外。在此種情況下,應用程式可以利用 String 值 "adaptive",呼叫 SQLServerStatement 物件的 setResponseBuffering 方法,藉以覆寫 responseBuffering 設定。