Häufig gestellte Fragen zur Entwicklung von benutzerdefinierten Konnektoren

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...?

Außerhalb dokumentierter Warnungsmuster bieten wir derzeit keine Möglichkeit, außerbandige Warnungen zurückzugeben, wie etwa bei einer großen Tabelle oder einer Warnung mit großen Metadaten.

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

Es ist möglich, wenn Endbenutzer häufig eine einzelne Partition von Daten abrufen möchten. Diese Funktionalität kann jedoch keinem bereits vorhandenen Connector hinzugefügt werden. Im Wesentlichen würde diese Änderung einen bereits vorhandenen Verbinder unterbrechen.

Problembehandlung

Der benutzerdefinierte Connector, den ich entwickelt habe, funktioniert in Power BI Desktop einwandfrei. Aber wenn ich versuche, sie im Power BI-Dienst auszuführen, kann ich keine Anmeldeinformationen festlegen oder die Datenquelle konfigurieren. Was ist los?

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

  • Fehler beim Aktualisieren von Datenquellenanmeldeinformationen
  • Eine Ausnahme trat auf beim Versuch, OAuthProvider von DataSourceReference abzurufen.
  • Die angegebene Datenquellenart wird nicht unterstützt.

Bevor Sie mit der Problembehandlung dieses Verhaltens beginnen, sammeln 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 den benutzerdefinierten Connector:

  1. Öffnen Sie die benutzerdefinierte Connectordatei (PQ) in einem Text-Editor Ihrer Wahl.

  2. Suchen Sie die Funktion TestConnection. Die TestConnection Funktion 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 Gateway-Unterstützung

  3. Wenn der Connector OAuth verwendet, überprüfen Sie den state Parameter. Eine häufige Ursache für dienstbezogene 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 state Parameter muss an den Aufruf von Uri.BuildQueryString übergeben werden. Das folgende Beispiel veranschaulicht die richtige Implementierung von state.

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 kann möglicherweise ein Nebeneffekt davon sein, wie Sie Ihre Navigationstabelle erstellen. Wenn Sie neue Datensätze mit Table.TransformRows erstellen, führt diese Verwendung in der Regel zu einer eifrigen Auswertung der Datentabellen. Werte, die von Table.AddColumn erzeugt werden, werden jedoch verzögert 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 nach Bedarf lazily. 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 Connectors fallen außerhalb des Microsoft-Supportumfangs und der Expertise. Wenn Sie Hilfe bei der Entwicklung Ihres benutzerdefinierten Connectors benötigen oder Feedback, Vorschläge oder Fehler haben, die Sie melden möchten, besuchen Sie bitte unser offizielles öffentliches Repository auf GitHub, oder wenden Sie sich an Ihren Microsoft-Kontakt, wenn Sie an einem empfohlenen Benutzerdefinierten Connector-Berater von Drittanbietern interessiert sind.