Однако мы все еще задаемся вопросом, как получить точную индикацию в задаче сценария SSIS, если в будущем будут пропущены другие DLL.
Как создать тестовый сценарий
Используя AWSSDK.Core.dll только в качестве примера, мы можем создать ошибку отсутствующей DLL одним из следующих способов:
- в каталог C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\ и переименуйте AWSSDK.Core.dll в AWSSDK.Core.dll.bak. В этом случае система не сможет найти DLL для связывания.
- Или вызовите gacutil -u AWSSDK.Core, чтобы отменить регистрацию. Таким образом, мы можем создать ошибку при тестировании в Visual Studio, но не при развертывании SQL Server.
Если задача «Скрипт» использует следующий исходный код, то RegionEndpoint Region = RegionEndpoint.USeast1; требует библиотеки AWS, поэтому отсутствие DLL приведет к следующему сообщению об ошибке в Visual Studio без четкого указания.
at System.RuntimeMethodHandle.InvokeMethod(цель объекта, аргументы Object[], подпись подписи, логический конструктор)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, параметры Object[], аргументы Object[])
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags ignoreAttr, связыватель Binder, параметры Object[], культура CultureInfo)
at System.RuntimeType.InvokeMember(имя строки, BindingFlags привязкаFlags, связыватель Binder, цель объекта, Object[] предоставленные аргументы, модификаторы ParameterModifier[], культура CultureInfo, String[]nameParams)
в Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
Код: Выделить всё
public void Main()
{
try
{
RegionEndpoint region = RegionEndpoint.USEast1;
bool fireAgain = false;
Dts.Events.FireInformation(0, "Test", region.SystemName, string.Empty, 0, ref fireAgain);
}
catch (Exception ex)
{
Dts.Events.FireError(0, "Error", ex.Message, string.Empty, 0);
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
Итак, не очень элегантно, нам нужно изменить исходный код на следующее:
Код: Выделить всё
#pragma warning disable CS1998
public async System.Threading.Tasks.Task Main()
#pragma warning restore CS1998
{
try
{
this.ScriptAction().GetAwaiter().GetResult();
}
catch (Exception ex)
{
Dts.Events.FireError(0, "Error", ex.Message, string.Empty, 0);
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
#pragma warning disable CS1998
async System.Threading.Tasks.Task ScriptAction()
#pragma warning restore CS1998
{
RegionEndpoint region = RegionEndpoint.USEast1;
bool fireAgain = false;
Dts.Events.FireInformation(0, "Test", region.SystemName, string.Empty, 0, ref fireAgain);
}
- Мы до сих пор не понимаем, почему описанный выше обходной путь может точно вернуть исключение отсутствующей DLL, например
[Файл не найден] Ошибка: отсутствует необходимая сборка: AWSSDK.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=885c28607f98e604
но прямой void Main() не может. - Как видите, нам приходится подавлять предупреждения компилятора с помощью #pragma alert отключить CS1998, а также, насколько нам известно, задача SSIS Script Task не поддерживает async/await очень хорошо, и на самом деле в нашей логике нет никакой асинхронной операции. Итак, есть ли лучший способ?
- Возможно ли, что задача сценария SSIS может пропустить больше исключений, помимо отсутствия DLL? Если да, то как это предотвратить?
Подробнее здесь: https://stackoverflow.com/questions/794 ... -missing-d
Мобильная версия