Пришел момент проверки EzApi на соответствие SQL Server 2022, и как только я начал генерировать пакет DTSX, всплыло несколько проблем. Пакет, который ранее был успешно создан для SQL Server 2012, 2014 и 2016, больше не может быть создан в среде 2022 с соответствующими исправлениями для библиотек DLL EzApi, как раньше.
Все началось отсюда: в приложении код использовал классы/объекты eZ следующим образом:
Код: Выделить всё
var storedProcedureTask = new EzExecSqlTask(extractSequence);
Невозможно создать задачу из XML для задачи "", типа "" из-за ошибки 0x80070057
Неправильный параметр
После многих часов работы и помощи ИИ мне удалось обнаружить, что мне нужно переключить моникер EzApi ExecID из простой ссылки:
Код: Выделить всё
Microsoft.ExecuteSQLTask
Код: Выделить всё
Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask, Microsoft.SqlServer.SQLTask, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Код: Выделить всё
Executable eee = SubSequence.Executables.Add("STOCK:ScriptTask");
Невозможно создать задачу из XML для задачи "", типа "" из-за ошибки 0x80070057
Неверный параметр
После многих часов работы с помощью ИИ удалось обнаружить, что мне нужно переключить прозвище в код приложения из стока ссылка
Код: Выделить всё
STOCK:ScriptTask
Код: Выделить всё
Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask, Microsoft.SqlServer.ScriptTask, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
Код: Выделить всё
Task.ScriptingEngine.VstaHelper.LoadNewProject(task.ProjectTemplatePath, null, "MyScriptProject");
System.ApplicationException: «За исключением devenv, все прикладные программы, такие как dtdebughost.exe, должны находиться в папке CommonExtensions».
AI предположил, что Microsoft ограничила использование этой dll задачи сценария в приложениях заказа (кроме Microsoft Visual Studio), поскольку эта DLL является кодом компилятор, который может использоваться приложениями, что приводит к генерации уязвимого кода, но я не уверен. Просто потому, что я потратил на это много часов, я просто полностью удалил этот шаг, чтобы просто проверить, что еще происходит.
Затем следующей проблемой стал DataFlow, который использовал класс EzApi
Код: Выделить всё
dataSourceFlow = new EzDataFlow(ezSequence);
Невозможно создать задачу из XML для задачи "", типа "" из-за ошибки 0x80070057
Неправильный параметр
Теперь, имея предыдущие знания, основанные на переключении моникеров, я перешел со стандартного моникера
Код: Выделить всё
Microsoft.Pipeline
Код: Выделить всё
SSIS.Pipeline.8 in Ezapi
Код: Выделить всё
var app = new Microsoft.SqlServer.Dts.Runtime.Application();
bool found = false;
foreach (Microsoft.SqlServer.Dts.Runtime.TaskInfo ti in app.TaskInfos)
{
Console.WriteLine($"Available ExecutableClassID (Moniker) '{ti.CreationName}' in System TaskInfos.");
}
Код: Выделить всё
package.SaveToFile(CreationPath + @"\" + _PO.Name + ".dtsx");
Не удалось сохранить объекты потока данных
Источник «Extract Source Flow CompanyEXT»
StackTrace
в Microsoft.SqlServer.Dts.Runtime.Package.SaveToXML(String& packageXml, IDTSEvents события)
в Microsoft.SqlServer.SSIS.EzAPI.EzPackage.SaveToXML(события IDTSEvents)
в Microsoft.SqlServer.SSIS.EzAPI.EzPackage.SaveToFile(String fileName)
at xxxxxx.xxxxxx.Helpers.SSISPackageHelper.CreateSSISPackage() в C:\\TFS\\xxxxxx\\xxxxxx\\xxxxxx\\xxxxxx\\xxxxxx.xxxxxx\\xxxxxx.xxxxxx\\Helpers\\SSISPackageHelper.cs:line 339
После нескольких дней бесчисленных часов отладки, Я понял, что моникеры SSIS были изменены в SQL Server 2022 (возможно, даже раньше).
Теперь, стремясь решить проблему DataFlow, я создал образец приложения, просто чтобы изолировать проблему.
Этот код с изменением моникеров в EzApi работает нормально
Код: Выделить всё
var pkg0 = new EzPackage();
var df0 = new EzDataFlow(pkg0);
pkg0.SaveToFile(@"C:\\test.dtsx");
Код: Выделить всё
var pkg0 = new EzPackage();
var df0 = new EzDataFlow(pkg0);
IDTSComponentMetaData100 oledbComp = df0.DataFlow.ComponentMetaDataCollection.New();
oledbComp.ComponentClassID = "DTSAdapter.OLEDBSource.8";
IDTSDesigntimeComponent100 oledbInst = oledbComp.Instantiate();
oledbInst.ProvideComponentProperties();
oledbComp.Name = "TestOleDbSource";
oledbComp.ValidateExternalMetadata = false;
pkg0.SaveToFile(@"C:\\test.dtsx");
Не удалось сохранить объекты потока данных
Затем, выполнив поиск по этой специальной проблеме, я обнаружил, что функции SaveToXML не работают в EzApi, что не удается из Microsoft.SqlServer.PipelineXML длл. Я подозреваю, что Microsoft.SqlServer.PipelineXML ожидает старые моникеры.
Чтобы убедиться в этом, я провел еще один тест и сгенерировал пакет непосредственно из Microsoft Visual Studio с помощью проекта Integration Services Project, и сгенерированный пакет при проверке его XML имел старые моникеры как CreationName.
Я пришел к выводу, что теперь существуют моникеры времени выполнения, которые отличаются от моникеров проектирования/сохранения, и я не нашел любой способ разрешить это в моем приложении/EzApi.
Кстати, новый проект EzApi SQL Server 2022 и описанные здесь изменения можно найти в ветке sql_server_2022_resolve_monikers:
https://github.com/koureasstavros/SQLSe ... _monikers/
Есть идеи?>