EndStatement(bError: Boolean; Message: String; Var Cancel: Boolean);
bError - признак наличия ошибки при выполнении запроса. Параметр возвращает значение True, если при выполнении запроса, передаваемого в параметре Statement события BeginStatement, возникла ошибка.
Message - сообщение об ошибке, которая возникла при выполнении запроса.
Cancel - переменная, определяющая будут ли выполнены остальные запросы скрипта. Если переменная имеет значение True, то выполнение скрипта будет остановлено, иначе продолжено.
Метод EndStatement реализует событие, происходящее после выполнения запроса.
В данном событии, изменяя значение параметра Cancel, можно обработать исключительные ситуации, которые могут возникнуть при выполнении запроса. Выполняемый запрос передается в параметре Statement события BeginStatement.
Для выполнения примера предполагается наличие сервера ORCL с наименованием «Test». На сервере в рамках схемы «TestSchema» создан репозиторий платформы. В корневом каталоге диска «С» имеется файл «current.rm4», содержащий скрип для создания и обновления репозитория.
Sub Main;
Var
Rsm: IRepositoryScriptManager;
Driv: IDalDriver;
ConDesc: IDalConnectionDescriptor;
Params: IDalConnectionDescriptorParams;
Con: IDalConnection;
CallBack: IRepositoryScriptCallback;
Begin
//Подключение к схеме на сервере ORCL
Driv := New DalOrclDriver.Create As IDalDriver;
ConDesc := Driv.CreateDescriptor;
Params := ConDesc.Params;
Params.Find("User Name").Value := "TestSchema";
Params.Find("Password").Value := "TestSchema";
Params.Find("Host BSTR").Value := "Test";
Params.Find("Scheme").Value := "TestSchema";
Con := ConDesc.CreateConnection;
//Настройки менеджера репозитория
Rsm := New RepositoryScriptManager.Create;
Rsm.Connection := Con;
Rsm.Driver := RepositoryDriverType.ORCL;
Rsm.Operation := RepositoryOperationType.Update;
//Обновление репозитория
Rsm.Repository := RepositoryType.Metabase;
Rsm.LoadScript(New FileStream.Create("c:\current.rm4", FileOpenMode.Read, FileShare.Exclusive));
CallBack := New ScrCallback.Create;
Rsm.Execute(CallBack);
End Sub Main;
Class ScrCallback: RepositoryScriptCallback
s: String;
Public Sub OnStart(Error: RepsitoryScriptInitError; FilesToProcess: Integer);
Begin
Debug.WriteLine("Начало обновления");
Select Case Error
Case RepsitoryScriptInitError.None:
Debug.WriteLine("Количество запросов, которые будут выполнены: " + FilesToProcess.ToString);
Case RepsitoryScriptInitError.NoTables:
Debug.WriteLine("В указанной базе нет таблиц репозитория");
Case RepsitoryScriptInitError.TablesAlreadyExist:
Debug.WriteLine("В указанной базе уже есть таблицы репозитория");
Case RepsitoryScriptInitError.EmptyRepository:
Debug.WriteLine("Пустой репозиторий для обновления");
Case RepsitoryScriptInitError.CannotUpdateVers:
Debug.WriteLine("Версию репозитория обновить нельзя");
Case RepsitoryScriptInitError.UnicodeMismatch:
Debug.WriteLine("Юникод версии репозитория в базе и файле обновления не совпадает");
End Select;
End Sub OnStart;
Public Sub BeginStatement(Statement: String);
Begin
s := Statement;
End Sub BeginStatement;
Public Sub EndStatement(bError: Boolean; Message: String; Var Cancel: Boolean);
Begin
If bError = True Then
Debug.WriteLine("При выполнении кода возникла ошибка!");
Debug.Indent;
Debug.WriteLine("Запрос: " + s);
Debug.WriteLine("Ошибка: " + Message);
Debug.Unindent;
Cancel := False;
End If;
End Sub EndStatement;
Public Sub OnFinish;
Begin
Debug.WriteLine("Обновление окончено");
End Sub OnFinish;
End Class ScrCallback;
После выполнения примера будет осуществлено обновление версии репозитория в соответствии с содержимым файла «current.rm4». Для отслеживания процесса обновления используется пользовательский класс «ScrCallback». Информация о готовности к обновлению, а также об ошибках, которые могут возникнуть при выполнении запросов, будет выведена в консоль среды разработки.
См. также: