2013-04-27 3 views
5

मैं एक प्रश्न कोड है कि मैं हर बार जब मैं डेटाबेस से डेटा लाने की जरूरत है कॉल कर सकते हैं, और मैं इसे पिरोया जा करना चाहते हैं। यह सुनिश्चित नहीं है कि इसे थ्रेड में कैसे कार्यान्वित किया जाए ताकि मैं इस कोड का पुन: उपयोग कर सकूं, मूल रूप से, मैं यह कोड थ्रेड के अंदर चाहता हूं। मुझे पता है कि थ्रेड के अंदर एक साधारण डेटाबेस क्वेरी कैसे बनाएं, लेकिन ऐसा कुछ चाहिए जिसे मैं पुन: उपयोग कर सकूं। क्या कोई मुझे बता सकता है कि मैं इसके लिए उदाहरण कहां पा सकता हूं या उदाहरण प्रदान करने के लिए पर्याप्त दयालु हो सकता हूं?पिरोया डेल्फी एडीओ क्वेरी

यहाँ मेरी नमूना डेटाबेस क्वेरी है:

function TDBConnection.SQLOpen(const SQLStr: String): TDataSet; 
var 
    i: Integer 
begin 
    try 
    Result := TADOQuery.Create(DBConnect.FDatabaseConection); 
    TADOQuery(Result).Connection:=DBConnect.FDatabaseConnection; 
    TADOQuery(Result).CommandTimeOut:=30; 
    TADOQuery(Result).SQL.Text := SQLStr; 
    TADOQuery(Result).Open; 
    except 

    end; 
end; 

और यह कैसे मैं ऊपर समारोह फोन कर रहा हूँ का एक नमूना है:

function TDBConnection.GetUserInfo: Boolean; 
var 
    sqlStr: String; 
    Database: TDataset; 
begin 
    sqlStr:= 'SELECT FIELD1, FIELD2, FIELD3 FROM TABLE1'; 
    try 
    Dataset := SQLOpen(sqlStr); 
    if not Dataset.IsEmpty then 
    begin 
     //pass result to StringGrid 
    end; 
    finally 
    FreeAndNil(SQLParams); 
    FreeAndNil(Dataset); 
    end; 
end; 
+0

आप इसे थ्रेड पर क्यों चाहते हैं? यदि आप क्वेरी चालू होने पर अन्य चीजें करना चाहते हैं तो आप एक एसिंक्रोनस क्वेरी का उपयोग कर सकते हैं (जो कि किसी भी थ्रेड पर क्वेरी को चलाता है)। – Rob

+0

हाय रोब, सुझाव के लिए धन्यवाद। लेकिन मैंने कहीं पढ़ा है कि एसिंक्रोनस क्वेरी का उपयोग करते समय बहुत से उपयोगकर्ताओं को हैंडल और मेमोरी लीक के साथ समस्याएं होती हैं। –

+0

मैंने इसे नहीं देखा है। मेरे पास स्वायत्त (डेल्फी) सॉफ़्टवेयर है जो लगातार एसिंक एडीओ प्रश्नों को करने में सप्ताहों तक चलता है। मेरे पास कुछ अन्य सी ++ कोड है जो नियमित रूप से रन पर 100000000 एसिंक क्वेरी को बंद करता है। – Rob

उत्तर

4

पुनर्प्रयोग के लिए parameterinformations साथ एक सरणी का उपयोग कर।
हर धागा खुद कनेक्शन के साथ एक स्वयं Adodataset पैदा करता है।
अभिलेख प्रदर्शित करने और संपादन के बाद धागा समाप्त के लिए इस्तेमाल किया जा सकता है।
धागा उदाहरणों में से एक असली आवेदन हैंडलिंग के लिए जोड़ने होना होगा।

unit ThreadedAdoDataset; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids; 

