Создание EzApi для SQL Server 2022C#

Место общения программистов C#
Anonymous
Создание EzApi для SQL Server 2022

Сообщение Anonymous »

Я использовал EzApi для программного создания пакетов SSIS (служб интеграции SQL Server) на C#. Тогда я полагался на оригинальный проект Microsoft EzApi от CodePlex, выпуск которого был прекращен уже много лет. Я разветвил код и поддерживал свои собственные сборки, поддерживающие версии SQL Server 2008R2, 2012, 2014 и 2016.
Пришел момент проверки 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

Следующей проблемой был ScriptTask, который не использовал EzApi:
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

Кстати Мне удалось найти доступные имена для исполняемых файлов, компонентов и соединений, внедрив в 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");

Но этот код со сменой моникеров в EzApi не работает
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");

В тот момент, когда IDTSComponentMetaData100 появляется, он перестает работать и выдает ошибку.

Не удалось сохранить объекты потока данных

Затем, выполнив поиск по этой специальной проблеме, я обнаружил, что функции 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/
Есть идеи?
Глядя на то, как работал SQL Server 2016 и доступны ли моникеры с помощью app.TaskInfos, кажется, что там тоже был .5, но их можно было решить без указывается с помощью .5 внутри приложения или EzApi. Это немного меняет картину, поэтому моникеры следует оставить такими, какими они были, но выясните, почему возникает эта ошибка в SQL Server 2022.

Невозможно создать задачу из XML для задачи "", типа "" из-за ошибки 0x80070057

Неправильный параметр

Вот исходный код, который работал в SQL Server 2016, но библиотеки DLL и ссылки для SQL Server 2022
https://github.com/koureasstavros/SQLSe ... erver_2022
Теперь я пытаюсь создать простой пакет с собственным кодом, но не удается выполнить TaskHost dfTaskHost = (TaskHost)pkg0.Executables.Add("Microsoft.Pipeline"); с ошибкой

Невозможно создать задачу из XML для задачи "", типа "" из-за ошибки 0x80070057

Неправильный параметр

var app = new Application();
var pkg0 = new Package();
pkg0.Name = "TestPackage";
TaskHost dfTaskHost = (TaskHost)pkg0.Executables.Add("Microsoft.Pipeline");
dfTaskHost.Name = "df0";
dfTaskHost.DelayValidation = true;
MainPipe dataFlow = (MainPipe)dfTaskHost.InnerObject;
IDTSComponentMetaData100 oledbComp = dataFlow.ComponentMetaDataCollection.New();
oledbComp.ComponentClassID = "Microsoft.OLEDBSource";
IDTSDesigntimeComponent100 oledbInst = oledbComp.Instantiate();
oledbInst.ProvideComponentProperties();
oledbComp.Name = "TestOleDbSource";
oledbComp.ValidateExternalMetadata = false;
app.SaveToXml(@"C:\\test.dtsx", pkg0, null);

Вернуться в «C#»