Məlumat

Çoxlu Delphi verilənlər bazası sorğuları

Çoxlu Delphi verilənlər bazası sorğuları

Dizaynı ilə Delphi tətbiqi bir iplə işləyir. Tətbiqin bəzi hissələrini sürətləndirmək üçün Delphi tətbiqetmənizdə eyni vaxtda bir neçə icra yolunu əlavə etmək qərarına gələ bilərsiniz.

Verilənlər bazası tətbiqetmələrində çox oxlu

Əksər ssenarilərdə Delphi ilə yaratdığınız verilənlər bazası tətbiqetmələri tək bir yivlidir - başqa bir məlumat dəsti almamışdan əvvəl verilənlər bazasına qarşı işlətdiyiniz bir sorğu bitirməlidir (sorğu nəticələrinin emalı).

Məlumatların işlənməsini sürətləndirmək üçün, məsələn, hesabat yaratmaq üçün verilənlər bazasından məlumatların alınması üçün nəticəni əldə etmək və işləmək üçün (qeyd dəftəri) əlavə bir mövzu əlavə edə bilərsiniz.

Çox dişli ADO verilənlər bazası sorğularındakı 3 tələ haqqında məlumat əldə etmək üçün oxumağa davam edin:

  1. Həll et: "CoInitialize çağırılmadı".
  2. Həll et: "Kətan rəsm çəkməyə icazə vermir".
  3. Əsas TADoConnection istifadə edilə bilməz!

Müştəri Sifariş Ssenarisi

Müştərinin tərkibində əşyalar olan sifarişlərin yerləşdirildiyi məlum ssenaridə, hər sifariş üçün ümumi sayda müəyyən bir müştəri üçün bütün sifarişləri göstərmək lazımdır.

"Normal" tək yivli bir tətbiqdə məlumatları çıxarmaq üçün sorğunu işə salmalı, sonra məlumatları göstərmək üçün rekordlar üzərində təkrarlayacaqsınız.

Bu əməliyyatı birdən çox müştəri üçün aparmaq istəyirsinizsə, etməlisiniz seçilmiş müştərilərin hər biri üçün proseduru ardıcıllıqla həyata keçirin.

Bir çox seçilmiş ssenari, hər seçilmiş müştəri üçün verilənlər bazası sorğusunu ayrıca bir mövzuda işlədə bilərsiniz.və beləliklə kodu bir neçə dəfə daha sürətli icra edin.

DbGO (ADO) -də çoxbarmaq

Deyək ki, 3 seçilmiş müştəri üçün sifarişləri Delphi siyahı qutusuna nəzarət etmək istəyirsiniz.

növü

TCalcThread = sinif(TThread)
  

özəl

    proseduru YeniləməCount;
  

qorunur

    proseduru İcra etmək; ləğv etmək;
  

ictimai

ConnStr: genişləndirmə;

SQLString: geniş;

ListBox: TListBox;

Prioritet: TThreadİstilik;

TicksLabel: TLabel;

Gənələr: Kardinal;

  son;

Bu seçilmiş müştəri üçün bütün sifarişləri almaq və işlətmək üçün istifadə edəcəyimiz xüsusi bir mövzu sinifinin interfeys hissəsidir.

Hər sifariş bir siyah qutusu nəzarətində bir element olaraq göstərilirListBox sahə). The Əlaqə qurmaq sahəsində ADO bağlantısı simli tutur. The TicksLabel Sinxronlaşdırılmış bir prosedurda iplərin icra müddətlərini göstərmək üçün istifadə ediləcək bir TLabel nəzarətinə istinad edir.

The RunThread prosedur TCalcThread mövzu sinifinin bir nümunəsini yaradır və işlədir.

funksiyası TADOThreadedForm.RunThread (SQLString: enestring; LB: TListBox; Prioritet: TThreadİstilik; lbl: TLabel): TCalcThread;

var

CalcThread: TCalcThread;

başlamaq

CalcThread: = TCalcThread.Create (doğru);

CalcThread.FreeOnTerminate: = doğrudur;

CalcThread.ConnStr: = ADOConnection1.QoşulmaString;

CalcThread.SQLString: = SQLString;

CalcThread.ListBox: = LB;

CalcThread.Üstünlük: = Prioritet;

CalcThread.TicksLabel: = lbl;

CalcThread.OnTerminate: = Mövzu başa çatdı;

CalcThread.Resume;

Nəticə: = CalcThread;

son;

Açılan qutudan 3 müştəri seçildikdə, CalcThread-in 3 misalı yaradırıq:

var

s, sg: genişlik;

c1, c2, c3: tam;

başlamaq

s: = 'Seçin O.SaleDate, MAX (I.ItemNo).

'Müştəri C'dən, Sifarişlər O, əşyalar' +

'Harada C.CustNo = O.CustNo VƏ I.OrderNo = O.OrderNo';

sg: = 'O.SaleDate tərəfindən QURĞU';


c1: = Tam (ComboBox1.Items.ObjectsComboBox1.ItemIndex);

c2: = Tam (ComboBox2.Items.ObjectsComboBox2.ItemIndex);

c3: = Tam (ComboBox3.Items.ObjectsComboBox3.ItemIndex);


Başlıq: = ";

ct1: = RunThread (Format ('% s AND C.CustNo =% d% s', s, c1, sg), lbCustomer1, tpTimeCritical, lblCustomer1);

ct2: = RunThread (Format ('% s AND C.CustNo =% d% s', s, c2, sg), lbCustomer2, tpNormal, lblCustomer2);

ct3: = RunThread (Format ('% s AND C.CustNo =% d% s', s, c3, sg), lbCustomer3, tpLowest, lblCustomer3);

son;

Çoxlu ADO sorğuları ilə tələlər və fəndlər

Əsas kod ipin içərisindədir İcra etmək metod:

proseduru TCalcThread.Execute;

var

Qry: TADOQuery;

k: tam;

olmaqcin
  

irsi;
CoInitialize (nil);

// CoInitialize çağırılmadı

Qry: = TADOQuery.Create (nil) ;
  

cəhd edin// İSTİFADƏN BAĞLI İSTİFADƏ etməliyik // Qry.Qoşulma: = Form1.ADOConnection1;

Qry.ConnectionString: = ConnStr;

Qry.CursorLocation: = clUseServer;

Qry.LockType: = ltReadOnly;

Qry.CursorType: = ctOpenForwardOnly;

Qry.SQL.Text: = SQLString;

Qry.Open;

    edərkən Qry.Eof DEYİL YOXDUR Xitam verildi etmək

başlamaq

ListBox.Items.Insert (0, Format ('% s -% d', Qry.Fields0.asString, Qry.Fields1.AsInteger));

      // Kətan Sinxronizasiya vasitəsilə çağırılmadığı təqdirdə rəsm çəkməyə icazə vermir

Sinxronizasiya et (RefreshCount);

Qry.Növ;

    son;
  

nəhayət

Qry.Free;

son;

CoUninitialize ();

son;

Çoxpilləli Delphi ADO verilənlər bazası tətbiqetmələrini yaratarkən həll ediləcəyini bilmək üçün 3 tələ var:

  1. BirləşdirinCoUnitialize hər hansı bir dbGo obyektini istifadə etməzdən əvvəl əl ilə çağırılmalıdır. CoInitialize-ə zəng vurmamaq "ilə nəticələnəcək"CoInitialize çağırılmadı"istisna. CoInitialize metodu cari kitabdakı COM kitabxanasını işə salır. ADO COM.
  2. Sən * bilməz * əsas ipdən (tətbiq) TADOConnection obyektini istifadə edin. Hər ip öz verilənlər bazası bağlantısı yaratmalıdır.
  3. Siz istifadə etməlisiniz Sinxronizasiya edin əsas iplə "danışmaq" və əsas forma aid hər hansı bir idarəetmə proseduru.