Avatar billede henry64 Nybegynder
07. februar 2011 - 20:18 Der er 4 kommentarer

DBXpress dynamisk oprettelse i threads

Hej

Jeg har et projekt hvor jeg migrerer fra ADO til DBX, jeg har nogle threads der udfører noget dataprocessing i baggrunden og de SQL komponenter opretter jeg dynamisk med TThread.Create.

Jeg har et problem med at få initialiseret TSQLConnection rigtigt og jeg bliver ved med at få følgende fejlmeddelse.

DBX Error:  Driver could not be properly initialized.  Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path.

Når jeg bruger DBX komponenterne på en form er der ingen problemer med at få "connection" til databasen.
Jeg har SQL server nativ client installeret og client library findes kun i en version og i windows\system32.

Under TThread.Create kalder jeg min procedure SetupConnection som ser ca. således ud.

procedure TAlarmScanThr.SetupConnection;
begin
  try
    FSrcConnection := TSQLConnection.Create(nil);
    FSrcConnection.LoginPrompt := False;
    FSrcConnection.DriverName := 'MSSQL';
    FSrcConnection.BeforeConnect := FSrcConnectionBeforeConnect;

{  dette var bare et forsøg, men det giver samme resultat

with FSrcConnection do
    begin
      ConnectionName := 'Myconn';
      LogMyParams(FSrcConnection);
      DriverName := 'MSSQL';
      LogMyParams(FSrcConnection);
      LibraryName := 'dbxmss.dll';
      VendorLib := 'sqlncli10.dll';
      GetDriverFunc := 'getSQLDriverMSSQL';
    end;
}
    spFetchAlarmsInQueueAgg := TSQLStoredProc.Create(nil);
    spFetchAlarmsInQueueAgg.SQLConnection := FSrcConnection;
spFetchAlarmsInQueueAgg.StoredProcName := 'AD_FetchAlarmsInQueueAgg';


....
End;

Jeg har prøvet forskellige varianter, hvor jeg loader en ini fil med parametrene til driveren, og jeg kan debugge at de alle kommer ind på FsrcConnection som "jeg forventer" det.


Er der en der er i besiddelse af et demo projekt der bruger threads og DBX eller ved hvad der er årsag til problemet med DBX.

mvh
Henry
Avatar billede hrc Mester
07. februar 2011 - 21:49 #1
Ikke umiddelbar en løsning til hvorfor ovenstående ikke dur, men kan du ikke oprette et TDataModule i hver tråd, altså en intern instans af modulet og hvad der ligger på det.
Avatar billede hrc Mester
07. februar 2011 - 21:55 #2
... eller trykke alt-f12 og se hvordan properties for komponenten er i modulet? Det kan da ikke have noget med Owner at gøre?
Avatar billede henry64 Nybegynder
08. februar 2011 - 09:54 #3
Tak for dine forslag, men jeg er ret sikker på at det ikke har noget med owner at gøre.
AOwner bliver kun brugt for at Owner ved at komponenten skal nedlægges når den destrueres (så det er insertcomponent og destroycomponent) - connection gemmer faktisk ikke engang AOwner internt.

Jeg har kikket på properties i text mode, og jeg har manuelt lagt præcist de samme parametre på, men uden held.

Har du prøvet at oprette DBX komponenter i en tråd?
Avatar billede hrc Mester
08. februar 2011 - 10:22 #4
Nej, jeg bruger ADO med en fælles ADOConnection (og det virker fint). Tænkte bare, at hvis det virkede på et datamodul kunne det hænde at virke om du oprettede en sådan.

Hvad med at føre TSQLConnection over i tråden (via constructoren) som parameter tilsvarende det jeg gør?

Ja og nej til det med Owneren. Der er enkelte steder hvor det gør himmelvid forskel om owner med med eller ej. I ActiveX regi skal man holde tungen lige i munden ved frigivelse. Hvis owner er assigned frigives med "myobj := nil", ellers myobj.Free (om jeg husker ret).
Udgangspunktet er selvfølgelig at owner håndterer frigivelse af tilknyttede komponenter.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester