Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism ADOConnection und GetProviderNames (https://www.delphipraxis.net/58587-adoconnection-und-getprovidernames.html)

caustic 9. Dez 2005 10:24

Datenbank: Oracle • Zugriff über: ADO

ADOConnection und GetProviderNames
 
Folgendes Problem, in den Delphi VCL Komponenten, kann man die für den Connectionstring notwendigen Provider über den Befehl GetProviderNames abrufen und bekommt sie als Stringliste zurück. Jetzt versuche ich gerade etwas ähnliches für eine WinForm Anwendung zu finden.

Bei der Komponente OleDBConnection kann ich ja für den Connectionstring, die Datenverknüpfungseigenschaften im Objektinstpektor aufrufen und dort unter den installierten Treibern wählen, aber wo oder wie bekomme ich diese Liste her.

Ich habe, um mein Datenbanktool, für verschiedene Datenbanken zurüsten, bisher immer die Auswahl des möglichen Providers in einer Combobox anzeigen lassen.
So einfach sah die Funktion früher mal aus:
Delphi-Quellcode:
function TDataMlogin.StrgLstCreate;
 var Provider : TStrings;
      Index : Integer;
begin
    Provider := TStringList.Create;
    GetProviderNames(Provider);
    for Index := 0 to Provider.Count - 1 do
      begin
        Provider[Index] := Provider[Index] + '.1'
      end;
    result := Provider;
end;
Die alte Funktion kam aus der alten ADODB oder DB Unit und hat dann wie jetzt halt mit den Datenverknüpungseigenschften für den Connectionstring so was produziert
" OraOLEDB.Oracle.1 "

Wie bekomme ich das jetzt ohne VCL hin? :roll:

Vielen Dank!
Gruß
caustic

caustic 18. Dez 2005 00:05

Re: ADOConnection und GetProviderNames
 
Das Problem, besteht weiterhin und ist anscheinend nicht so einfach zu lösen, naja...
Trotzdem hole ich das hier nochmal hoch in der Hoffnung jemand weiß ne einfache Lösung, hier z.B. mal eine Sache aus Delphi .Net bei einer Winforms Anwendung.
Ab und zu muss man ja bei einem Programm überprüfen, ob die Anwendung mit Administratorrechten läuft also auch schreibenden Zugriff auf die Registry und den HKLM hat. So sah das mit Delphi Win32 aus:
Delphi-Quellcode:
function IsAdmin: Boolean;
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
  (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS    = $00000220;

var
  hAccessToken: THandle;
  ptgGroups: PTokenGroups;
  dwInfoBufferSize: DWORD;
  psidAdministrators: PSID;
  x: Integer;
  bSuccess: BOOL;
begin
  Result := False;
  bSuccess:=False;
  ptgGroups:=nil;
  psidAdministrators:=nil;
  try
    bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
      hAccessToken);
    if not bSuccess then
    begin
      if GetLastError = ERROR_NO_TOKEN then
      bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
        hAccessToken);
    end;
    if bSuccess then
    begin
      GetMem(ptgGroups, 1024);
      bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
        ptgGroups, 1024, dwInfoBufferSize);
      if bSuccess then
      begin
        AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
          SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
          0, 0, 0, 0, 0, 0, psidAdministrators);
        {$R-}
        for x := 0 to ptgGroups.GroupCount - 1 do
          if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
          begin
            Result := True;
            Break;
          end;
        {$R+}
      end;
    end;
  finally
    if bSuccess then
      CloseHandle(hAccessToken);
    if Assigned(ptgGroups) then
      FreeMem(ptgGroups);
    if Assigned(psidAdministrators) then
      FreeSid(psidAdministrators);
  end;
end;
Der Code ist aus der JCL wenn mich nicht alles täuscht und so sieht das unter .NET aus

in die USES muss folgendes Aufgenommen werden:
System.Security.Principal;

und die Funktion schrumpft auf:
Delphi-Quellcode:
function IsAdmin : boolean;
begin
Result := WindowsPrincipal.Create(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator);
end;
So eine Lösung suche ich halt für die Storie mit der OleDB Provider Liste.

Gruß
caustic

caustic 9. Jan 2006 08:02

Re: ADOConnection und GetProviderNames
 
Das Problemchen ist gelöst, es lässt sich aber nicht so trivial wie die Geschichte mit dem ISAdmin lösen...
Es gibt unter .NET keinen Befehl oder keine Befehlskette, die die OleDBProvider Listet.
MfG
caustic

caustic 12. Jan 2006 12:50

Re: ADOConnection und GetProviderNames
 
http://www.pat-software.de/images/OleDBDemo.gif

So sollte es aussehen... :zwinker:

Wenn jemand daran interesse hat, no problem, einfach Anfragen.

Gruß
caustic

Elvis 12. Jan 2006 16:25

Re: ADOConnection und GetProviderNames
 
Lass mich raten... Du nimmst das hier? ;)

Verbeiß dich nicht zu fest auf den OleDb Provider, er könnte sehr bald aus der FCL fliegen...
(Ist schon jetzt eher stiefmütterlich implementiert worden)

caustic 12. Jan 2006 17:29

Re: ADOConnection und GetProviderNames
 
Nein, denn ich frage ab, welche Treiber überhaupt auf dem Rechner sind.
Dafür gibt es in deutschen Foren im Moment überhaupt keine Hinweise wie es denn tatsächlich geht.
In einem Englischsprachigem habe ich zumindest einen Hinweis bekommen.
Wobei so wild ist es nicht, aber es ist Arbeit.

Welche Schnittstelle zu Datenbanken würdest Du denn vorziehen.

Mich hat dieser Artikel dazu bewogen die Methode über die OleDBProvider zu gehen:

Auswirkung des Providers auf die Datenbank Performance

Gruß
caustic


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz