web-dev-qa-db-fra.com

Comment obtenir une liste des fournisseurs de base de données OLE installés?

Microsoft Excel permet l'importation de données à partir d '"autres sources". L'une des options consiste à utiliser un fournisseur de base de données OLE DB.

Comment obtenir une liste des fournisseurs de base de données OLE DB disponibles?

22
kevinarpe

Si vous avez PowerShell disponible, collez-le simplement dans une invite de commande PowerShell:

foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator())
{
    $v = New-Object PSObject        
    for ($i = 0; $i -lt $provider.FieldCount; $i++) 
    {
        Add-Member -in $v NoteProperty $provider.GetName($i) $provider.GetValue($i)
    }
    $v
}

Crédits et utilisation plus avancée: http://dbadailystuff.com/list-all-ole-db-providers-in-powershell

37
Steinar Herland

Je réponds à ma propre question car il était plus difficile de trouver ce à quoi je m'attendais. Google-fu n'a pu répondre qu'à une partie de ma question; J'avais besoin de synthétiser des informations à partir de diverses entrées de blog et de la documentation officielle.

Ci-dessous se trouve VBScript que vous pouvez copier/coller dans un fichier texte et exécuter sous Windows. Vous n'avez pas besoin des droits d'administrateur local pour exécuter cette version.

Selon la taille de votre registre et la vitesse de votre processeur, l'exécution peut prendre jusqu'à une minute. Le résultat est une boîte de message avec du texte qui peut être copié dans le presse-papiers avec Ctrl+C.

Référence principale: https://sysmod.wordpress.com/2014/07/11/vbscript-to-list-installed-oledb-providers/

'List of installed OLEDB providers on local computer
Option Explicit
Const HKEY_CLASSES_ROOT     = &H80000000
Const HKEY_CURRENT_USER     = &H80000001
Const HKEY_LOCAL_MACHINE    = &H80000002
Const HKEY_USERS        = &H80000003
Const HKEY_CURRENT_CONFIG   = &H80000005

Dim OutText, strComputer, objRegistry
Dim num
Dim ProgIdDict

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
OutText = "Note: Strike Ctrl+C to copy full text to clipboard"
Num = 1
Set ProgIdDict = CreateObject("Scripting.Dictionary")

' I discovered these registrations can appear in three different places.
' Use ProgIdDict to prevent dupes in the output
Append objRegistry, HKEY_CLASSES_ROOT, "HKEY_CLASSES_ROOT", "CLSID", ProgIdDict, Num, OutText
Append objRegistry, HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Classes\CLSID", ProgIdDict, Num, OutText
Append objRegistry, HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Classes\Wow6432Node\CLSID", ProgIdDict, Num, OutText

Sub Append(ByVal objRegistry, ByVal HKEYConstant, ByVal HKEYConstantStr, ByVal KeyPrefixStr, ByVal ProgIdDict, ByRef Num, ByRef OutText)

    Dim Key, arrKeys
    Dim strKeyPath, strValue, uValue

    objRegistry.enumKey HKEYConstant, KeyPrefixStr, arrKeys

    for each key in arrKeys

        strKeyPath = KeyPrefixStr & "\" & key

        ' if key exists...
        ' I noticed something weird where non-MSOLAP entries use the first style,
        ' and MSOLAP entries use the second style.
        If 0 = objRegistry.GetDWordValue(HKEYConstant, strKeyPath, "OLEDB_SERVICES", uValue) _
        Or 0 = objRegistry.GetDWordValue(HKEYConstant, strKeyPath & "\OLEDB_SERVICES", "", uValue) _
        Then
            objRegistry.GetStringValue HKEYConstant,strKeyPath & "\ProgID","",strValue
            If Not ProgIdDict.Exists(strValue) _
            Then
                ProgIdDict.Add strValue, strValue
                OutText=OutText & vbcrlf & vbcrlf
                'get the (Default) value which is the name of the provider
                objRegistry.GetStringValue HKEYConstant,strKeyPath,"",strValue
                OutText=OutText & num & ") " & strValue & vbcrlf & "Key: \\" & HKEYConstantStr & "\" & KeyPrefixStr & "\" & key
                ' and the expanded description
                objRegistry.GetStringValue HKEYConstant,strKeyPath & "\OLE DB Provider","",strValue
                OutText=OutText & vbcrlf & "OLE DB Provider: " & strValue
                objRegistry.GetStringValue HKEYConstant,strKeyPath & "\ProgID","",strValue
                OutText=OutText & vbcrlf & "ProgID: " & strValue
                objRegistry.GetStringValue HKEYConstant,strKeyPath & "\VersionIndependentProgID","",strValue
                OutText=OutText & vbcrlf & "VersionIndependentProgID: " & strValue
                num = 1 + num
            End If
        end if
    next

End Sub

Wscript.Echo OutText
13
kevinarpe

OLEDB fournit une classe qui énumère tous les fournisseurs de base de données OLE DB).

Microsoft OLE DB Root Enumerator????

  • ProgID : "MSDAENUM"
  • clsid : {c8b522d0-5cf3-11ce-ade5-00aa0044773d}
  • CLSID_OLEDB_ENUMERATOR (à partir de msdaguid.h dans le sdk)

Malheureusement, vous ne pouvez pas y accéder via ADO (ADO est un wrapper convivial autour de OLE DB, et la classe MSDAENUM ne prend pas en charge certaines interfaces qui ADO nécessite la prise en charge du fournisseur OLEDB. Cela signifie que vous n'auriez pas d'autre choix que de lui parler, et c'est IRowset directement.

Et le OLE api DB est ... impitoyable.

2
Ian Boyd