在使用 ADO 連接 SQL Server 時,開發人員常遇到 TEXT 和 NTEXT 大型物件(LOB)欄位無法正常讀取的困擾。本文記錄一次實際排查經驗,揭示根本原因並提供解決方案。
雖然名稱包含「TEXT」,但這兩種資料型別並非用於儲存一般文字,而是類似 IMAGE 型別,設計用於儲存二進位大型物件(BLOB),如 MIME 編碼的文件內容。將其用於儲存新聞正文等長文本雖可容納更多資料,但會引發讀取機制上的特殊限制。
Connection.Execute vs Recordset.OpenSet rs = conn.Execute("SELECT content FROM news WHERE id=1")
' 嘗試讀取 rs("content") 時失敗,或回傳空值/截斷資料
Connection.Execute 回傳的 Recordset 對 LOB 欄位僅能取得資料指標/索引,無法直接存取實際內容,導致讀取失敗。
rs.Open "SELECT content FROM news WHERE id=1", conn, adOpenStatic, adLockReadOnly
' 正常讀取 rs("content") 取得完整內容
Recordset.Open 以游標方式開啟,支援完整的 LOB 資料流讀取,能正確獲取欄位實際內容。
若比較兩種方式回傳 Recordset 的位元組大小,後者明顯包含完整資料載體。
根據使用場景選擇適當方法:
Connection.Execute 輕量級查詢,減少游標開銷。Recordset.Open 確保資料完整讀取。此策略可在保證功能正確性的前提下,顯著提升列表類頁面的查詢效能。
TEXT/NTEXT 本質是 BLOB 儲存,ADO 讀取時必須使用 Recordset.Open 建立完整游標。針對不同業務場景混合使用兩種查詢方式,兼顧正確性與效能。