Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Existe-t-il un moyen d'intégrer des rapports et des tableaux de bord Power Bi dans l'application de bureau vb.net ou C # avec la base de données SQL Server 2008?

Oui absolument! Comme @David Browne l'a dit dans sa réponse, il s'agit simplement de charger quelque chose dans un navigateur Web. Généralement, peu importe quelles sont vos sources de données - SQL Server ou fichiers plats, c'est la même chose. Vous pouvez voir à quoi cela ressemble dans Power BI Embedded Playground.

Vous avez deux façons d'intégrer des rapports Power BI (ou des tableaux de bord ou des vignettes, c'est essentiellement la même chose) :

  1. Utilisez Power BI Report Server installé sur site. Pour intégrer un rapport, ajoutez simplement un iframe dans une page Web et définissez sa source sur l'URL du rapport, mais ajoutez ?rs:embed=true à cela. Cependant, Power BI Reporting Server est assez coûteux. Vous avez besoin d'une licence pour SQL Server Enterprise avec Software Assurance ou d'abonnements Power BI Premium. L'avantage dans ce cas pourrait être le fait que les données sont conservées sur site, car dans certains cas, la publication de données dans le cloud peut être interdite ou difficile à certifier et à garantir la confidentialité des données.

  2. Publiez vos rapports sur le service Power BI (c'est-à-dire en ligne sur le site Web de Power BI). L'avantage de ce scénario est son prix. Vous pouvez implémenter des solutions avec un seul compte Power BI Pro, soit 10 $ par mois. L'inconvénient pourrait être que vos données doivent être accessibles pour le service Power BI (c'est-à-dire en dehors de votre réseau interne) et qu'elles sont un peu plus complexes à intégrer.

Lorsque vous intégrez Power BI dans votre application, vous avez le choix entre deux scénarios :l'utilisateur possède les données et l'application possède les données. Avec le premier, chaque utilisateur a besoin de son propre compte Power BI Pro et l'utilise pour voir le rapport intégré. Avec le deuxième scénario, vous n'avez besoin que d'un seul compte Power BI Pro "maître" (il est également possible de l'intégrer en s'authentifiant avec le principal du service, mais restons simples pour l'instant).

Vous n'avez pas mentionné l'application Web ou le bureau de votre application vb.net. Voici une très belle démo sur la manière d'intégrer Power BI dans l'application WPF et voici les exemples officiels de Microsoft sur la façon de procéder dans une application Web.

Je vais vous expliquer plus en détail comment l'intégrer dans une application de bureau, mais avec les applications Web, c'est essentiellement la même chose.

Vous devez d'abord publier votre rapport sur le service Power BI. Il sera préférable d'utiliser un espace de travail dédié pour cela. Assurez-vous que le compte Pro, que vous utiliserez comme compte "maître" dans votre application, dispose des droits pour cet espace de travail. Ce n'est pas une bonne idée d'utiliser votre compte (probablement administrateur), car il a bien plus de privilèges que nécessaire. Vous pouvez, mais si 10 $/mois ne posent pas de problème, dépensez-les pour un compte dédié (ou utilisez le principal du service).

Ensuite, vous devez enregistrer une application. Entrez un nom d'application descriptif, définissez le type d'application sur Application native. Sélectionnez les autorisations qui seront requises pour votre application, c'est-à-dire que si elle ne lit que les données, n'accordez pas d'autorisations "lecture et écriture" à celle-ci. Ou accordez-les tous. C'est ta décision. Enregistrez l'application et copiez le guide que vous obtiendrez. Il s'appelle "identifiant de l'application" ou "identifiant client". Vous en aurez besoin plus tard.

