![]() |
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:
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
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; " OraOLEDB.Oracle.1 " Wie bekomme ich das jetzt ohne VCL hin? :roll: Vielen Dank! Gruß caustic |
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:
Der Code ist aus der JCL wenn mich nicht alles täuscht und so sieht das unter .NET aus
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; in die USES muss folgendes Aufgenommen werden: System.Security.Principal; und die Funktion schrumpft auf:
Delphi-Quellcode:
So eine Lösung suche ich halt für die Storie mit der OleDB Provider Liste.
function IsAdmin : boolean;
begin Result := WindowsPrincipal.Create(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator); end; Gruß caustic |
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 |
Re: ADOConnection und GetProviderNames
![]() So sollte es aussehen... :zwinker: Wenn jemand daran interesse hat, no problem, einfach Anfragen. Gruß caustic |
Re: ADOConnection und GetProviderNames
Lass mich raten... Du nimmst
![]() 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) |
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: ![]() Gruß caustic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz