記錄集

來源:互聯網
上載者:User
記錄集


    前面已經提到,記錄集是ADO中最常用的對象,這並不值得奇怪。畢竟,他們包含著資料。但是,對於記錄集還有比想象的更多的內容,知道資料如何儲存和處理很重要,因為這為選擇使用哪種記錄集提供了更多的參考。
    記錄集有不同的類型,在一些細小的地方存在著差異,很容易造成失誤。首先需要認真談論的是游標的概念。

8.4.1 游標
    游標(cursor)是讓許多人感到困惑的概念,但實際上非常的簡單。
    游標用來管理記錄集和記錄集的當前位置,後者是由目前記錄指標來處理的。
    這不是Recordset對象所做的嗎?是的,但是記錄集也是依靠它的游標。這仍然沒有回答游標是什麼這個問題,那麼先來看一個記錄集,如表8-2所示:

    這裡有六行四列。開啟一個記錄集,目前記錄就是第一個記錄,即為Bob White的那條記錄。用什麼來標識目前記錄?用目前記錄指標。那麼又如何處理這個指標呢?當需要移到下一條記錄或者是其他記錄時,是通過游標來實現的。在訪問當前行的欄位時,游標知道目前位於哪一行,所以能返回正確的值。如果試圖移出記錄集的最後一行,游標也會處理。
    理解游標的一種好方法是將游標想象成為一個可以在記錄集內移動的視窗。這一視窗與記錄集的單個行同樣高,同樣長,因此一次只能看到一行資料值。當你移到另一條記錄時,這個視窗也跟著移動。
    也許你認為這相當簡單,但它確實很重要,因為能用游標做什麼是由游標的類型決定的。
1.  游標類型
游標的類型標識了游標所能夠提供的功能。這裡有四種類型的游標:
· 靜態(adOpenStatic)。靜態游標含有對記錄的靜態拷貝。這意味著在記錄集建立之後,記錄集的內容就固定了。其他使用者對記錄的更改、添加和刪除都是不可見的。允許在記錄集中向前、向後移動。
· 只許前移(adOpenForwardOnly)。預設的游標類型,除了只允許向前移動外,其餘的與靜態游標相同。
· 動態(adOpenDynamic)。動態游標沒有固定的記錄集。其他使用者的更改、添加或刪除操作在記錄集中是可見的。允許在記錄集中向前、向後移動。
· 鍵集(adOpenKeyset)。鍵集類型的游標除了記錄集是固定的,其餘的與動態游標相似。可以看到其他使用者的修改,但新記錄卻不可見。如果別的使用者刪除了記錄,那麼這些記錄在記錄集中將會變得不可訪問。這項功能是通過標識記錄集的鍵來實現的,所以鍵一直保留著,即使改變或刪除記錄。
為了理解這些概念,再想象游標視窗。對於只許前移的游標,可以看作是一個位於單向齒輪上的視窗,只能向前移動。這一特點的有利之處在於一旦通過了一條記錄,游標就會完全忘記該記錄,因為永遠不會回到該記錄上。靜態游標則移去了單向齒輪,允許向後移動;因為也能向後移動,游標需要跟蹤這些記錄。由於這個原因,靜態游標比只許前移的游標慢。
對於鍵集和動態類型的游標,視窗可以前後移動,但所看到的內容可能會改變。鍵集游標可以看到別人對資料的更改,但看不到新的或已刪除的記錄。因此,記錄集是固定的,但不是內容固定。動態游標將它擴充了,不僅可以改變記錄的內容,而且可以改變記錄集。所以在動態游標中能夠看到有新的記錄出現,同時刪除的記錄從屬記錄集中消失。
使用的游標類型取決於想達到的目的。如果只想瀏覽記錄,也許是為了建立一個表格或一個挑選清單,那麼用只許前移的游標是最好不過了。雖然使用其他類型的游標速度可能會慢一些,但也可以正常工作。
游標的類型會影響效能,特別是伺服器游標。例如,在微軟的SQL Server 6.5中,鍵集和靜態類型的游標都需要在臨時資料庫(tempdb)中放入一個完整的資料拷貝。其中,鍵集類型的游標相比較而言稍微高效一些,因為它只將鍵拷入臨時資料庫。對於SQL Server 7.0情況不是這樣,不同類型的游標的運行效率差別不是很大。
2.  游標位置
既然已經解釋了什麼是游標,以及游標如何管理資料,但是游標在哪裡呢?答案不是固定的,因為游標依賴於資料存放區。某些資料存放區,比如微軟的SQL Server,有自身的游標服務;而別的如微軟的Access卻沒有游標服務。
當開啟一個記錄集時,必須選擇是否希望資料存放區管理游標,或是希望OLE DB和ADO在本地為你管理游標。後者可以實現是因為OLE DB有其自己的游標服務。通過使用Connection對象或Recordset對象的CursorLocation屬性可以設定這兩個選項。可以設定該屬性的值為:
· adUseServer:讓資料存放區管理游標。
· adUseClient:讓ADO管理游標。
可以在開啟串連或記錄集之前設定這個屬性:
conPubs.CursorLocation = adUseServer
conPubs.Open strConn
或者:
rsAuthors.CursorLocation = adUseClient
rsAuthors.Open "authors", conPubs
預設的游標是基於伺服器的,理解這兩種類型的區別非常重要。對於一個伺服器游標來說,資料存放區的任務是管理記錄,所以,當使用伺服器游標建立一個記錄集時,資料存放區管理著記錄的移動、記錄的更新等等。
對於一個客戶游標,記錄集的全部內容複寫給客戶,受本地客戶游標服務管理。這意味著對於一個客戶游標,開啟一個具有大量記錄的記錄集要比使用基於伺服器的游標開啟相同記錄集所花費的時間長得多。也需要使用基於客戶的游標的時候,在本書後面,研究組件時,會看到更多的相關的例子。
3.  “消防帶”游標
你可能知道“消防帶”(Firehose)游標,由於能給應用程式帶來高的運行效率,所以對其進行解釋顯得非常重要。因為“消防帶”游標是一種特殊類型的游標,只有在與微軟的SQL Server串連時才出現。SQL Server建立使用者請求的資料集,然後把資料直接傳給客戶以使其儘可能快地得到資料。SQL Server自身幾乎沒有游標管理,這意味著它可以更快地處理資料。也就是說資料可以在非常短的時間內迅速返回到用戶端。從客戶方看,類型於只許前移的游標。
那麼,在前面討論游標類型時,為什麼沒有涉及到“消防帶”游標呢?因為這類游標專用於SQL Server,並僅用於使用基於伺服器的游標時。這不是一種真正的游標類型,獲得一個“消防帶”類型游標的方法就是不指定游標的類型。