L'étape suivante consiste à authentifier votre application auprès d'Azure AD. Utilisez les bibliothèques d'authentification Azure Active Directory (ADAL) pour cela. Ajoutez ADAL à votre projet (par exemple en utilisant NuGet) et utilisez le code suivant pour acquérir un jeton d'accès (le code est en C #, car je n'ai pas écrit en vb depuis de nombreuses années, mais vous ne devriez avoir aucun problème à le traduire), mais attribuez le guid que vous avez obtenu à clientId et fournissez des valeurs pour masterAccountName et masterAccountPassword :

using Microsoft.IdentityModel.Clients.ActiveDirectory;

private static string redirectUri = "https://login.live.com/oauth20_desktop.srf";
private static string resourceUri = "https://analysis.windows.net/powerbi/api";
private static string authorityUri = "https://login.windows.net/common/oauth2/authorize";
private static string clientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

private static AuthenticationContext authContext = new AuthenticationContext(authorityUri, new TokenCache());

// First check is there token in the cache
try
{
    authenticationResult = authContext.AcquireTokenSilentAsync(resourceUri, clientId).Result;
}
catch (AggregateException ex)
{
    AdalException ex2 = ex.InnerException as AdalException;
    if ((ex2 == null) || (ex2 != null && ex2.ErrorCode != "failed_to_acquire_token_silently"))
    {
        throw new ApplicationException(ex.Message);
    }
}

if (authenticationResult == null)
{
    var uc = new UserPasswordCredential(masterAccountName, masterAccountPassword);
    authenticationResult = authContext.AcquireTokenAsync(resourceUri, clientId, uc).Result;
}

À la fin authenticationResult.AccessToken contiendra le jeton d'accès dont vous aurez besoin. Si vous êtes curieux de savoir ce qu'il contient, rendez-vous sur https://jwt.io/ et collez-le pour le décoder.

Appelez Get Report In Group Power BI REST API pour obtenir embedUrl du rapport . Utilisez un code comme celui-ci (il utilise Newtonsoft.Json), en fournissant le groupId réel (workspaceId), reportId (vous pouvez les obtenir à partir de l'URL de votre rapport, lorsqu'il est affiché dans un navigateur Web) et accessToken :

string powerBIDatasetsApiUrl = $"https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}";

var request = WebRequest.Create(powerBIDatasetsApiUrl) as HttpWebRequest;
request.KeepAlive = true;
request.Method = "GET";
request.ContentLength = 0;
request.ContentType = "application/json";

request.Headers.Add("Authorization", $"Bearer {accessToken}");

using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
{
    using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
    {
        string responseContent = reader.ReadToEnd();
        var responseJson = JsonConvert.DeserializeObject<dynamic>(responseContent);
        return responseJson["embedUrl"];
    }
}

Voici la partie délicate. Vous avez besoin du client Power BI JavaScript pour utiliser l'URL que vous obtenez avec le code ci-dessus. Le moyen le plus simple est d'obtenir ReportLoader.html , ReportLoader.js et powerbi.js à partir de l'exemple WPF ci-dessus. Vous pouvez lire les détails de ces fichiers ici, mais en général le fichier HTML contient un <div> vide , où le rapport sera chargé, et vous appelez le code dans ReportLoader.js , en transmettant certains paramètres (quel rapport, jeton d'accès, type de jeton d'accès, etc.), et il appellera le client JavaScript Power BI pour faire le gros du travail pour vous.

Les paramètres, que vous passerez au code du chargeur, avec un code comme celui-ci :

var parameters = new object[] { embedUrl, accessToken, reportId, "report" /* or "dashboard" or "tile"*/, 0 /* 0 - AAD, 1 - Embed */, string.Empty };
webBrowser.Document.InvokeScript("LoadEmbeddedObject", parameters);

webBrowser est un composant de navigateur Web, dans lequel vous chargez ReportLoader.html . embedUrl et accessToken sont les valeurs que vous avez acquises auparavant, l'ID du rapport, le type d'élément intégré (est-ce un rapport, une vignette ou un tableau de bord), le type de jeton d'accès (est-ce AAD, que nous avons utilisé dans ce cas, ou intégré) et pour l'instant laissez le dernier vide (pour plus de détails à ce sujet, voir Embed Configuration Details). La différence entre AAD et Embed tokens est que les jetons intégrés sont valides pour un élément particulier (par exemple, un rapport), tandis que les jetons AAD peuvent être utilisés pour vous authentifier dans de nombreux appels différents. Cela signifie qu'il est plus sûr d'utiliser des jetons d'intégration, car ils ne peuvent être utilisés que pour intégrer ce rapport particulier et ne peuvent pas être utilisés pour effectuer d'autres appels d'API REST. Gardez à l'esprit que ce jeton d'accès est visible côté client (il se trouve dans le code JavaScript). Si vous souhaitez utiliser des jetons intégrés, utilisez le jeton AAD côté serveur pour appeler GenerateTokenInGroup, mais cela nécessite une capacité dédiée attribuée à cet espace de travail (c'est-à-dire Power BI Premium ou Power BI Embedded) et sans capacité, votre compte Pro a limité nombre de jetons, que vous pouvez utiliser uniquement pour le développement.

Après cela, votre rapport devrait être chargé avec succès dans webBrowser .

Je vous recommanderai également de regarder cette vidéo Utilisation de l'authentification par application uniquement avec Power BI Embedding avec Ted Pattison.