从 Power BI 工作区集合中迁移内容的代码片段
本文提供一些内容迁移所需的基本操作代码片段。 有关特定报表类型的相关流,请参阅如何将 Power BI Embedded 工作区集合内容迁移到 Power BI。
可使用“迁移工具”将内容从 Power BI 工作区集合复制到 Power BI Embedded。 尤其是有大量内容时。 有关详细信息,请参阅 Power BI Embedded 迁移工具。
以下代码是使用 C# 和Power BI.NET SDK 的示例。
请确保使用下面的命名空间来执行以下代码片段。
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.PowerBI.Api.V1;
using Microsoft.PowerBI.Api.V1.Models;
using Microsoft.PowerBI.Api.V2;
using Microsoft.PowerBI.Api.V2.Models;
using Microsoft.Rest;
using Microsoft.Rest.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
从 Power BI 工作区集合工作区导出报表
// Create a token credentials with "AppKey" type
var credentials = new TokenCredentials(<myAppKey==>, "AppKey");
// Instantiate your Power BI client passing in the required credentials
var client = new PowerBIClient(credentials);
client.BaseUri = new Uri("https://api.powerbi.cn");
var response = client.Reports.ExportReportWithHttpMessagesAsync(<myWorkspaceCollectionName>, <myWorkspaceId>, <myReportId>);
if (response.Result.Response.StatusCode == HttpStatusCode.OK)
{
var stream = response.Result.Response.Content.ReadAsStreamAsync();
using (FileStream fileStream = File.Create(@"C:\Migration\myfile.pbix"))
{
stream.Result.CopyTo(fileStream);
fileStream.Close();
}
}
将报表导入 Power BI Embedded
AuthenticationContext authContext = new AuthenticationContext("https://login.chinacloudapi.cn/common/oauth2/authorize");
var PBISaaSAuthResult = authContext.AcquireToken("https://analysis.chinacloudapi.cn/powerbi/api", <myClientId>, new Uri("urn:ietf:wg:oauth:2.0:oob"), PromptBehavior.Always);
var credentials = new TokenCredentials(PBISaaSAuthResult.AccessToken);
var client = new PowerBIClient(new Uri($"{"https://api.powerbi.cn"}"), credentials);
using (var file = File.Open(@"C:\Migration\myfile.pbix", FileMode.Open))
{
client.Imports.PostImportWithFileInGroup(<mySaaSWorkspaceId>, file, "importedreport", "Abort");
while (true) ;
}
从 Power BI 工作区集合中提取 DirectQuery 连接字符串
这是为了在迁移到 Power BI Embedded 后更新 PBIX。
// Extract connection string from PaaS - DirectQuery report
// Create a token credentials with "AppKey" type
var credentials = new TokenCredentials(<myAppKey==>, "AppKey");
// Instantiate your Power BI client passing in the required credentials
var client = new PowerBIClient(credentials);
client.BaseUri = new Uri("https://api.powerbi.cn");
var reports = client.Reports.GetReports(<myWorkspaceCollectionName>, <myWorkspaceId>);
Report report = reports.Value.FirstOrDefault(r => string.Equals(r.Id, <myReportId, StringComparison.OrdinalIgnoreCase));
var datasource = client.Datasets.GetDatasources(<myWorkspaceCollectionName>, <myWorkspaceId>, report.DatasetId);
在 Power BI Embedded 中更新 DirectQuery 连接字符串
public class ConnectionString
{
[JsonProperty(PropertyName = "connectionString")]
public string connection { get; set; }
}
AuthenticationContext authContext = new AuthenticationContext("https://login.chinacloudapi.cn/common/oauth2/authorize");
var PBISaaSAuthResult = authContext.AcquireToken("https://analysis.chinacloudapi.cn/powerbi/api",<myclient_id>, new Uri("urn:ietf:wg:oauth:2.0:oob"), PromptBehavior.Always);
var credentials = new TokenCredentials(PBISaaSAuthResult.AccessToken);
var client = new PowerBIClient(new Uri($"{"https://api.powerbi.cn"}"), credentials);
ConnectionString connection = new ConnectionString() { connection = "data source = <server_name>; initial catalog = <db_name>; persist security info = True; encrypt = True; trustservercertificate = False" };
client.Datasets.SetAllConnectionsInGroup(<myWorkspaceId>, <dataset_id>, connection);
在 Power BI Embedded 中设置 DirectQuery 凭据
为简单起见,我们将在此代码段中使用未加密的凭据,同时也支持发送加密的凭据。
public class ConnectionString
{
[JsonProperty(PropertyName = "connectionString")]
public string connection { get; set; }
}
public class BasicCreds
{
[JsonProperty(PropertyName = "username")]
public string user { get; set; }
[JsonProperty(PropertyName = "password")]
public string pwd { get; set; }
}
var basicCreds = new BasicCreds() { user = <sqldb_username>, pwd = <sqldb_password> };
var body = new SetCredsRequestBody() { credentialType = "Basic", basicCreds = basicCreds };
var url = string.Format("https://api.powerbi.cn/v1.0/myorg/gateways/{0}/datasources/{1}", <gateway_id>, <datasource_id>);
var request = new HttpRequestMessage(new HttpMethod("PATCH"), url);
// Set authorization header from you acquired Azure AD token
AuthenticationContext authContext = new AuthenticationContext("https://login.chinacloudapi.cn/common/oauth2/authorize");
var PBISaaSAuthResult = authContext.AcquireToken("https://analysis.chinacloudapi.cn/powerbi/api", <myclient_id>, new Uri("urn:ietf:wg:oauth:2.0:oob"), PromptBehavior.Always);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", PBISaaSAuthResult.AccessToken);
request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json");
HttpClient simpleClient = new HttpClient();
var response = await simpleClient.SendAsync(request);
推送数据集和报表
需要重新为已创建的数据集生成报表。
在此代码段中,我们假设可推送的数据集已处于 Power BI 内的应用工作区中。 有关推送 API 的信息,请参阅将数据推送到 Power BI 数据集。
var credentials = new TokenCredentials(<Your WSC access key>, "AppKey");
// Instantiate your Power BI client passing in the required credentials
var client = new Microsoft.PowerBI.Api.V1.PowerBIClient(credentials);
client.BaseUri = new Uri("https://api.powerbi.cn");
// step 1 -> create dummy dataset at PaaS worksapce
var fileStream = File.OpenRead(<Path to your dummy dataset>);
var import = client.Imports.PostImportWithFileAsync(<Your WSC NAME>, <Your workspace ID>, fileStream, "dummyDataset");
while (import.Result.ImportState != "Succeeded" && import.Result.ImportState != "Failed")
{
import = client.Imports.GetImportByIdAsync(<Your WSC NAME>, <Your workspace ID>, import.Result.Id);
Thread.Sleep(1000);
}
var dummyDatasetID = import.Result.Datasets[0].Id;
// step 2 -> clone the pushable dataset and rebind to dummy dataset
var cloneInfo = new Microsoft.PowerBI.Api.V1.Models.CloneReportRequest("pushableReportClone",null, dummyDatasetID);
var clone = client.Reports.CloneReportAsync(<Your WSC NAME>, <Your workspace ID>, <Your pushable report ID>, cloneInfo);
var pushableReportCloneID = clone.Result.Id;
// step 3 -> Download the push API clone report with the dummy dataset
var response = client.Reports.ExportReportWithHttpMessagesAsync(<Your WSC NAME>, <Your workspace ID>, pushableReportCloneID);
if (response.Result.Response.StatusCode == HttpStatusCode.OK)
{
var stream = response.Result.Response.Content.ReadAsStreamAsync();
using (fileStream = File.Create(@"C:\Migration\PushAPIReport.pbix"))
{
stream.Result.CopyTo(fileStream);
fileStream.Close();
}
}
// step 4 -> Upload dummy PBIX to Power BI Embedded
AuthenticationContext authContext = new AuthenticationContext("https://login.chinacloudapi.cn/common/oauth2/authorize");
var PBISaaSAuthResult = authContext.AcquireToken("https://analysis.chinacloudapi.cn/powerbi/api", <Your client ID>, new Uri("urn:ietf:wg:oauth:2.0:oob"), PromptBehavior.Always);
var credentialsSaaS = new TokenCredentials(PBISaaSAuthResult.AccessToken);
var clientSaaS = new Microsoft.PowerBI.Api.V2.PowerBIClient(new Uri($"{"https://api.powerbi.cn"}"), credentialsSaaS);
using (var file = File.Open(@"C:\Migration\PushAPIReport.pbix", FileMode.Open))
{
var importSaaS = clientSaaS.Imports.PostImportWithFileAsyncInGroup(<Your GroupID>, file, "importedreport1", "Abort");
while (importSaaS.Result.ImportState != "Succeeded" && importSaaS.Result.ImportState != "Failed")
{
importSaaS = clientSaaS.Imports.GetImportByIdAsync(importSaaS.Result.Id);
Thread.Sleep(1000);
}
var importedreport1ID = importSaaS.Result.Reports[0].Id;
// step 5 -> Rebind report to "real" push api dataset
var rebindInfoSaaS = new Microsoft.PowerBI.Api.V2.Models.RebindReportRequest(<Your pushable dataset ID at power bi>);
var rebindSaaS = clientSaaS.Reports.RebindReportInGroupWithHttpMessagesAsync(<Your GroupID>, importedreport1ID, rebindInfoSaaS);
}
后续步骤
有关迁移过程的信息,请参阅如何将 Power BI 工作区集合内容迁移到 Power BI Embedded。
更多问题? 尝试咨询 Power BI 社区