Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
This article gives you some code snippets of basic operations needed for content migration. For related flows for certain report types, see How to migrate Power BI Embedded workspace collection content to Power BI.
A migration tool is available for you to use in order to assist with copying content from Power BI Workspace Collections to Power BI Embedded. Especially if you have a lot of content. For more information, see Power BI Embedded migration tool.
The code below are examples using C# and the Power BI .NET SDK.
Make sure you are using the following namespaces to execute the code snippets below.
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;
// 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();
}
}
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) ;
}
This is for updating the PBIX after migrating to Power BI Embedded.
// 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);
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);
In this snippet, we are using unencrypted credentials for simplicity, sending encrypted credentials is supported as well.
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);
You will need to rebuild the report for the created dataset.
In this snippet, we assume that the pushable dataset is already in an app workspace within Power BI. For information about the push API, see Push data into a Power BI dataset.
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);
}
For information on the migration process, see How to migrate Power BI Workspace Collection content to Power BI Embedded.
More questions? Try asking the Power BI Community