处理Microsoft.AnalysisServices更新方法上的错误

时间:2018-07-04 13:51:06

标签: c# sql-server error-handling ssis ssas

我正在更新“数据源视图”中的维度定义。使用SSIS脚本任务中的C#代码执行此操作。 这是简化的C#代码:

DataSourceView ASDataSourceView;
//DataSourceView inherits from MajorObject
ASDataSourceView.Schema.Tables["DimTable"].ExtendedProperties["QueryDefinition"] = "SELECT * FROM ufc.TableWithData";
ASDataSourceView.Update();

我需要处理在Update()方法期间可能出现的错误。 我认为使用try catch的常规方法会起作用,但事实并非如此。 我需要以某种方式获取xml响应对象,然后检查它是否为空(无错误)或对其进行解析并构建进一步的逻辑。

我试图阅读Microsoft文档,但不知道该怎么做。 XmlaWarningCollection Class

当我在SSMS中运行update xml语句时,收到以下消息: 更新成功时:

<return xmlns="urn:schemas-microsoft-com:xml-analysis">
  <root xmlns="urn:schemas-microsoft-com:xml-analysis:empty" />
</return>

更新失败时(由于语法错误而失败,不是逻辑,从模拟的角度来看也不是很正确):

  

XML分析在行9597的第63列失败:元素的结束标记中的名称必须与开始标记中的元素类型匹配。   运行完成

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

我想我终于找到了解决方法:

首先,您需要启用CaptureXML选项;

ServerName.CaptureXml = true;

使用XmlaResultCollection选项进行的第二次运行更新:

UpdateOptions uo = default(UpdateOptions);
UpdateMode om = default(UpdateMode);
XmlaWarningCollection xm = null;
ASDataSourceView.Update(uo, om, xm);

第三次执行更新语句:

XmlaResultCollection resultCollection = ServerName.ExecuteCaptureLog(false, false);

之后,我能够解析 resultCollection 对象:

String ErrorMessages = String.Empty;

if (resultCollection.ContainsErrors) {
                ErrorMessages += $"Errors occured in cube {ConnectionString.CatalogName}:" + Environment.NewLine;
                foreach (AS.XmlaResult result in resultCol) {
                    foreach (object error in result.Messages) {
                        if (error.GetType() == typeof(AS.XmlaError))
                            ErrorMessages += "ERR: " + ((AS.XmlaError)error).Description + Environment.NewLine;
                        else if (error.GetType() == typeof(AS.XmlaWarning))
                            ErrorMessages += "WARN: " + ((AS.XmlaWarning)error).Description + Environment.NewLine;
                    }
                }
                throw new Exception(ErrorMessages);
            }