Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerBI嵌入式V2直接查询-Azure Sql凭据未以编程方式更新_Powerbi_Powerbi Embedded_Powerbi Datasource - Fatal编程技术网

PowerBI嵌入式V2直接查询-Azure Sql凭据未以编程方式更新

PowerBI嵌入式V2直接查询-Azure Sql凭据未以编程方式更新,powerbi,powerbi-embedded,powerbi-datasource,Powerbi,Powerbi Embedded,Powerbi Datasource,我正在通过编程创建一个工作区,并将一个直接查询报告导入PowerBIEmbedded V2。除了未更新的报表数据源凭据之外,其他一切都正常工作 这是导入流的代码: await _powerBIService.ImportPbixAsync(newWorkspaceId, reportNameWithoutExtension, fileStream); Console.WriteLine("Imported report {0

我正在通过编程创建一个工作区,并将一个直接查询报告导入PowerBIEmbedded V2。除了未更新的报表数据源凭据之外,其他一切都正常工作

这是导入流的代码:

await _powerBIService.ImportPbixAsync(newWorkspaceId, reportNameWithoutExtension, fileStream);
                                    Console.WriteLine("Imported report {0} for {1} ({2})", reportNameWithoutExtension, persona.Name, persona.Id);

                                    string datasetId = null;
                                    while (datasetId == null)
                                    {
                                        //get DataSource Id                
                                        Thread.Sleep(5000);
                                        datasetId = await _powerBIService.GetDatasetIdFromWorkspace(newWorkspaceId, reportNameWithoutExtension);
                                    }                                       

                                    //update the connection details
                                    await _powerBIService.UpdateConnectionAsync(newWorkspaceId, datasetId, persona.SQLUser, persona.SQLPassword);
                                    Console.WriteLine("Updated connection details for dataset {0}", reportNameWithoutExtension);

                                    // get gateway ID
                                    var gatewayId = await _powerBIService.GetGatewayIdFromWorkspaceAndDataset(newWorkspaceId, datasetId);
                                    if (gatewayId != null)
                                    {
                                        //update credentials
                                        await _powerBIService.UpdateGatewayDatasourcesCredentials(gatewayId, persona.SQLUser, persona.SQLPassword);
                                        Console.WriteLine("Updated connection details for gateway {0}", reportNameWithoutExtension);
                                    }   
这些是单独的方法:

 public async Task UpdateConnectionAsync(string workspaceId, string datasetId, string sqlUser, string sqlPwd)
    {
        var bearerToken = await GetBearerTokenAsync();
        var tokenCredentials = new TokenCredentials(bearerToken, "Bearer");

        using (var client = new PowerBIClient(new Uri(_pbiApiUrl), tokenCredentials))
        {
            var dataSourcesResponse = await client.Datasets.GetDatasourcesInGroupAsync(workspaceId, datasetId);
            var sqlDataSources = dataSourcesResponse.Value?.Where(s => s.DatasourceType == "Sql")
                                                            .Where(s => !s.ConnectionString.Contains(_reportsSQLServer) || !s.ConnectionString.Contains(_reportsSQLServer));

            foreach (var sqlDataSource in sqlDataSources)
            {
                var updateDataSourceConnectionRequest = new UpdateDatasourceConnectionRequest();
                updateDataSourceConnectionRequest.ConnectionDetails = new DatasourceConnectionDetails(_reportsSQLServer, _reportsSQLDatabase);
                //updateDataSourceConnectionRequest.DatasourceSelector = new Datasource(datasourceId: sqlDataSource.DatasourceId);

                var datasourcesRequest = new UpdateDatasourcesRequest();
                datasourcesRequest.UpdateDetails = new List<UpdateDatasourceConnectionRequest>() { updateDataSourceConnectionRequest };

                var result = await client.Datasets.UpdateDatasourcesInGroupAsync(workspaceId, datasetId, datasourcesRequest);
                //await client.Gateways.UpdateDatasourceAsync()
            }
        }
    }

public async Task UpdateGatewayDatasourcesCredentials(string gatewayId, string sqlUser, string sqlPassword)
    {
        var bearerToken = await GetBearerTokenAsync();
        var tokenCredentials = new TokenCredentials(bearerToken, "Bearer");

        using (var client = new PowerBIClient(new Uri(_pbiApiUrl), tokenCredentials))
        {
            var datasourcesResult = await client.Gateways.GetDatasourcesAsync(gatewayId);
            var sqlGatewayDatasources = datasourcesResult.Value?
                                            .Where(s => s.DatasourceType == "Sql")
                                            .Where(s => s.ConnectionDetails.Contains(_reportsSQLServer) && s.ConnectionDetails.Contains(_reportsSQLDatabase));

            foreach (var gatewayDatasource in sqlGatewayDatasources)
            {
                var updateDataSourceRequest = new UpdateDatasourceRequest();
                updateDataSourceRequest.CredentialDetails = new CredentialDetails();
                updateDataSourceRequest.CredentialDetails.CredentialType = "Basic";
                updateDataSourceRequest.CredentialDetails.Credentials = "{\"credentialData\":[{\"name\":\"username\", \"value\":\"" + sqlUser + "\"},{\"name\":\"password\", \"value\":\"" + sqlPassword + "\"}]}";
                updateDataSourceRequest.CredentialDetails.EncryptedConnection = "Encrypted";
                updateDataSourceRequest.CredentialDetails.EncryptionAlgorithm = "None";
                updateDataSourceRequest.CredentialDetails.PrivacyLevel = "None";

                var result = await client.Gateways.UpdateDatasourceAsync(gatewayId, gatewayDatasource.Id, updateDataSourceRequest);
            }
        }
    }
public async Task UpdateConnectionAsync(字符串workspaceId、字符串datasetId、字符串sqlUser、字符串sqlPwd)
{
var bearerToken=await GetBearerTokenAsync();
var tokenCredentials=新的tokenCredentials(bearerToken,“Bearer”);
使用(var client=newpowerbiclient(新Uri(_pbiApiUrl),tokenCredentials))
{
var datasourceresponse=await client.dataset.GetDatasourcesInGroupAsync(workspaceId,datasetId);
var sqlDataSources=datasourceresponse.Value?.Where(s=>s.DatasourceType==“Sql”)
.Where(s=>!s.ConnectionString.Contains(_reportsSQLServer)| |!s.ConnectionString.Contains(_reportsSQLServer));
foreach(sqlDataSources中的var sqlDataSource)
{
var updateDataSourceConnectionRequest=新的updateDataSourceConnectionRequest();
updateDataSourceConnectionRequest.ConnectionDetails=新数据源连接详细信息(_reportsSQLServer,_reportsSQLDatabase);
//updateDataSourceConnectionRequest.DatasourceSelector=新数据源(datasourceId:sqlDataSource.datasourceId);
var datasourcerequest=new UpdateDatasourcesRequest();
DataSourceRequest.UpdateDetails=新列表(){updateDataSourceConnectionRequest};
var result=await client.Datasets.UpdateDatasourcesInGroupAsync(workspaceId、datasetId、datasourceRequest);
//wait client.Gateways.UpdateDatasourceAsync()
}
}
}
公共异步任务UpdateGatewayDatasourcesCredentials(字符串gatewayId、字符串sqlUser、字符串sqlPassword)
{
var bearerToken=await GetBearerTokenAsync();
var tokenCredentials=新的tokenCredentials(bearerToken,“Bearer”);
使用(var client=newpowerbiclient(新Uri(_pbiApiUrl),tokenCredentials))
{
var datasourcesResult=await client.Gateways.getdatasourceasync(gatewayId);
var sqlGatewayDatasources=datasourcesResult.Value?
.Where(s=>s.DatasourceType==“Sql”)
其中(s=>s.ConnectionDetails.Contains(_reportsSQLServer)和&s.ConnectionDetails.Contains(_reportsSQLDatabase));
foreach(sqlGatewayDatasources中的var gatewayDatasource)
{
var updateDataSourceRequest=新的updateDataSourceRequest();
updateDataSourceRequest.CredentialDetails=新的CredentialDetails();
updateDataSourceRequest.CredentialDetails.CredentialType=“基本”;
updateDataSourceRequest.CredentialDetails.Credentials=“{\'credentialData\':[{\'name\':\'username\',\'value\':\'+sqlUser+“\'”},{\'name\':\'password\',\'value\':\'+sqlPassword+“\'}”;
updateDataSourceRequest.CredentialDetails.EncryptedConnection=“加密”;
updateDataSourceRequest.CredentialDetails.EncryptionAlgorithm=“无”;
updateDataSourceRequest.CredentialDetails.PrivacyLevel=“无”;
var result=await client.Gateways.UpdateDatasourceAsync(gatewayId,gatewayDatasource.Id,updatedatasourcequest);
}
}
}
当我试图查看报告时,没有从数据库中提取数据。 有趣的是,我可以使用相同的凭据使用PowerBI门户手动登录。手动登录后,报表将获取数据。 如果在手动登录后,我删除了工作区,然后以编程方式重新创建并重新导入报告,那么报告将显示数据。这让我觉得在工作区之外持久化的手动逻辑之后,还涉及到一些缓存

对这里缺少的东西有什么建议吗