type 

    TFieldInfoRecord = Record // as far as sometimes parametertypes can not be detected by 
    DataType: TFieldType; // Ado on his own, provide all needed informations 
    Name: String; 
    Size: Integer; 
    Value: Variant; 
    End; 

    TFieldInfoArray = Array of TFieldInfoRecord; 

    TDBThread = Class(TThread) 
    Constructor Create(Const ConnectionString, SQL: String; 
     FDArray: TFieldInfoArray); 
    private 
    FConnectionString, FSQL: String; 
    FFDArray: TFieldInfoArray; 
    FRecordSet: _RecordSet; 
    Protected 
    Procedure Execute; override; 
    public 
    Property RecordSet: _RecordSet read FRecordSet; 
    End; 

    TForm7 = class(TForm) 
    ADOConnection1: TADOConnection; 
    Button1: TButton; 
    ADODataSet1: TADODataSet; 
    DataSource1: TDataSource; 
    DBGrid1: TDBGrid; 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    procedure ThreadTerminate(Sender: TObject); 
    { Private-Deklarationen } 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form7: TForm7; 

implementation 

uses ActiveX; 
{$R *.dfm} 

procedure TForm7.Button1Click(Sender: TObject); 
var 
    FDArray: TFieldInfoArray; 
    I: Integer; 
begin 
    // prepare parameterinformations 
    SetLength(FDArray, 1); 
    FDArray[0].Name := 'cn'; 
    FDArray[0].DataType := ftString; 
    FDArray[0].Size := 20; 
    FDArray[0].Value := '%ue%'; 

    for I := 0 to 10 do // testrun with 11 threads 

    With TDBThread.Create(ADOConnection1.ConnectionString, 
     'select * from Composition where Componame like :cn', FDArray) do 
    begin 
     FreeOnTerminate := true; 
     // assign the wished procedure to ba called on terminate 
     OnTerminate := ThreadTerminate; 
    end; 

end; 

procedure TForm7.ThreadTerminate(Sender: TObject); 
begin 
    // example of assigning the recordset of the thread for displaying and editing 
    // NOTE for editing the connection of ADODataSet1 has to be fitting to the threadcall 
    ADODataSet1.RecordSet := TDBThread(Sender).RecordSet; 
end; 

procedure TForm7.FormCreate(Sender: TObject); 
begin 
    ReportMemoryLeaksOnShutDown := true; 
end; 


{ TDBThread } 

constructor TDBThread.Create(const ConnectionString, SQL: String; 
    FDArray: TFieldInfoArray); 
var 
    I: Integer; 
begin 
    inherited Create(false); 
    FConnectionString := ConnectionString; 
    FSQL := SQL; 
    SetLength(FFDArray, Length(FDArray)); 
    for I := 0 to High(FDArray) do 
    begin 
    FFDArray[I].DataType := FDArray[I].DataType; 
    FFDArray[I].Size := FDArray[I].Size; 
    FFDArray[I].Name := FDArray[I].Name; 
    FFDArray[I].Value := FDArray[I].Value; 
    end; 
end; 

procedure TDBThread.Execute; 
var 
    I: Integer; 
begin 
    inherited; 
    CoInitialize(nil); 
    try 
    With TADODataSet.Create(nil) do 
     try 
     CommandTimeOut := 600; 
     ConnectionString := FConnectionString; 
     // use own connection for the dataset 
     // will requite a conncetionsstring including all 
     // information for loggon 
     Commandtext := FSQL; 
     Parameters.ParseSQL(FSQL, true); // extract parameters 
     for I := Low(FFDArray) to High(FFDArray) do // set parametervalues 
     begin 
      Parameters.ParamByName(FFDArray[I].Name).DataType := FFDArray[I] 
      .DataType; 
      Parameters.ParamByName(FFDArray[I].Name).Size := FFDArray[I].Size; 
      Parameters.ParamByName(FFDArray[I].Name).Value := FFDArray[I].Value; 
     end; 
     Open; 
     FRecordSet := RecordSet; // keep recordset 
     finally 
     Free; 
     end; 
    finally 
    CoUnInitialize; 
    end; 
end; 

end. 
+0

@kobik धन्यवाद, एक प्रकार का ओवरटायर .. – bummi

+0

@bummi, इस कोड नमूने के लिए धन्यवाद, मैं इसे अपनी परियोजना में आजमाउंगा। –

संबंधित मुद्दे