簡體   English   中英

PowerBI API 克隆報告和數據集更改數據源

[英]PowerBI API Clone Report and Dataset changing the datasource

我正在使用 PoweBI 客戶端在 .NET6 中開發一個應用程序來管理工作區、報告、數據集等。

這個想法是應用程序將能夠創建客戶端工作區,並將從主工作區繼承報告和數據集。 在主工作區中,將有從 PowerBI 桌面發布的報告,因此相應的數據集也將在那里。

在克隆數據源數據庫時,應相應更改用戶和密碼以匹配工作區客戶上下文。 使用以下代碼,我可以在主工作區 (workspace_from_id) 上列出報告,並且可以在客戶工作區 (workspace_towa_id) 上創建它們

var reports_from = pbiClient.Reports.GetReports(workspace_from_id);
foreach (Report report_from in reports_from.Value)
{
    Guid report_from_id = report_from.Id;
    CloneReportRequest cloneReportRequest = new();
    cloneReportRequest.TargetWorkspaceId = workspace_towa_id;
    cloneReportRequest.TargetModelId = dataset_towa.Id;
    cloneReportRequest.Name = report_from.Name;
    Report report_towa = pbiClient.Reports.CloneReport(workspace_from_id, report_from_id, cloneReportRequest);
}

上面代碼的問題是數據集沒有被克隆,源數據集被用作兩個工作區的共享數據集。 我已經嘗試復制數據集詳細信息並使用以下代碼創建一個具有不同數據庫的新數據集:

CreateDatasetRequest createDatasetRequest = new();
createDatasetRequest.Name = dataset_from.Name;
createDatasetRequest.Datasources = new List<Datasource>();
createDatasetRequest.Tables = new List<Table>();

Datasources datasources_from = pbiClient.Datasets.GetDatasources(workspace_from_id, dataset_from_id);
foreach (Datasource datasource_from in datasources_from.Value)
{
    //FOREACH DATASOURCE IN DATASET
    Datasource datasource_towa = new ();
    datasource_towa.Name = datasource_from.Name;
    datasource_towa.DatasourceType = datasource_from.DatasourceType;
    //CHANGE DATASOURCE CONNECTION DETAILS
    DatasourceConnectionDetails datasourceConnectiondetails = datasource_from.ConnectionDetails;
    datasourceConnectiondetails.Database = $"{Variables.reporting_db}_{group_towa.Name.ToLower()}";
    datasource_towa.ConnectionDetails = datasourceConnectiondetails;
    datasource_towa.ConnectionString = datasource_from.ConnectionString;
    datasource_towa.GatewayId = datasource_from.GatewayId;
    //ADD DATASOURCE INTO DATASET
    createDatasetRequest.Datasources.Add(datasource_towa);
}

Tables tables_from = pbiClient.Datasets.GetTables(workspace_from_id, dataset_from_id); //WORKS FOR PUSH DATASET
foreach (Table table_from in tables_from.Value)
{
    //FOREACH TABLE IN DATASET
    Table table_towa = new ();
    table_towa.Name = table_from.Name;
    table_towa.Source = table_from.Source;
    table_towa.Columns = table_from.Columns;
    table_towa.Rows = table_from.Rows;
    table_towa.Description = table_from.Description;
    //ADD TABLE INTO DATASET
    createDatasetRequest.Tables.Add(table_from);
}

上述代碼的問題是 pbiClient.Datasets.GetTables function 不適用於普通數據集,但僅用於推送數據集。 最后,由於無法獲取表,以下代碼失敗了:

var dataset_towa = pbiClient.Datasets.PostDataset(workspace_towa_id, createDatasetRequest);

最后發現 pbiClient.Datasets.PostDataset 方法也用於發布推送數據集,如下所述: https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post -數據集

=======更新 13/01/2023=======

已經嘗試了一些其他方法來克隆報告和數據集,例如創建數據源,但為此我們需要一個數據網關。 在那種情況下,當報告已經像 Azure 到 PostgreSQL 的雲中時,我們確實需要一個網關。 另一方面,我嘗試創建一個虛擬網關以便將數據源創建到該網關中,但是 =虛擬網關不受 PowerBI Api 支持,並且僅在高級容量中受支持。

所以似乎我無法將報告與數據集一起克隆並更改數據源。

有任何想法嗎?

經過大量研究,我設法從主工作區下載報告,並通過更改數據源詳細信息將它們上傳到客戶工作區。

執行步驟:

  1. 導出報告用 PowerBI API /導出為 stream 到 memory
  2. 使用 PowerBI API 導入報告/從 memory 導入為 stream(需要特殊處理以確保您從 HTTP 讀取整個 stream 內容/使用 8 不工作)
  3. 使用 PowerBI Client SDK /pbiClient.Datasets.UpdateDatasourcesInGroup 更新報告 ConnectionDetails(需要特殊處理以僅更改服務器和數據庫屬性而不放置新的對象實例)
  4. 使用 PowerBI Client SDK /pbiClient.Gateways.UpdateDatasource 更新數據集的數據源(需要特殊對待以將憑據作為 JSON)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM