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
vonDataSourceReference
- 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:
Öffnen Sie die benutzerdefinierte Connector-Datei (.pq) in einem Text-Editor Ihrer Wahl.
Suchen Sie die Funktion
TestConnection
. Die FunktionTestConnection
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 eineTestConnection
-Implementierung, und vergewissern Sie sich, dass die Parameter mit der Datenquellenfunktion des Connectors übereinstimmen. Weitere Informationen: Umgang mit der GatewayunterstützungWenn der Connector OAuth verwendet, überprüfen Sie den Parameter
state
. Eine häufige Ursache für dienstgeschützte Fehler ist ein fehlenderstate
Parameter in der Implementierung desStartLogin
Connectors. Dieser Parameter wird nicht in Power BI Desktop verwendet, ist aber im Power BI-Dienst erforderlich. Der Parameterstate
muss an den Aufruf von Uri.BuildQueryString übergeben werden. Im folgenden Beispiel wird die korrekte Implementierung vonstate
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.