如何获取已安装的OLE DB提供程序列表?

时间:2016-06-16 03:11:34

标签: excel ms-office oledb

Microsoft Excel允许从“其他来源”导入数据。其中一个选项是使用OLE DB提供程序。

如何获取可用的OLE DB提供程序列表?

7 个答案:

答案 0 :(得分:21)

如果您有PowerShell可用,只需将其粘贴到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
}

积分和更高级用法: http://dbadailystuff.com/list-all-ole-db-providers-in-powershell

答案 1 :(得分:10)

我正在回答我自己的问题,因为我很难找到我的期望。 Google-fu 只能回答我的部分问题;我需要从各种博客条目和官方文档中综合信息。

以下是VBScript,您可以复制/粘贴到文本文件中并在Windows上运行。您无需本地管理员权限即可运行此版本。

根据注册表的大小和CPU的速度,最多可能需要一分钟才能运行。结果是一个带有文本的消息框,可以使用Ctrl+C将其复制到剪贴板。

主要参考: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

答案 2 :(得分:6)

使用PowerShell的另一种解决方案,这次利用.NET代码(贷记jrich523.wordpress.com)。

将其插入PowerShell控制台:

(New-Object system.data.oledb.oledbenumerator).GetElements()

产生这样的输出:

SOURCES_NAME        : SQLOLEDB Enumerator
SOURCES_PARSENAME   : {DFA22B8E-E68D-11d0-97E4-00C04FC2AD98}
SOURCES_DESCRIPTION : Microsoft OLE DB Enumerator for SQL Server
SOURCES_TYPE        : 2
SOURCES_ISPARENT    : False
SOURCES_CLSID       : {DFA22B8E-E68D-11d0-97E4-00C04FC2AD98}

答案 3 :(得分:2)

OLEDB提供了一个为您枚举所有OLE DB提供程序的类。

Microsoft OLE DB Root Enumerator

  • ProgID :“ MSDAENUM”
  • clsid {c8b522d0-5cf3-11ce-ade5-00aa0044773d}
  • CLSID_OLEDB_ENUMERATOR (来自sdk中的 msdaguid.h

不幸的是,您无法通过ADO访问它(ADO是OLE DB的友好包装,并且MSDAENUM类不支持ADO需要OLEDB提供程序支持的某些接口)。这意味着您别无选择,只能与它交谈,并且直接IRowset

而OLE DB api是...无情的。

答案 4 :(得分:2)

我遇到一个问题,其中Steinar Herland的powershell脚本找不到我的oledb提供程序。我写了一个小C#程序,但是确实做到了。

    using System.Data.OleDb;    
    var oleEnum = new OleDbEnumerator();
    var elems = oleEnum.GetElements();
    if (elems != null && elems.Rows != null)
       foreach (System.Data.DataRow row in elems.Rows)
          if (!row.IsNull("SOURCES_NAME") && row["SOURCES_NAME"] is string)
             Console.WriteLine(row["SOURCES_NAME"]);

答案 5 :(得分:1)

如果您安装了 MS Excel,为什么还要通过所有这些脚本/powershell 的所有麻烦?您可以使用 Excel 从其他源导入数据,它将显示所有已安装的 OLEDB 数据源。

Excel Import Data Wizard

答案 6 :(得分:1)

在 Windows 资源管理器中:

  1. 在任何地方创建一个文本文件。例如临时文件。
  2. 将扩展名更改为“udl”。例如。温度.udl。
  3. 双击 temp.udl。
  4. 转到 [提供者] 选项卡。观察“OLE
  5. ”列表