Error handling Excel电源查询,回退连接/OleDb数据源的错误处理

Error handling Excel电源查询,回退连接/OleDb数据源的错误处理,error-handling,db2,powerquery,oledbconnection,m,Error Handling,Db2,Powerquery,Oledbconnection,M,我有一个连接到DB2数据源的PowerQuery,但由于某种负载平衡,DB服务器会定期更改(ip也会更改),因此我无法事先知道应该使用哪个数据源(ip),直到我尝试并看到它出错,然后我才不得不使用另一个,我搜索了PowerQuery中的错误处理,发现了一些错误处理示例,但这些示例不适用于我的案例,大多数示例在建立连接后处理了错误,或者是在防止找不到丢失的列或文件时出错,我尝试根据我的案例调整示例,但无法执行 我想要的只是尝试一个IP,如果失败,那么使用另一个 let //fParametros

我有一个连接到DB2数据源的PowerQuery,但由于某种负载平衡,DB服务器会定期更改(ip也会更改),因此我无法事先知道应该使用哪个数据源(ip),直到我尝试并看到它出错,然后我才不得不使用另一个,我搜索了PowerQuery中的错误处理,发现了一些错误处理示例,但这些示例不适用于我的案例,大多数示例在建立连接后处理了错误,或者是在防止找不到丢失的列或文件时出错,我尝试根据我的案例调整示例,但无法执行

我想要的只是尝试一个IP,如果失败,那么使用另一个

let

//fParametros("ParamQuery",1) is the "standard" Server/Ip address (provider=IBMDADB2.IBMDBCL1;data source=CP3;location=pn8us7ldbcp3.us.mycompany.com:5912)

dbSource = fParametros("ParamQuery",1),

//fParametros("ParamQuery",5) is the "Alternate" Server/Ip address (provider=IBMDADB2.IBMDBCL1;data source=CP3;location=pn8us7ldbcp3h.us.mycompany.com:5912)

AltdbSource = fParametros("ParamQuery",5),
pOrden = Text.From(fParametros("ParamQuery",2)),

//Create the query
dbQuery = "SELECT SAPCP3.vbak.VBELN SO , SAPCP3.vbap.posnr PoLine , SAPCP3.vbep.ETENR Sch_Line , SAPCP3.vbap.matnr Part_Number,SAPCP3.makt.maktx Description,SAPCP3.vbap.kwmeng Qty ,SAPCP3.vbep.BMENG Conf_qty ,SAPCP3.vbap.vrkme UOM ,SAPCP3.vbap.netpr SalesPrice ,SAPCP3.vbap.kpein LotSize FROM SAPCP3.vbak JOIN SAPCP3.vbap ON SAPCP3.VBAp.VBELN = SAPCP3.VBAK.VBELN JOIN SAPCP3.vbep ON SAPCP3.vbep.vbeln = SAPCP3.vbak.vbeln AND SAPCP3.vbap.posnr  = SAPCP3.vbep.posnr JOIN sapcp3.makt ON sapcp3.vbap.matnr=sapcp3.makt.matnr WHERE SAPCP3.VBAK.VKORG = '4000' AND (SAPCP3.vbep.edatu >= '20190701') AND SAPCP3.vbak.VBELN ="& pOrden & " ORDER BY SAPCP3.vbak.VBELN",

//Get the data
Source = OleDb.DataSource(dbSource, [Query=dbQuery]),

//Failed Attempt to handle the error:    

TestForError= try Source,

//next line does not work, I get error saying Source is already defined/declared
Source = if TestForError[HasError] then OleDb.DataSource(AltdbSource, [Query=dbQuery]) else OleDb.DataSource(dbSource, [Query=dbQuery])

in

Source
我还尝试了以下方法:

.
.
.

//Get the data
Source = OleDb.DataSource(dbSource, [Query=dbQuery]),

//Failed Attempt to handle the error:
TestForError= try Source,

Output = if TestForError[HasError] then OleDb.DataSource(AltdbSource, [Query=dbQuery]) else OleDb.DataSource(dbSource, [Query=dbQuery])

in

Output


//This last part works if the dbSource is correct, but if it is not it doesnt catch the error and gives me the Connection error shown below:
DataSource.Error:OLE DB:SQL30081N检测到通信错误。正在使用的通信协议:“TCP/IP”。正在使用的通信API:“套接字”。检测到错误的位置:“172.16.0.1”。检测错误的通信功能:“连接”。特定于协议的错误代码:“10061”,“”,“”。SQLSTATE=08001 细节: DataSourceKind=OleDb DataSourcePath=数据源=CP3;location=pn8us7ldbcp3.us.mycompany.com:5912;provider=IBMDADB2.IBMDBCL1 Message=SQL30081N检测到通信错误。正在使用的通信协议:“TCP/IP”。正在使用的通信API:“套接字”。检测到错误的位置:“172.16.0.1”。检测错误的通信功能:“连接”。特定于协议的错误代码:“10061”,“”,“”。SQLSTATE=08001 错误代码=-2147467259

我想连接到dbSource(172.16.0.1),如果不可能,则连接到AltdbSource(172.16.0.2)


目前我有两个相同的excel Sheet,用户需要打开其中一个,如果他出现连接错误,我希望它自动更改。

我猜
TestForError=try OleDb.DataSource(BadSource)
不起作用,因为
OleDb.DataSource(…)
返回一个表值,而不是仅在尝试枚举行时产生错误

如果将
TestForError
更改为钻取第一行(如果它存在),该怎么办

TestForError= try Source{0}?,


如果仍然不起作用,接下来尝试索引到第一行的一个表单元格。

如果您有一个集群Db2,那么您的应用程序应该连接到一个服务地址,而不是连接到集群的各个Db2服务器。请与DBA联系以获取群集的正确浮动IP地址或服务DNS名称。其思想是,数据库在主机名之间更改,而应用程序只需重新连接到相同的ip地址/服务名。这是处理这些事情最简单的方法。谢谢你的评论,我已经试过了,但从他们那里得到任何东西都是一个非常麻烦的过程,他们几乎不接受给我们访问权,他们更喜欢自己处理所有请求(当然也要向我们收费),他们不太高兴我们有阅读访问权,并且希望我们通过SAP GUI做所有事情(“他们”是我们的服务提供商,我们自己公司的一个子公司),因此我仍然想知道是否有其他方法可以做到这一点。我不确定我是否理解您的意思,dbQuery已经选择了一些记录,如果源不正常,我甚至无法连接到它,因此,它会引发一个错误。表值可能是惰性的,也就是说,在某些代码检查列或开始枚举行之前,它们实际上不会运行SQL查询。我不记得实现了什么,但OleDb甚至可能先打开连接,然后再运行SQL。作为懒惰的一个非常简单的例子,假设您通过将一个简单的列表{1}与一个list.Generate()连接在一起生成Concat,该列表在枚举第一个值时会出错。Concat是一个有效的列表值,但其中的值尚未计算。您应该能够运行Concat{0}来获取1,但随后枚举第二个值Concat{1}将出错。我理解您关于惰性的意思,但在这种情况下,无法连接到错误的dbsource,因此没有要运行的查询,甚至没有打开的连接。(第一行永远不存在,因为我无法连接到数据库)