sql >> Database >  >> RDS >> Sqlserver

Is er een manier om power bi-rapporten en -dashboards in de vb.net- of C#-desktoptoepassing in te sluiten met de SQL Server 2008-database?

Ja absoluut! Zoals @David Browne in zijn reactie zei, is het gewoon een kwestie van iets in een webbrowser laden. Over het algemeen maakt het niet uit wat uw gegevensbronnen zijn - SQL Server of platte bestanden, het is allemaal hetzelfde. U kunt zien hoe het eruit ziet in Power BI Embedded Playground.

Je hebt twee manieren om Power BI-rapporten in te sluiten (of dashboards of tegels, het is in wezen hetzelfde):

  1. Gebruik Power BI Report Server die op locatie is geïnstalleerd. Om een ​​rapport in te sluiten, voegt u gewoon een iframe toe in een webpagina en stel de bron in op de URL van het rapport, maar voeg ?rs:embed=true toe ernaar toe. Power BI Reporting Server is echter vrij duur. Je hebt een licentie nodig voor SQL Server Enterprise met software assurance, of Power BI Premium abonnementen. Voordeel in dit geval zou het feit kunnen zijn dat de gegevens op locatie worden bewaard, omdat in sommige gevallen het publiceren van gegevens naar de cloud niet is toegestaan ​​of moeilijk te certificeren en de gegevensprivacy te garanderen.

  2. Publiceer uw rapporten naar Power BI Service (d.w.z. online naar de Power BI-website). Het voordeel van dit scenario is de prijs. U kunt oplossingen implementeren met één Power BI Pro-account, d.w.z. $ 10 per maand. Het nadeel kan zijn dat uw gegevens toegankelijk moeten zijn voor Power BI Service (d.w.z. buiten uw interne netwerk) en dat het iets ingewikkelder is om in te sluiten.

Wanneer u Power BI in uw toepassing insluit, kunt u uit twee scenario's kiezen:de gebruiker is eigenaar van gegevens en de app is eigenaar van gegevens. Bij de eerste heeft elke gebruiker zijn eigen Power BI Pro-account nodig en gebruikt deze om het ingesloten rapport te bekijken. Bij het tweede scenario heb je maar één "master" Power BI Pro-account nodig (het is ook mogelijk om het verificatie in te sluiten met service-principal, maar laten we het voor nu simpel houden).

Je hebt niet vermeld of je vb.net applicatie web app of desktop is. Hier is een zeer mooie demo om Power BI in te sluiten in de WPF-toepassing en hier zijn officiële voorbeelden van Microsoft hoe u dit in een web-app kunt doen.

Ik zal in meer detail uitleggen hoe je het kunt insluiten in een desktop-applicatie, maar met web-apps is in wezen hetzelfde.

Eerst moet u uw rapport publiceren naar Power BI Service. Het is beter om hiervoor een speciale werkruimte te gebruiken. Zorg ervoor dat het Pro-account, dat u als "master"-account in uw app gaat gebruiken, rechten heeft voor deze werkruimte. Het is geen goed idee om je (waarschijnlijk admin) account te gebruiken, omdat het veel meer privileges heeft dan nodig is. Dat kan, maar als $ 10 per maand geen probleem is, besteed ze dan aan een speciaal account (of gebruik de service-principal).

Dan moet u een aanvraag registreren. Voer een beschrijvende app-naam in, stel het applicatietype in op Native app. Selecteer de machtigingen die vereist zijn voor uw toepassing, d.w.z. als u alleen gegevens wilt lezen, verleen er dan geen "lees- en schrijf"-machtigingen aan. Of gun ze allemaal. Het is jouw beslissing. Registreer de toepassing en kopieer de gids die u krijgt. Het wordt "app-ID" of "client-ID" genoemd. Je hebt het later nodig.

De volgende stap is om uw app te verifiëren tegen Azure AD. Gebruik hiervoor Azure Active Directory Authentication Libraries (ADAL). Voeg ADAL toe aan je progect (bijvoorbeeld met NuGet) en gebruik de volgende code om een ​​toegangstoken te verkrijgen (de code is in C#, omdat ik al jaren niet in vb heb geschreven, maar je zou geen problemen moeten hebben om het te vertalen), maar wijs toe de guid die je hebt gekregen voor clientId en geef waarden op voor masterAccountName en 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;
}

Aan het einde authenticationResult.AccessToken bevat het toegangstoken dat u nodig heeft. Als je benieuwd bent wat erin zit, ga dan naar https://jwt.io/ en plak het om het te laten decoderen.

Bel Get Report In Group Power BI REST API om de embedUrl van het rapport op te halen . Gebruik code zoals deze (het gebruikt Newtonsoft.Json), met de werkelijke groupId (workspaceId), reportId (u kunt ze krijgen van de URL van uw rapport, wanneer het wordt weergegeven in een webbrowser) en 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"];
    }
}

Hier komt het lastige deel. U hebt Power BI JavaScript-client nodig om de url te gebruiken die u met de bovenstaande code krijgt. De gemakkelijkste manier is om ReportLoader.html . te downloaden , ReportLoader.js en powerbi.js uit het bovenstaande WPF-voorbeeld. U kunt hier meer over deze bestanden lezen, maar over het algemeen bevat het HTML-bestand een lege <div> , waar het rapport wordt geladen, en u roept code aan in ReportLoader.js , waarbij enkele parameters worden doorgegeven (welk rapport, toegangstoken, type toegangstoken, enz.), en het zal de Power BI JavaScript-client aanroepen om het zware werk voor u te doen.

De parameters die u aan de ladercode zult doorgeven, met een code zoals deze:

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 is een webbrowsercomponent, waarin u ReportLoader.html . laadt . embedUrl en accessToken zijn de waarden die u eerder hebt verkregen, de ID van het rapport, het type embed-element (is het rapport, tegel of dashboard), het type toegangstoken (is het AAD, dat we in dit geval gebruikten, of embed) en laat het voorlopig achter de laatste leeg (voor meer details hierover zie Configuratiedetails insluiten). Het verschil tussen AAD en Embed tokens is dat embed-tokens geldig zijn voor een bepaald element (bijv. rapport), terwijl AAD-tokens kunnen worden gebruikt om uzelf in veel verschillende oproepen te authenticeren. Dit betekent dat het veiliger is om insluittokens te gebruiken, omdat ze alleen kunnen worden gebruikt om dit specifieke rapport in te sluiten en niet kunnen worden gebruikt om andere REST API-aanroepen uit te voeren. Houd er rekening mee dat dit toegangstoken zichtbaar is aan de clientzijde (het zit in de JavaScript-code). Als u insluittokens wilt gebruiken, gebruik dan het AAD-token aan de serverzijde om GenerateTokenInGroup aan te roepen, maar hiervoor is een speciale capaciteit vereist die aan deze werkruimte is toegewezen (d.w.z. Power BI Premium of Power BI Embedded) en zonder capaciteit heeft uw Pro-account een beperkte aantal tokens, die u alleen voor ontwikkeling kunt gebruiken.

Daarna zou uw rapport succesvol moeten worden geladen in webBrowser .

Ik raad je ook aan om deze video te bekijken. App-only authenticatie gebruiken met Power BI Embedding met Ted Pattison.



  1. Automatiseer databasetestherstel in SQL Server

  2. Ontdek de geschiedenis van SQL-query's

  3. Bekijk mijn presentatie 'Optimaliseren van Microsoft Access met SQL Server'

  4. Tijdstempel converteren met milliseconden tot nu toe in Oracle