PowerQuery捕获认证错误:连接失败时清空Excel工作表
PowerQuery捕获ODBC连接DataBricks异常并强制清空工作表
问题场景
我在Excel工作簿中通过PowerQuery使用ODBC驱动连接外部DataBricks Photon数据仓库,查询逻辑为先清空工作表现有数据,再填充查询结果。但偶尔会因VPN问题导致连接失败,此时PowerQuery抛出错误:We couldn't authenticate with the credentials provided. Please try again。
需要实现的目标:无论连接是否成功,都必须清空工作表,避免用户使用过时数据。之前尝试用try语句捕获错误返回空表,但无法捕获连接阶段的异常,理想逻辑如下:
let bar = Excel.CurrentWorkbook(){[Name="foo"]}[Content], rows_removed = Table.FirstN(bar,0), calculated_columns_removed = Table.RemoveColumns(rows_removed,{"FR", "SA", "SU", "MO", "TU", "WE", "TH"}), query_result = Odbc.Query("dsn=Simba Spark", query_str), test_for_error = try query_result, recover = if test_for_error[HasError] then calculated_columns_removed else query_result in recover
可行解决方案
问题核心:连接阶段的错误属于执行早期异常,如果先执行Odbc.Query再用try捕获,错误已经提前抛出,无法被后续逻辑处理。必须将Odbc.Query直接包裹在try块内,才能捕获连接/认证类错误。
修改后的完整M代码
let // 生成与原表结构匹配的空表(移除指定计算列) source_table = Excel.CurrentWorkbook(){[Name="foo"]}[Content], empty_table = Table.RemoveColumns(Table.FirstN(source_table, 0), {"FR", "SA", "SU", "MO", "TU", "WE", "TH"}), // 将ODBC查询操作直接包裹在try块中,捕获连接/认证错误 query_attempt = try Odbc.Query("dsn=Simba Spark", query_str), // 根据结果判断返回空表还是正常查询数据 final_output = if query_attempt[HasError] then empty_table else query_attempt[Value] in final_output
关键说明
- 异常捕获时机:将
Odbc.Query直接放入try块,确保连接阶段的错误被及时捕获,不会中断整个查询流程。 - 空表结构兼容:通过
Table.FirstN(source_table, 0)保留原表的字段结构,再移除指定计算列,保证返回的空表与原表结构一致,避免刷新时出现结构不匹配错误。 - 精准错误过滤(可选):如果需要只处理特定的认证错误,可对错误信息进行匹配,其他类型错误仍抛出:
final_output = if query_attempt[HasError] and Text.Contains(query_attempt[Error][Message], "We couldn't authenticate") then empty_table else if query_attempt[HasError] then error query_attempt[Error][Message] else query_attempt[Value]
内容的提问来源于stack exchange,提问作者corne12345
相关产品推荐
相关产品推荐

