2012-07-07 28 views
0

由於代碼冗餘,我將通常的ADOQuery處理概括爲其自己的方法,並返回查詢的_RecordSet方法。 現在,當我檢查該方法中的查詢結果時,他們檢查出好的。但返回的_RecordSet似乎是空的或零(例外:EOleException項目無法在集合中找到相應的名稱或序號。) 從我收集,我似乎需要返回查詢的克隆_Recordset。到目前爲止,我已經使用Delphi2005 - 在另一種方法中使用TADOQuery結果

res := qr.Recordset.Clone(adLockUnspecified); Result := res;

TADOQuery.RecordSet._xClone()方法

失敗,以及THESE方法,其中沒有工作(不認識幾個組件,版本差異我猜)嘗試。

我使用的查詢代碼:

function queryDb(const s: WideString; const dc: boolean = true): _RecordSet; 
var 
    ds: String; 
    conn: TADOConnection; 
    qr: TADOQuery; 
    res: _RecordSet; 
begin 
    Result := nil; 
    conn := TADOConnection.Create(nil); 
    qr := TADOQuery.Create(nil); 
    try 
    ds := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' 
      + ExtractFilePath(Application.ExeName) 
      + 'gdkp.mdb;Persist Security Info=False'; 
    conn.ConnectionString := ds; 
    conn.LoginPrompt := false; 
    conn.Connected := true; 
    qr.Connection := conn; 
    if(dc = true)then begin 
     qr.DisableControls 
    end; 
    qr.SQL.Add(s); 
    qr.Open; 
    Result := qr.Recordset; 
    finally 
    conn.Free; 
    qr.Free; 
    end; 
end; 

已經有人克服以前這一問題,並且知道合適的答案或者可以直接對我有幫助的內容?

回答

1

我不知道,你的瘋狂滑稽的是更加瘋狂:

  1. 設備並連接到數據庫的函數內部,做這個函數內部查詢,連接到數據庫,每次您QUERY,將會非常緩慢。

  2. ADO查詢對象應具有比函數內部更長的生命週期。這是一種代碼味道,是一種嚴重的味道。

  3. 將記錄集保留在它所屬的查詢中。

  4. 正常的人創造TDataModules和周圍留下他們的對象爲他們的應用程序的生命週期,並使用此代碼重新查詢:

    query.Active:= FALSE; query.Active:= true;

當您不需要連接到數據庫時創建並拆除連接和查詢,並且每次需要某些數據時都要監視應用程序的加速。

你究竟在做什麼_recordsets你回來了?您是否在C#中學習ADO,並且您正嘗試在Delphi中使用C#ADO.net習語?別。別那樣做。

0

您返回的RecordSet爲零/空,因爲您正在關閉它在finally語句中。我猜這就是爲什麼你在返回之前試過克隆RecordSet的原因?克隆它會創建另一個指向相同RecordSet的指針,因此關閉RecordSet也會導致您的克隆返回nil/empty。

由於本曾建議,有更好的方法來做到這一點就像使用TDataModules,但這裏是我的方式:

我傾向於寫每個數據檢索或更新/插入操作的功能。每個函數都傳遞一個ADO連接作爲參數,然後運行查詢/存儲過程的問題包含在該函數中,並且任何數據都作爲var參數或返回值返回。我保留一個ADO連接,根據需要傳遞給每個函數。

e.g(僞代碼,因爲我沒有做過德爾福一會兒)

function GetAllUsers(adoConnection : TAdoConnection) : TStringList  
begin 
    result.clear; 
    if (adoConnection <> nil) then 
    begin 
    .. 
    .. 
    // have already set up an ADOStoredProc called storedProc in this 
    // part of the code block 
    .. 
    adoRec := storedProc.Execute(); 
    while not (adoRec.eof) do    // loop through record set and get our data 
    begin 
     result.Add(adoGetFieldStr(adoRec,'USERNAME'));  
     adoRec.MoveNext; 
    end; 
    adoRec.Free; 
    end; 
end 

希望幫助