обработать ошибку в методе обновления Microsoft.AnalysisServices - PullRequest
0 голосов
/ 04 июля 2018

Я обновляю определение измерения в «Представлении источника данных». Делать это, используя код C # внутри задачи скрипта SSIS. Вот упрощенный код 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

Когда я запускаю инструкцию update xml в SSMS, я получаю следующие сообщения: при успешном обновлении:

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

при сбое обновления (происходит сбой из-за синтаксической ошибки, а не логики, что также не очень правильно с точки зрения симуляции):

Сбой синтаксического анализа XML в строке 9597, столбец 63: имя в конечном теге элемента должно соответствовать типу элемента в начальном теге. Выполнить завершено

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 09 июля 2018

Я думаю, что наконец-то нашел решение:

Сначала вам нужно включить опцию 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 object:

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);
            }
...