首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ADO RecordSet 遍歷填充 ComboBox 的正確姿勢:避開「全是第一筆資料」的陷阱

     編輯:關於SqlServer

在使用 Delphi (或 VB6) 的 ADO 元件時,常見需求是將查詢結果填入 ComboBox 下拉選單。許多開發者初次嘗試會寫出如下程式碼,卻發現下拉選單裡全是重複的第一筆資料:

// 錯誤示範:游標未移動,導致每次讀到同一筆
ADOQuery1.SQL.Text := 'SELECT * FROM gps';
ADOQuery1.Open;
if ADOQuery1.RecordCount > 0 then
  for i := 0 to ADOQuery1.RecordCount - 1 do
    ComboBox1.Items.Add(ADOQuery1.FieldByName('name').AsString);

問題根因

RecordCount 雖能取得筆數,但 游標並未自動移動。每次迴圈皆讀取當前游標位置(預設停在第一筆),故產生重複資料。

正確解法:手動呼叫 MoveNext

with ADOQuery1 do
begin
  SQL.Text := 'SELECT * FROM gps';
  Open;
  if RecordCount > 0 then
  begin
    for i := 0 to RecordCount - 1 do
    begin
      // 使用 Fields 索引或 FieldByName 皆可
      DW_ComboBox.Items.Add(Recordset.Fields[2].Value); // 第 3 個欄位
      Recordset.MoveNext; // 關鍵:移動游標到下一筆
    end;
  end;
end;

進階技巧與注意事項

  • 效能優化:大量資料時,先 DisableControls / EnableControls 避免 UI 重繪。
  • 游標類型:確保 CursorLocation = clUseClient 且 CursorType = ctStatic 或 ctKeyset,才能正確取得 RecordCount。
  • 資源釋放:用完記得 Close 並釋放 Recordset 參考。
  • 索引起始:Fields 集合索引從 0 開始,Fields[2] 即第 3 個欄位。

替代方案:GetRows 批次讀取

若資料量極大,可考慮 var Arr := Recordset.GetRows(RecordCount); 一次讀入陣列,再迴圈填入控制項,減少 COM 互呼叫開銷。

掌握 MoveNext 這一關鍵步驟,即可輕鬆解決 ComboBox 重複資料問題,讓資料綁定更穩健。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved