关于在 Visio 中连接数据

注意

数据连接功能仅适用于 Microsoft Visio Professional 2013 的授权用户。

Visio 中包括四个方面的数据连接:

  • 连接至数据源

  • 将形状链接至数据

  • 以图形方式显示链接的数据

  • 刷新已在数据源中更改的链接数据,更新链接形状,并解决可能引发的任何后续冲突

通常情况下,是按这些数据连接的列出顺序来对其进行访问的。也就是说,首先将 Visio 绘图连接到某数据源,然后将绘图中的形状链接到数据源中的数据,以图形方式显示链接形状中的数据,并在必要时刷新链接数据。 这些方面中的每一种在 Visio 对象模型中都有新的对象以及与其关联的成员。 本主题将介绍这些方面中的第一种,将 Visio 绘图连接到数据源。 有关其他数据连接的详细信息,请参阅下列主题:

若要以编程方式将 Visio 绘图连接到数据源,可使用 Visio API 进行数据连接,其中包括下列对象及其关联成员:

关于数据记录集和数据连接

每个 Visio Document 对象都具有一个 DataRecordsets 集合,除非连接到数据源,否则后者为空。 若要将 Visio 文档连接到数据源,需要向该文档的 DataRecordsets 集合添加 DataRecordset 对象。 DataRecordset 对象又具有 DataColumns 集合,其中包含许多 DataColumn 对象,每一个都映射到数据源中的对应列(域)。

可连接的数据源包括 Excel 电子表格、Access 和 SQL Server 数据库、SharePoint 列表,以及 Oracle 数据库等其他 OLEDB 或 ODBC 数据源。 当您通过连接其中一种数据源添加 DataRecordset 对象时,Visio 会将 DataConnection 对象中的连接抽象化,这样 DataRecordset 对象就称为处于连接状态。

你也可通过将符合 ADO Classic(ADO 2.x 版)数据记录集 XML 架构的 XML 文件用作数据源来添加 DataRecordset 对象。 这样生成的 DataRecordset 对象就称为处于无连接状态。 数据源与 DataRecordset 对象之间的连接是单向的,即从数据源到 Visio 绘图。 如果源中的数据发生更改,则可刷新绘图中的数据以反映这些更改。 不过,您不能在绘图中更改数据,然后再将这些更改推送回数据源。

添加 DataRecordset 对象

若要向 DataRecordsets 集合添加 DataRecordset 对象,则根据要连接的数据源,以及您希望向方法传入连接字符串和查询命令字符串还是传入包含连接和查询信息的已保存 Office 数据连接 (ODC) 文件,可以使用下列三种方法之一:

下面的 Visual Basic for Applications (VBA) 示例宏展示了可如何使用 Add 方法将 Visio 绘图连接到 Excel 工作表(本例中使用的是 Visio 附带的示例工作簿 ORGDATA.XLS)中的数据:

Public Sub AddDataRecordset()

    Dim strConnection As String
    Dim strCommand As String
    Dim strOfficePath As String
    Dim vsoDataRecordset As Visio.DataRecordset
    strOfficePath = Visio.Application.Path    
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                       & "User ID=Admin;" _
                       & "Data Source=" + strOfficePath + "SAMPLES\1033\ORGDATA.XLS;" _
                       & "Mode=Read;" _
                       & "Extended Properties=""HDR=YES;IMEX=1;MaxScanRows=0;Excel 12.0;"";" _
                       & "Jet OLEDB:Engine Type=34;"
    strCommand = "SELECT * FROM [Sheet1$]"
    Set vsoDataRecordset = ActiveDocument.DataRecordsets.Add(strConnection, strCommand, 0, "Data")

End Sub

注意

如果在非英语的 Visio 版本上运行此代码,则到文件 ORGDATA.XLS 的路径(此处显示为“Samples\1033\ORGDATA.XLS”)将会有所不同。 请在代码中替换为您的 Visio 版本的正确路径。

Add 方法将返回一个 DataRecordset 对象并采用四个参数:

  • ConnectionIDOrString:现有 DataConnection 对象的 ID,或者用于指定新数据源连接的连接字符串。 如果传递当前由一个或多个其他数据记录集使用的现有 DataConnection 对象的 ID,则所有数据记录集都将成为已处理的组记录集。 每当发生数据刷新操作时,都会刷新组中的所有数据记录集。 可采用以下方法确定相应的连接字符串:先使用 Visio 用户界面 (UI) 中的“数据选取器向导”建立相同的连接,在运行该向导时录制宏,然后从宏代码中复制连接字符串。

  • CommandString:一个查询字符串,它用于指定数据库表或 Excel 工作表,并指定表或工作表中包含要查询的数据的域(列)。 在刷新记录集中的数据时,该命令字符串也会传递到 DataRecordset.Refresh 方法。

  • AddOptions:来自 VisDataRecordsetAddOptions 枚举的一个或多个值的组合。 这些值可指定某些数据记录集行为,并且使用户能够阻止在记录集中查询的数据在 Visio UI 中的“外部数据”窗口内显示,或阻止通过用户操作刷新此数据等等。 分配此值后,在 DataRecordset 对象的持续时间内都不能更改它。

  • 名称:一个可选字符串,用于向记录集赋予显示名称。 如果指定记录集中的数据在 Visio UI 中的“外部数据”窗口内显示,则你传递的数据将在与该数据记录集对应的窗口的选项卡中显示。 在此示例中,没有现有的数据连接,因此对于 Add 方法的第一个参数,我们传递了所定义的连接字符串 strConnection。 对于第二个参数,我们传递 strCommand,即我们定义的命令字符串,该字符串指示 Visio 从指定的工作表中选择所有列。 对于 Add 方法的第三个参数,我们传递零以指定数据记录集的默认行为;对于最后一个参数,我们传递“组织数据”,它是我们为数据记录集定义的显示名称。

以下示例代码说明如何获取向 DataRecordsets 集合添加 DataRecordset 对象时创建的 DataConnection 对象。 这段代码通过访问 DataConnection 对象的 ConnectionString 属性,将 DataConnection 对象所关联的连接字符串打印到“即时”窗口中。

Public Sub GetDataConnectionObject(vsoDataRecordset As Visio.DataRecordset) 
 
    Dim vsoDataConnection As DataConnection 
    Set vsoDataConnection = vsoDataRecordset.DataConnection 
    Debug.Print vsoDataConnection.ConnectionString 
 
End Sub

如同可通过访问 DataConnection 对象的 ConnectionString 属性获取其关联的连接字符串一样,您也可通过访问 DataRecordset 对象的 CommandString 属性来获取其关联的命令字符串。 这两个属性都是可指定的,因此您可以在任意时候更改 DataRecordset 对象所关联的数据源或 DataConnection 对象所关联的查询,不过,在您刷新数据之前,这些更改不会反映在绘图中。 有关刷新数据的详细信息,请参阅关于将形状链接到数据

以编程方式访问数据记录集中的数据

当您导入数据时,Visio 将根据原始数据源中的行顺序,为生成的数据记录集中的每个数据行分配从数字 1 开始的整数行 ID。 在数据行链接到形状以及在刷新数据时,Visio 将使用数据行 ID 来跟踪行。 如果您希望以编程方式访问数据行,则必须使用这些数据行 ID。 有关数据刷新操作如何影响行顺序的信息,请参阅关于将形状链接到数据

使用 DataRecordset.GetDataRowIDs 方法获取数据记录集中所有行的 ID 数组,其中每个行都代表一条数据记录。 GetDataRowIDs 方法采用一个条件字符串作为其参数,该字符串遵从 ActiveX 数据对象 (ADO) API 中指定的用于设置 ADO.Filter 属性的准则。 通过指定适当的条件并使用 AND 和 OR 运算符分隔各子句,可以对数据记录集内的信息进行筛选,以便有选择性地只返回某些数据记录集行。 若要不应用筛选器(即获取所有行),则传递一个空字符串 ("") 即可。 有关条件字符串的详细信息,请参阅“ADO 2.x API 参考”中的筛选器属性主题。 在检索数据行 ID 之后,可使用 DataRecordset.GetRowData 方法获取数据行的每一列中存储的所有数据。 有关数据列的详细信息,请参阅关于将形状链接到数据

以下示例代码说明如何使用 GetDataRowIDsGetRowData 方法返回每一行的行 ID,然后获取所传入数据记录集的每一行及每一列中存储的数据。 该示例使用两个嵌套的 For…Next 循环来循环访问记录集内的所有行,然后对每一行循环访问该行中的所有列。 这段代码将在“即时”窗口中显示返回的信息。 请注意,您需要向 GetDataRowIDs 方法传入空字符串,以便不进行筛选,从而获取记录集内的所有行。 在调用该过程后,您会看到所显示的第一组数据(与第一个数据行相对应)包含数据记录集内所有数据列的标题。

Public Sub GetDataRecords(vsoDataRecordset As Visio.DataRecordset)

    Dim lngRowIDs() As Long
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim varRowData As Variant

    'Get the row IDs of all the rows in the recordset
    lngRowIDs = vsoDataRecordset.GetDataRowIDs("")

    'Iterate through all the records in the recordset.
    For lngRow = LBound(lngRowIDs) To UBound(lngRowIDs)
        varRowData = vsoDataRecordset.GetRowData(lngRow)

        'Print a separator between rows
        Debug.Print "------------------------------"

       'Print the data stored in each column of a particular data row.
        For lngColumn = LBound(varRowData) To UBound(varRowData)
            Debug.Print vsoDataRecordset.DataColumns(lngColumn + 1).Name _
               & Trim(Str(lngColumn)) & " = " & VarRowData(lngColumn)
        Next lngColumn
    Next lngRow

End Sub

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。