2012-07-07 4 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 : = 거짓을; query.Active : = true; 이 데이터베이스에 연결 만들고 연결 및 쿼리, 당신은 어떤 데이터를 할 때마다를 철거하지 않을 때

앱 속도 업을보세요.

당신은 다시 돌아 오는 _recordsets로 무엇을하고 있습니까? C#에서 ADO를 배웠고 C# ADO.net 관용구를 Delphi에서 사용하려고합니까? 하지마. 그만해.

0

반환 된 RecordSet은 finally 문에서 닫히기 때문에 nil/empty입니다. 이것이 반환되기 전에 RecordSet 복제를 시도한 이유입니다. 복제하면 동일한 RecordSet에 대한 또 다른 포인터가 만들어 지므로 RecordSet을 닫으면 복제본이 nil/empty로 반환됩니다. 벤이 제안함에 따라

는 TDataModules를 사용하는 것과 같이이 작업을 수행하는 더 나은 방법이있다, 그러나 여기 내 방법 : I는 각 데이터 검색 또는 갱신/삽입 작업에 대한 함수를 작성하는 경향이

은.각 함수는 ADO 연결을 매개 변수로 전달한 다음 쿼리/저장된 proc 실행 문제가 함수 내에 포함되며 모든 데이터는 var 매개 변수 또는 반환 값으로 반환됩니다. 필자는 필요에 따라 각 함수에 전달되는 단일 ADO 연결을 유지합니다.

을하는 데 도움이

예 : (I 잠시 동안 델파이를하지했기 때문에 의사 코드)

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 

희망