8.4.2 鎖定
       我們已經解釋了游標和如何管理資料。現在可以建立記錄集了嗎?恐怕還不行,因為還有一個問題沒有討論,那就是鎖定。
       鎖定就是如何確保資料的完整性,確保更改不會被覆蓋。我們需要避免的典型情況是多次更新,比如一個使用者改動了一些資料,接著另一個使用者立即又將其做了修改。為了對這種情況加以保護,要鎖定記錄,有許多不同的方法可以保證記錄得到保護。可通過鎖定類型來設定這些方法。
鎖定類型
鎖定類型決定更新記錄時記錄是否或如何被鎖定。有四種類型的鎖定:
· 唯讀(adLockReadOnly):預設鎖定類型,記錄集是唯讀,不能修改記錄。
· 悲觀的(adLockPessimistic):當修改記錄時,資料提供者將嘗試鎖定記錄以確保成功地編輯記錄。只要編輯一開始,則立即鎖住記錄。
· 樂觀的(adLockOptimistic):直到用Update方法提交更新記錄時才鎖定記錄。
· 批量樂觀的(adLockBatchOptimistic):允許修改多個記錄,只有調用UpdateBatch方法後才鎖定記錄。
當不需要改動任何記錄時,應該使用唯讀記錄集,這樣提供者不用做任何檢測。對於一般的使用,樂觀的鎖定可能是最好的選擇,因為記錄只被鎖定一小段時間,資料在這段時間被更新。這減少了資源的使用。
悲觀的鎖定提高了資料的完整性,但卻是以犧牲並發性為代價的。並發性是許多使用者在同一時間查閱資料的能力。鎖定的記錄對其他使用者是不可見的,因而資料的並發性降低了。樂觀的鎖定只在一小段時間內鎖定記錄,所以增強了資料的並發性,但同時其他使用者修改資料的幾率也增加了。
關於並發性和鎖定的問題在微軟出版的《Inside SQL Server 7.0》(作者Ron Soukup和Kalen Delaney)中做了較好的論述。這是一本很有權威的專著,所以無論如何應購買這本專著,該書有大量的有價值的資料。
8.4.3 建立記錄集
       建立一個記錄集十分容易,通過調用Recordset對象的Open方法來實現:
       Recordset.Open [Source], [ActiveConnection], [CursorType], [LockType], [Options]
       其參數及說明如表8-3所示:
表8-3  Open方法的參數及說明

例如,要開啟資料庫pubs中authors表上的記錄集:
Dim rsAuthors

Set rsAuthors = Server.CreateObject("ADODB.Recordset")

rsAuthors.Open "authors", strConn

' Do something here

rsAuthors.Close
Set rsAuthors = Nothing
注意,有幾個參數沒有指定。實際上,所有的參數都是可選的,可以在開啟記錄集之前為它們設定相應的屬性值:
Dim rsAuthors

Set rsAuthors = Server.CreateObject("ADODB.Recordset")

With rsAuthors
       .Source = "authors"
       .ActiveConnection = strConn
       .CursorType = adOpenForwardOnly
       .LockType = adLockReadOnly
       .Open
End With

' Do something here

rsAuthors.Close
Set rsAuthors = Nothing
一旦開啟記錄集,當前指標自動地位於第一條記錄上。如果在記錄集中沒有記錄,那麼EOF和BOF屬性都是True:
rsAuthors.Open "authors", strConn

If rsAuthors.BOF and rsAuthors.EOF Then
       ' Recordset is empty
End If
1.       Options參數
Open方法的Options參數允許指定命令常值內容。它可以是以下CommandTypeEnum常數之一:
· adCmdText:文本命令,比如SQL字串。
· adCmdTable:表名。
· adCmdStoredProc:預存程序名。
· adCmdFile:儲存的記錄集的檔案名稱。
· adCmdTableDirect:表名。
· adCmdURLBind:URL地址。
adCmdTable與adCmdTableDirect的區別很小,如果想使用表中的全部列,使用adCmdTableDirect將由於ADO執行了某些內部最佳化而使運行速度變得稍快一些。
如果沒有指定命令的類型,ADO必須推算出執行的命令的類型,這將導致額外的開銷。
這裡還有兩個選項:adCmdUnspecified表示沒有指定類型;adCmdUnknow表示命令的類型未知。一般地可能不會使用它們。
額外的選項
Options參數可以是以上常數中的任一個,但也可以加入下列ExecuteOptionEnum常數:
· adAsyncExcute:非同步地執行命令。
· adAsyncFetch:取得初始的行集後,非同步地擷取剩下的行。
· adAsyncFetchBlocking:除了擷取記錄不阻止命令運行以外,其他與adAsyncFetch相似。
· adExechteNoRecords:命令不返回任何記錄。
非同步處理意味著在後台執行操作,可以運行命令,然後繼續其他工作,而不需要等待其執行完畢(同步操作)。當建立使用者介面時,這顯得特別方便,因為可以從命令執行中返回,向使用者顯示一些內容,而同時資料的擷取仍然在後台進行。當返回記錄集時,這對ASP程式員來說不是很有用,因為指令碼語言不支援ADO事件,所以記錄集何時已完成填充移無法得知。當處理更新、刪除或插入資料命令以及不返回記錄集的時候,可以使用非同步作業,即僅在不關心結果的情況下才能使用。
在另一方面,adExecuteNoRecords選項十分有用。它告訴ADO執行的命令不返回任何資料。所以,就沒有必要建立記錄集(總之,可能為空白)。這會加速正在啟動並執行更新或添加資料的查詢操作。
為了加入這些選項之一,可以使用Or符號(等同於加號“+”)
adCmdStoredProc Or adExecuteNoRecords

adCmdStoreProc + adExecuteNoRecords
在下一章,將看到對相關內容更詳細的介紹,因為這在處理命令(而不是記錄集)時會更有用。
2.       在記錄集中移動
一旦開啟一個記錄集,經常需要遍曆每一條記錄。這需要使用EOF屬性。當到達記錄集的末尾時,EOF就變為True,因為可以這樣建立一個迴圈:
rsAuthors.Open "authors", strConn

While Not rsAuthors.EOF
       Response.Write rsAuthors("au_lname:) & ", " & _
                             rsAuthors("au_fname") & "<BR>"
       rsAuthors.MoveNext
Wend
上面的例子一直迴圈到EOF屬性為True時才退出。MoveNext方法用於移到下一條記錄。
如果記錄集允許向後移動,則可以使用MovePrevious方法。在這種情況下,迴圈中需要檢測BOF屬性值。另外分別還有移動到第一條和最後一條記錄的MoveFirst和MoveLast方法:
rsAuthors.Open "authors", strConn, adOpenDynamic
' Now on first record

rsAuthors.MoveLast
' Now on last record
rsAuthors.MovePrevious
rsAuthors.MovePrevious
' Now three rows from the end of the recordset

rsAuthors.MoveFirst
' Back at the beginning again
3.       使用Fields集合
Fields集合包含記錄集中每一欄位(列)的Fields對象。Fields集合是記錄集的預設集合,因此在訪問欄位時可以省略,就如同上面的While...Wend例子中的情況。因此,有多種訪問欄位的方法:
rsAuthors.Fields("au_lname").Value
rsAuthors("au_lname).Value
rsAuthors(1).Value
rsAuthors.Fields(1).Value
可以使用欄位名,或使用它在集合中的位置。使用名字是最好的,因為這樣將使代碼更易於維護。
Value屬性是欄位的預設屬性,因此也可以省略,比如:
rsAuthors("au_lname")
如果想遍曆所有欄位,可以使用For Each結構:
For Each fldAuthor In rsAuthors.Fields
       Response.Write fldAuthor.Name & " : " & _
                             fldAuthor.Value & "<BR>"
Next
這個例子將列印每一個欄位的名字和值。
4.       書籤
當在記錄集中移動時,可能需要保留記錄的位置,以後再移回來。同真實的書籤相似,一個記錄集書籤是一個指向單個記錄的唯一的指標。
為了使用書籤,只需將Bookmark屬性值賦予一個變數:
varBkmk = rsAuthors.Bookmark
然後,可以在記錄集中移動,以後可以通過相反的命令將記錄移到做過書籤標記的相應記錄上:
rsAuthors.Bookmark = varBkmk
在記錄集中尋找記錄時,書籤是非常有用的。在本章稍後的8.4.5節中有一個相關的例子。
注意,並非所有記錄集都支援書籤,Supports方法(在下面討論)將能識別其是否支援書籤。
值得注意的重要一點是,不能跨越不同的記錄集使用書籤,即使這些記錄集是相同的命令建立的。考慮一下以下代碼:
rsAuthors.Open "authors", strConn
rsAuthorsOther.Opne "authors", strConn

varBkmk = rsAuthors.Bookmark
varBkmkOther = rsAuthorsOther.Bookmark

儘管兩個記錄集是用相同的命令建立的,但記錄集的書籤是不一樣的。
可以使用Clone方法獲得可交換的書籤,但在這裡我們不討論它。
5.       支援的功能
如上所述,並非所有的記錄集都支援書籤。還有許多其他的記錄集選項也不是被所有的提供者或記錄集類型支援的,因此可以用Supports方法驗證一下。
Supports方法使用一個或多個CursorOptionEnum值作為參數,返回True或False表明是否支援該選項。這些值的列表相當龐大,所以將其列於附錄F中。
例如:
If rsAuthors.Supports(adBookmark) Then
' The recordset supports bookmarks
varBkMk = rsAuthors.Bookmark
       End If
       可以使用Or或加號“+”組合多個常數:
       If rsAuthors.Supports(adBookmark Or adFind) Then
              ' The recordset supports bookmarks and use of Find
              varBkMk = rsAuthors.Bookmark
       End If

8.4.4 過濾記錄集
       過濾是一種暫時地限定記錄集中可見記錄的一種方法。如果僅顯示記錄集中的某些記錄,但又不需要每次都重新查詢資料庫,這種方法非常有用。
1.  使用條件過濾
Filter屬性擁有多個參數,其中一個就是條件運算式,它非常像SQL中Where子句:
rsAuthors.Filter = "state = 'ca'"
這個語句限定記錄集只顯示州名為ca的記錄。使用這個過濾條件將使當前指標回到第一條匹配記錄上。可以遍曆記錄集中的全部記錄,並且只有匹配條件的記錄才可見。
不僅僅限於單一條件,還可以使用And或Or把多個條件串連在一起:
rsAuthors.Filter = "au_lname = 'Homer' Or au_lname = 'Francis'"
這將過濾出姓為Francis或Homer的記錄。
上面的例子顯示了一個列匹配一個值的過濾方法,也可以使用下面操作符中的任何一種:
<:小於。
>:大於。
<=:小於等於。
>=:大於等於。
<>:不等於。
LIKE:萬用字元。
當使用通過配符操作時,可以使用“*”或“%”符號。例如:
rsAuthors.Filter = "au_lname LIKE 'Ho%'"
“*”或“%”作為一個萬用字元,匹配任何字元,因此上面的例子會匹配au_lname欄位中以“Ho”字元開始的所有記錄。
可以使用Null 字元串清空過濾條件,這樣將顯示全部記錄:
rsAuthors.Filter = ""
2.  使用常數過濾
Filter屬性也能用FilterGroupEnum常數作為其參數:
· adFilterNone:清空當前過濾條件,與使用一個Null 字元串的效果相同。
· adeFilterPendingRecords:只顯示那些已改變的,但還沒送到伺服器的記錄,只在成批更新模式下可用。
· adFilterAffectedRecords:只顯示那些受上一次調用Delete、Resync、UpdateBatch和CancelBatch方法影響的記錄。
· adFilterFetchedRecords:顯示快取中的記錄,即上一次調用讀取記錄的命令時的結果。
· adFilterConflictingRecords:顯示在上一次成批更新中更新失敗的記錄。
稍後會看到關於成批更新的介紹。
3.  使用書籤過濾
最後一種過濾記錄集的方法是使用一個書籤數組。可以使用這個技術建立一個記錄列表,然後再應用一個過濾條件對其過濾。例如:
rsAuthors.Open "authors", strConn, adOpenKeyset, _
                     adLockReadOnly, adCmdTableDirect

' Save bookmark for the first record
avarBkmk(0) = rsAuthors.Bookmark

' Move forward two records
rsAuthors.MoveNext
rsAuthors.MoveNext

' Save bookmark for the third record
avarBkmk(1) = rsAuthors.Bookmark

' Move to the end and save the bookmark
rsAuthors.MoveLast
avarBkmk(2) = rsAuthors.Bookmark

' Now apply the filter
rsAuthors.Filter = Array(avarBkmk(0), avarBkmk(1), avarBkmk(2))

' Now loop through the recordset
While Not rsAuthors.EOF
       Response.Write rsAuthors("au_lname") & "<BR>"
       rsAuthors.MoveNext
Wend
當迴圈至記錄集末尾位置時,會發現只有三條記錄,因為只有三個書籤應用於過濾條件。
注意,不能直接使用數組avarBkmk,必須使用Array函數將各個書籤轉換成不同的數組。

8.4.5 尋找記錄
       尋找單個的記錄由Find方法來完成。它類似於使用條件的過濾方法:
       rsAuthors.Find "au_lname = 'Lloyd'"
       它們之間最主要的區別在於這種方法只能有一個條件,不允許使用And或Or。
       可以使用可選的參數指定一些額外的選項,其完整的文法如下:
       Recordset.Find Criteria, [SkipRows], [SearchDirection], [Strat]
       SkipRows是一個數字,表示在開始尋找記錄前跳過的行數。預設為0,查詢從當前行開始。
       SearchDirection可以是adSearchForward,表示向前搜尋記錄;或者adSearchBackward,表示向後搜尋記錄。
       Start是一個書籤,指出開始尋找記錄的位置。
       如果開啟相應的記錄,當前指標將位於匹配的記錄上,如果沒有找到記錄,那麼將位於下面兩個位置中的一個:
       · 如果是向前搜尋,則位於記錄集末尾位置的後面,EOF被設定為True。
       · 如果是向後搜尋,則位於記錄集開始位置的前面,BOF被設定為True。
       使用書籤儲存位置
       如果沒有找到相應的記錄,記錄的重新置放可以由書籤輕鬆解決,因為可以為當前位置製作書籤,如果在尋找記錄過程中沒有找到所需的記錄,那麼再移回到上次儲存的位置。
       例如:
       ' Save the current position
       varBkmk = rsAuthors.Bookmark

       ' Find the record
       rsAuthors.Find "au_lname = 'Sussman'"

       ' Was it found
       If Not rsAuthors.EOF Then
              Response.Write "Found: " & rsAuthors ("au_lname") & ", " & _
                                   rsAuthors("au_fname") & "<BR>"
       Else
              Response.Write "Not found. Moving <BR>"
              rsAuthors.Bookmark = varBkmk
       End If
       使用Filter屬性強於Find方法的一個原因是Find語句只能一個查詢條件,而Filter屬性允許指定多個條件。也就是說,當想要尋找的欄位條件不止一個時,不能使用Find方法。然而,可以先過濾記錄,如果找到記錄可以再刪除過濾條件。

8.4.6 修改記錄
       大部分的Web只用來顯示資訊,而Web應用程式正變得越來越普遍。在這種情形下,如果只擁有唯讀資料確實沒有什麼用處。建立一個應用程式,幾乎總是需要修改現存的資料或是添加新的資料,其方法有許多。在本節,將學習如何使用Recordset對象的方法來更改資料。在下一章,將會看到如何使用查詢完成相同的任務。
       可以設定除了adLockReadOnly之處的鎖定類型配合使用Recordset對象的方法去修改資料(假定有相應的許可權)。記住,預設的鎖定類型是唯讀。
1.  添加記錄
要在記錄集中添加記錄,使用AddNew方法。有兩種使用AddNew的方法。第一種沒有任何參數,僅僅調用AddNew,在記錄集的最後添加一個空記錄。在調用Update方法儲存所做的更改之前,可以隨意地修改欄位中的資料:
With rsAuthors
       .Open "authors", strConn, adOpenDynamic, _
              adLockOptimistic, adCmdTableDirect

.AddNew
              .Fields("au_id") = "123-12-1234"
              .Fields("au_lname") = "Lloyd"
       .Fields("au_fname") = "Janine"
       .Fields("contract") = 0
.Update

End With
這隻是添加了一條新記錄,設定四個強制型的欄位值。
另一種方法是使用AddNew方法的選擇性參數,這是兩個數組,一個是欄位名,另一個是欄位的值。
With rsAuthors
       .Open "authors", strConn, adOpenDynamic, _
       adLockOptimistic, adCmdTableDirect

       .AddNew Array("au_id", "au_lname", "au_fname", "contract"), _
                     Array("123-12-1234", "Lloyd", "Janine", 0)
End With
這個方法不需要調用Update方法。
2.  編輯記錄
編輯記錄與添加記錄的方法相似,不同之處在於不需要調用AddNew方法:
strSQL = "SELECT * FROM authors" & _
              "WHERE au_lname='Lloyd'"

With rsAuthors
       .Open strSQL, strConn, adOpenDynamic, _
              adLockOptimistic, adCmdText

       .Fields("contract") =1
       .Update
End With
這僅僅是將目前記錄(在這種情況下是第一條記錄,因為剛剛開啟記錄集)的contract欄位的值賦為1。
3.  刪除記錄
刪除記錄需調用Delete方法。刪除哪一條記錄取決於可選的參數,可以是下面AffectEnum常數中的一個:
· adAffectCurrent:刪除目前記錄,預設操作。
· adAffectGroup:刪除匹配當前過濾條件的所有記錄。
· adAffectAll:刪除記錄集中的全部記錄。
· adAffectAllChapters:刪除所有段(chapter)中的記錄。
最簡單的調用形式是:
rsAuthors.Delete
這將刪除目前記錄。如果有一個過濾條件,並想刪除所有匹配該條件的記錄,那麼僅需加上適當的常數:
rsAuthors.Delete adAffectGroup
4.  自動遞增的欄位
當添加一條新記錄時,一般會碰到這樣一個問題:如何處理那些自動遞增的或識別欄位(Identity Filed)。這些欄位是由伺服器自動更新的數字欄位,一般用於為每一行提供一個唯一的欄位值。當資料庫含有多個表時,那麼這個唯一的欄位經常被當作關聯表的外鍵。所以,添加一條新記錄時,經常需要找出它們的值。
例如,考慮一下有兩個欄位的表,一個自動遞增的ID欄位(SQL Server中的IDENTITY欄位或Access中的AutoNumber欄位),一個欄位名為Name的文字欄位。現在考慮一下下面的向表中添加記錄的代碼:
With rsData
       .Open "tblTest", adOpenDynamic, adLockOptimistic, adCmdTableDirect
       .AddNew
       .Fields("Name") = "Janine"
       .Update

       intID = .Fields("ID")
End With
看上去很平常,但添加記錄後是否能夠取到這個值依賴於游標的類型、鎖定的類型以及ID欄位是否被索引。表8-4列出了哪些組合允許擷取新插入的ID欄位的值。其他沒有列在表中的組合不能返回ID欄位的值。
表8-4  擷取ID欄位的值與游標、鎖定的類型及ID欄位是否被索引的關係

    這清楚地說明必須使用正確的組合,才能保證能取得ID欄位的正確值。否則,可能會得到0、空值或NULL,這取決於組合的方式。在下一章中處理預存程序時,將見到另一種從SQL Server擷取IDENTITY欄位值的方法。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。