我正在更新“数据源视图”中的维度定义。使用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列失败:元素的结束标记中的名称必须与开始标记中的元素类型匹配。 运行完成
有人可以帮忙吗?
答案 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);
}