调用PowerBI API更新数据集服务器地址报连接详情含参数错误求助
Power BI 数据集更新数据源服务器配置报错解决方案
错误根因排查
首先确认两个前置限制,满足任意一种都会触发你收到的报错:
- 你的数据集使用了Power Query参数来配置服务器、数据库地址,UpdateDatasources接口本身不支持修改参数化的数据源,需要先调用更新数据集参数接口更新参数值
- 你的数据集为Live Connection连接Analysis Services、或者复合模型跨多个网关场景,不支持该接口修改数据源
排除上述限制后,你两种方案的代码存在如下问题:
- 方案1的SDK代码错误将新连接信息传入了
DatasourceSelector字段,旧连接信息传入了更新目标字段,字段逻辑完全倒置,导致接口无法匹配到现有数据源触发报错 - 方案2的请求体结构符合接口要求,如果仍然报错,说明你大概率命中了上述前置限制,或者请求的权限范围不足
修正后的实现方案
方案1:Microsoft.PowerBI.Api.V2 库修正代码
public static void UpdateSqlDatabaseConnectionString(string WorkspaceId, string DatasetId, string Server, string Database) { var tokenCredentials = GetTokenCredentials(); using (var pbiClient = new PowerBIClient(new Uri(ApiUrl), tokenCredentials.Item1)) { Datasource targetDatasource = pbiClient.Datasets.GetDatasourcesInGroup(WorkspaceId, DatasetId).Value.First(); string currentServer = targetDatasource.ConnectionDetails.Server; string currentDatabase = targetDatasource.ConnectionDetails.Database; if (Server.ToLower().Equals(currentServer.ToLower()) && Database.ToLower().Equals(currentDatabase.ToLower())) { Console.WriteLine("New server and database name are the same as the old names"); return; } // 构造选择器:仅传入现有数据源的标识信息 var datasourceSelector = new Datasource() { DatasourceType = "Sql", ConnectionDetails = new DatasourceConnectionDetails() { Server = currentServer, Database = currentDatabase } }; // 构造新的连接信息 var newConnectionDetails = new DatasourceConnectionDetails { Database = Database, Server = Server }; var updateConnRequest = new UpdateDatasourceConnectionRequest { DatasourceSelector = datasourceSelector, ConnectionDetails = newConnectionDetails }; var updateDatasourcesRequest = new UpdateDatasourcesRequest(updateConnRequest); pbiClient.Datasets.UpdateDatasourcesInGroup(WorkspaceId, DatasetId, updateDatasourcesRequest); } }
如果仍然报错,可将选择器替换为数据源ID+网关ID的形式,跳过连接详情参数校验:
var datasourceSelector = new Datasource() { DatasourceId = targetDatasource.DatasourceId, GatewayId = targetDatasource.GatewayId };
方案2:Rest API 调用注意事项
你现有请求体结构正确,若仍报错优先检查前置限制,其次确认调用接口的令牌权限包含Dataset.ReadWrite.All范围。
额外说明
如果确认数据源使用了参数化配置,需要调用更新数据集参数接口修改参数值,再刷新数据集即可完成数据源切换,无需调用更新数据源接口。
内容的提问来源于stack exchange,提问作者Neehar Gadam
相关产品推荐
相关产品推荐

