Freigeben über


Häufig gestellte Fragen zu benutzerdefinierten Connectors

Im Folgenden finden Sie einige Antworten auf häufig gestellte Fragen, die beim Entwickeln von benutzerdefinierten Power Query-Connectors auftreten können.

Allgemein

Ist es möglich, eine Warnung anzuzeigen, wenn ...?

Abgesehen von dokumentierten Warnmustern bieten wir derzeit keine Möglichkeit, Out-of-Band-Warnungen zurückzugeben, z. B. eine Warnung zu einer großen Tabelle oder zu großen Metadaten.

Ist es möglich, Tabellenpartitionsinformationen durch Hinzufügen einer weiteren Ebene zur Navigationshierarchie anzuzeigen und Benutzern die Auswahl einer oder mehrerer Partitionen zu ermöglichen?

Dies ist möglich, wenn Endbenutzer häufig eine einzelne Datenpartition abrufen möchten. Diese Funktionalität kann jedoch keinem bereits vorhandenen Connector hinzugefügt werden. Im Wesentlichen würde diese Änderung einen bereits vorhandenen Connector beschädigen.

Problembehandlung

Der benutzerdefinierte Connector, den ich entwickelt habe, funktioniert in Power BI Desktop einwandfrei. Aber wenn ich versuche, ihn im Power BI-Dienst auszuführen, kann ich keine Anmeldeinformationen festlegen oder die Datenquelle konfigurieren. Wo liegt der Fehler?

Es kann mehrere Gründe geben, warum Sie dieses Verhalten beobachten. Einige häufige Fehler, die beim Ausführen des Connectors im Power BI-Dienst auftreten können, sind:

  • Fehler beim Aktualisieren der Anmeldeinformationen für die Datenquelle
  • Ausnahme beim Abrufen OAuthProvider von DataSourceReference
  • Die angegebene Datenquellenart wird nicht unterstützt.

Bevor Sie mit der Problembehandlung dieses Verhaltens beginnen, erstellen Sie zuerst eine Kopie des benutzerdefinierten Connectors (.pq- oder .mez-Datei). Wenn Sie über eine .mez-Datei verfügen, benennen Sie die Datei in .zip um, und extrahieren Sie die .pq-Datei.

So beheben Sie Probleme mit dem benutzerdefinierten Connector:

  1. Öffnen Sie die benutzerdefinierte Connector-Datei (.pq) in einem Text-Editor Ihrer Wahl.

  2. Suchen Sie die Funktion TestConnection. Die Funktion TestConnection ist für die geplante Aktualisierung im Power BI-Dienst erforderlich, wird jedoch nicht in Power BI Desktop verwendet. Überprüfen Sie die .pq-Datei auf eine TestConnection-Implementierung, und vergewissern Sie sich, dass die Parameter mit der Datenquellenfunktion des Connectors übereinstimmen. Weitere Informationen: Umgang mit der Gatewayunterstützung

  3. Wenn der Connector OAuth verwendet, überprüfen Sie den Parameter state. Eine häufige Ursache für dienstgeschützte Fehler ist ein fehlender state Parameter in der Implementierung des StartLogin Connectors. Dieser Parameter wird nicht in Power BI Desktop verwendet, ist aber im Power BI-Dienst erforderlich. Der Parameter state muss an den Aufruf von Uri.BuildQueryString übergeben werden. Im folgenden Beispiel wird die korrekte Implementierung von state gezeigt.

StartLogin = (resourceUrl, state, display) =>
  let
      authorizeUrl = authorize_uri & "?" & Uri.BuildQueryString([
          response_type = "code",
          client_id = client_id,
          state = state,                 //correct implementation
          redirect_uri = redirect_uri,
          resource = resource
      ])
  in
      [
          LoginUri = authorizeUrl,
          CallbackUri = redirect_uri,
          WindowHeight = 720,
          WindowWidth = 1024,
          Context = null
      ];

Wenn ein Schema oder eine Datenbank im Power Query-Navigator geöffnet wird, wird sofort das Abrufen aller Tabellen unter der Datenbank gestartet, anstatt darauf zu warten, dass eine Tabelle ausgewählt wird. Was verursacht dieses Verhalten?

Dieses Verhalten könnte ein Nebeneffekt der Art und Weise sein, wie Sie Ihre Navigationstabelle erstellen. Wenn Sie neue Datensätze mit Table.TransformRows erstellen, führt diese Verwendung in der Regel zu einer sorgfältigen Auswertung der Datentabellen. Werte, die von Table.AddColumn erzeugt werden, werden jedoch langsam erzeugt. Daher wird im folgenden Beispielcode „each GetSchemas(url, [name])“ nicht ausgewertet, es sei denn, die Benutzerabfrage verweist tatsächlich auf diese Daten.

GetShares = (server_host as text) as table =>
    let
        url =  server_host & "/shares",
        shares = GetItems(url),
        withData = Table.AddColumn(shares, "Data", each GetSchemas(url, [name])),
        withItemKind = Table.AddColumn(withData, "ItemKind", each "Folder"),
        withItemName = Table.AddColumn(withItemKind, "ItemName", each "Folder"),
        withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each false),
        renamed = Table.RenameColumns(withIsLeaf, {{"name", "Name"}, {"key", "Key"}}),
        navTable = Table.ToNavigationTable(renamed, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

Eine einzelne Tabelle kann aus mehreren partitionierten Dateien bestehen. Die aktuelle Implementierung lädt alle Dateien herunter, bevor eine Vorschau angezeigt wird. Gibt es eine Möglichkeit, das Herunterladen aller Dateien zu vermeiden und nur Dateien herunterzuladen, bis genügend Zeilen für die Vorschau vorhanden sind?

Dieses Verhalten ist ein Nebeneffekt der Verwendung von Table.Combine. Eine alternative Methode besteht darin, eine „Tabelle mit Tabellen“ zu erstellen und die Funktion Table.ExpandTableColumn zu verwenden. Diese Methode erweitert Partitionen langsam nach Bedarf. Zum Beispiel:

GetFiles = (tables_url as text, table_name as text) as table =>
    let
        // parse raw ndjson and get the list of parquet files
        // resp format: line 1: protocol, line 2: schema, line 3..:file info
        resp = Lines.FromBinary(SendRequest(tables_url & "/" & table_name & "/query", [
            Headers= [#"Content-Type"="application/json"],
            Content= Text.ToBinary("{}")
        ]), null, null, 1252),
        protocol = resp{0}, // TODO: Add protocol version check
        schema = Json.Document(Json.Document(resp{1})[metaData][schemaString])[fields],
        columnNames = List.Transform(schema, each [name]),

        fileInfos = List.Range(resp, 2),
        fileUrls = List.Transform(fileInfos, each Json.Document(_)[file][url]),
        numFiles = List.Count(fileUrls),

        toTable = Table.FromList(fileUrls, Splitter.SplitByNothing(), {"FileUrl"}),
        processPartition = Table.AddColumn(toTable, "Data", each Parquet.Document(Binary.Buffer(ProtectSensitiveQueryParameters([FileUrl], [ManualCredentials = true])))),
        removeFileUrl = Table.RemoveColumns(processPartition, {"FileUrl"}),
        expanded = Table.ExpandTableColumn(removeFileUrl, "Data", columnNames)
    in
        if numFiles = 0 then #table(columnNames, {}) else expanded;

ProtectSensitiveQueryParameters = (url as text, options as record) =>
    let
        uriParts = Uri.Parts(uri),
        uriWithoutQuery = Uri.FromParts(uriParts & [Query = []]),
        modifiedOptions = options & [
            CredentialQuery = uriParts[Query],
        ]
    in
        Web.Contents(uriWithoutQuery, modifiedOptions);

Weitere Informationen

Hinweis

Probleme bei der Entwicklung von benutzerdefinierten Konnektoren fallen nicht in den Zuständigkeitsbereich des Microsoft-Supports und dessen Fachwissen. Wenn Sie Hilfe beim Entwickeln Ihres benutzerdefinierten Connectors benötigen oder Feedback, Vorschläge oder Fehler haben, die Sie melden möchten, besuchen Sie bitte unsere offizielle öffentliches Repository auf GitHub, oder wenden Sie sich an Ihren Microsoft-Kontakt, wenn Sie einen empfohlenen Berater für die Entwicklung eines benutzerdefinierten Konnektors eines Drittanbieters hinzuziehen möchten.