sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2008データベースを使用してvb.netまたはC#デスクトップアプリケーションにPower BIレポートとダッシュボードを埋め込む方法はありますか?

    そのとおり! @David Browneが彼の応答で言ったように、それはWebブラウザに何かをロードするだけの問題です。一般に、データソースが何であるか(SQL Serverまたはフラットファイル)は関係ありません。すべて同じです。 Power BIEmbeddedPlaygroundでどのように表示されるかを確認できます。

    Power BIレポートを埋め込むには2つの方法があります(またはダッシュボードやタイル、基本的に同じです):

    1. オンプレミスにインストールされているPowerBIReportServerを使用します。レポートを埋め込むには、iframeを追加するだけです。 Webページに追加し、そのソースをレポートのURLに設定しますが、?rs:embed=trueを追加します それに。ただし、Power BIReportingServerは非常に高価です。ソフトウェア保証付きのSQLServerEnterpriseのライセンス、またはPowerBIPremiumサブスクリプションが必要です。この場合の利点は、データがオンプレミスに保持されるという事実である可能性があります。これは、クラウドへのデータの公開が許可されていないか、データのプライバシーを証明および保証することが難しい場合があるためです。

    2. レポートをPowerBIサービスに公開します(つまり、Power BI Webサイトにオンラインで公開します)。このシナリオの利点はその価格です。単一のPowerBIProアカウント、つまり月額$10でソリューションを実装できます。欠点は、Power BI Serviceでデータにアクセスできる必要があること(つまり、内部ネットワークの外部)であり、埋め込みが少し複雑になることです。

    Power BIをアプリケーションに組み込む場合、選択できるシナリオは2つあります。ユーザーがデータを所有するシナリオとアプリがデータを所有するシナリオです。最初のアカウントでは、各ユーザーが独自のPower BI Proアカウントを必要とし、それを使用して埋め込まれたレポートを表示します。 2番目のシナリオでは、必要な「マスター」Power BI Proアカウントは1つだけです(サービスプリンシパルで認証を組み込むこともできますが、今はシンプルにしましょう)。

    あなたが言及しなかったのは、vb.netアプリケーションのWebアプリまたはデスクトップです。これは、Power BIをWPFアプリケーションに埋め込む方法の非常に優れたデモです。これは、Webアプリでこれを行う方法のMicrosoftの公式サンプルです。

    デスクトップアプリケーションに埋め込む方法について詳しく説明しますが、Webアプリでも基本的に同じです。

    まず、レポートをPowerBIServiceに公開する必要があります。このために専用のワークスペースを使用することをお勧めします。アプリで「マスター」アカウントとして使用するProアカウントに、このワークスペースに対する権限があることを確認してください。必要以上の特権を持っているため、(おそらく管理者の)アカウントを使用することはお勧めできません。可能ですが、月額$ 10が問題にならない場合は、専用アカウントに使用します(またはサービスプリンシパルを使用します)。

    次に、アプリケーションを登録する必要があります。わかりやすいアプリ名を入力し、アプリケーションの種類をネイティブアプリに設定します。アプリケーションに必要な権限を選択します。つまり、データの読み取りのみを行う場合は、「読み取りと書き込み」の権限を付与しないでください。またはそれらすべてを付与します。あなたが決めることです。アプリケーションを登録し、取得するGUIDをコピーします。これは「アプリID」または「クライアントID」と呼ばれます。後で必要になります。

    次のステップは、AzureADに対してアプリを認証することです。これには、Azure Active Directory認証ライブラリ(ADAL)を使用します。プロジェクトにADALを追加し(たとえば、NuGetを使用)、次のコードを使用してアクセストークンを取得します(コードはC#であり、長年vbで記述していなかったためですが、翻訳に問題はありません)。 clientIdに到達したGUID masterAccountNameの値を指定します および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;
    }
    

    最後にauthenticationResult.AccessToken 必要なアクセストークンが含まれます。内部に何が含まれているのか知りたい場合は、https://jwt.io/にアクセスして貼り付け、デコードしてください。

    Get Report In Group Power BI REST APIを呼び出して、レポートのembedUrlを取得します 。このようなコードを使用して(Newtonsoft.Jsonを使用)、実際のgroupIdを提供します (workspaceId)、reportId (Webブラウザに表示される場合はレポートのURLから取得できます)および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"];
        }
    }
    

    ここに注意が必要な部分があります。上記のコードで取得したURLを使用するには、PowerBIJavaScriptクライアントが必要です。最も簡単な方法は、ReportLoader.htmlを取得することです。 、ReportLoader.js およびpowerbi.js 上記のWPFサンプルから。これらのファイルの詳細はここで読むことができますが、通常、HTMLファイルには空の<div>が含まれています 、レポートが読み込まれる場所で、ReportLoader.jsのコードを呼び出します。 、いくつかのパラメーター(レポート、アクセストークン、アクセストークンタイプなど)を渡すと、PowerBIJavaScriptクライアントが呼び出されて手間のかかる作業が行われます。

    次のようなコードでローダーコードに渡すパラメータ:

    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 は、ReportLoader.htmlをロードするWebブラウザコンポーネントです。 。 embedUrl およびaccessToken 以前に取得した値、レポートのID、埋め込み要素タイプ(レポート、タイル、ダッシュボード)、アクセストークンタイプ(この場合はAAD、この場合は埋め込み)、そして今のところそのままにします最後の1つは空です(詳細については、「構成の詳細の埋め込み」を参照してください)。 AADの違い およびEmbed トークンとは、埋め込みトークンが特定の要素(レポートなど)に対して有効であるのに対し、AADトークンはさまざまな呼び出しで自分自身を認証するために使用できることです。これは、埋め込みトークンを使用する方が安全であることを意味します。これは、埋め込みトークンはこの特定のレポートの埋め込みにのみ使用でき、他のRESTAPI呼び出しの実行には使用できないためです。このアクセストークンはクライアント側で表示されることに注意してください(JavaScriptコード内にあります)。埋め込みトークンを使用する場合は、サーバー側でAADトークンを使用してGenerateTokenInGroupを呼び出しますが、これには、このワークスペースに割り当てられた専用の容量(PowerBIPremiumまたはPowerBIEmbedded)が必要であり、容量がない場合、Proアカウントの制限があります。開発にのみ使用できるトークンの数。

    その後、レポートがwebBrowserに正常に読み込まれるはずです。 。

    また、このビデオを視聴することをお勧めします。TedPattisonを使用したPowerBI埋め込みでのアプリのみの認証の使用。



    1. 高可用性のためにPostgreSQLを使用してTeamcityをデプロイする方法

    2. Oracle:UPSERTの方法(更新するか、テーブルに挿入しますか?)

    3. レコードが存在するかどうかを判断する最速の方法

    4. postgresでシングルユーザーモードでテーブルを作成する