У меня есть SQL Server Server1 с базой данных Database1, которая не нормализована; это затрудняет использование для различных целей, таких как внешние клиенты (инструменты для визуализации, другие программы и т. д.), и не может быть изменено (по многим причинам).
Чтобы иметь возможность использовать другие клиенты эффективно, у меня есть еще один SQL Server Server2, где базы данных оптимизированы, а данные с Server1 изменяются и вставляются в Server2.
Как пример из вставки Server1.database1.dbo.TableA свои данные как в Server2.database2.dbo.TableB, так и в Server2.database2.dbo.TableC. Это можно сделать через T-SQL (триггеры, процедуры и т. д.).
Но в некоторых ситуациях удобнее разработать DLL, зарегистрировать сборку в SQL Server и запустить триггер при ОБНОВЛЕНИИ.
Я попытался разработать DLL и зарегистрировать сборку на Сервере2, которая будет запускаться при ОБНОВЛЕНИИ на Сервере2 для Table_ActNow.
Я разработал класс, используя C# и .NET 4.8. Логика моего класса заключалась в использовании адаптеров таблиц, которые будут загружать данные из Server1.TableA с помощью команды SQL, например SELECT TOP(1) * FROM TableA ORDER BY Date DESC, в набор данных через метод Fill(), обработайте загруженные данные, заполните два других набора данных обработанными данными и используйте эти два объекта для вставки в Server2.TableB и Server2.TableC через адаптер таблицы каждого набор данных с использованием INSERT.
Проблема в том, что мой класс запускается SQL Server, координатором распределенных транзакций Microsoft (MSDTC), который управляет транзакциями и соединениями и в этом случае сообщает об ошибках (DTC настроен правильно на обоих серверах и работает правильно).
После нескольких дней отладки я обнаружил, что методы SQL-команд адаптера таблицы не отображаются, в результате транзакция завершится неудачно.
Единственный обходной путь что может сработать, так это добавить в частичный класс методов адаптера таблицы, которые будут дополнительно предоставлять методы команд SQL (я это не проверял!)
Согласно документации Microsoft, адаптеры таблиц должны быть используется в CRUD-приложениях.
Также в документации Microsoft по транзакциям приводятся примеры использования SqlPipe, в этом случае мне приходится управлять открытием и закрытием соединений и проверять, SqlCommand выполняет задание во время транзакция.
Поскольку я заметил, что при использовании адаптеров таблиц для заполнения набора данных, а затем что-то с этими данными, этот процесс происходит намного быстрее и эффективнее по сравнению с другим случаем, когда мне приходится управлять соединение, создаю переменные и готовлю другие шаги для работы с данными, как это происходит при использовании SqlPipe.
С точки зрения опытного человека я хотелось бы знать, каков элегантный и оптимизированный способ сделать это (в .NET)?
Использовать дополнительные адаптеры таблиц неправильно или это слишком сложно?
Должен ли я использовать SqlPipe?
Подробнее здесь: https://stackoverflow.com/questions/792 ... ecial-case
Адаптер таблицы против SqlPipe (особый случай) ⇐ C#
Место общения программистов C#
-
Anonymous
1733343891
Anonymous
У меня есть SQL Server Server1 с базой данных Database1, которая не нормализована; это затрудняет использование для различных целей, таких как внешние клиенты (инструменты для визуализации, другие программы и т. д.), и не может быть изменено (по многим причинам).
Чтобы иметь возможность использовать другие клиенты эффективно, у меня есть еще один SQL Server Server2, где базы данных оптимизированы, а данные с Server1 изменяются и вставляются в Server2.
Как пример из вставки Server1.database1.dbo.TableA свои данные как в Server2.database2.dbo.TableB, так и в Server2.database2.dbo.TableC. Это можно сделать через T-SQL (триггеры, процедуры и т. д.).
Но в некоторых ситуациях удобнее разработать DLL, зарегистрировать сборку в SQL Server и запустить триггер при ОБНОВЛЕНИИ.
Я попытался разработать DLL и зарегистрировать сборку на Сервере2, которая будет запускаться при ОБНОВЛЕНИИ на Сервере2 для Table_ActNow.
Я разработал класс, используя C# и .NET 4.8. Логика моего класса заключалась в использовании адаптеров таблиц, которые будут загружать данные из Server1.TableA с помощью команды SQL, например SELECT TOP(1) * FROM TableA ORDER BY Date DESC, в набор данных через метод Fill(), обработайте загруженные данные, заполните два других набора данных обработанными данными и используйте эти два объекта для вставки в Server2.TableB и Server2.TableC через адаптер таблицы каждого набор данных с использованием INSERT.
Проблема в том, что мой класс запускается SQL Server, координатором распределенных транзакций Microsoft (MSDTC), который управляет транзакциями и соединениями и в этом случае сообщает об ошибках (DTC настроен правильно на обоих серверах и работает правильно).
После нескольких дней отладки я обнаружил, что методы SQL-команд адаптера таблицы не отображаются, в результате транзакция завершится неудачно.
Единственный обходной путь что может сработать, так это добавить в частичный класс методов адаптера таблицы, которые будут дополнительно предоставлять методы команд SQL (я это не проверял!)
Согласно документации Microsoft, адаптеры таблиц должны быть используется в CRUD-приложениях.
Также в документации Microsoft по транзакциям приводятся примеры использования SqlPipe, в этом случае мне приходится управлять открытием и закрытием соединений и проверять, SqlCommand выполняет задание во время транзакция.
Поскольку я заметил, что при использовании адаптеров таблиц для заполнения набора данных, а затем что-то с этими данными, этот процесс происходит намного быстрее и эффективнее по сравнению с другим случаем, когда мне приходится управлять соединение, создаю переменные и готовлю другие шаги для работы с данными, как это происходит при использовании SqlPipe.
С точки зрения опытного человека я хотелось бы знать, каков элегантный и оптимизированный способ сделать это (в .NET)?
Использовать дополнительные адаптеры таблиц неправильно или это слишком сложно?
Должен ли я использовать SqlPipe?
Подробнее здесь: [url]https://stackoverflow.com/questions/79251908/table-adapter-vs-sqlpipe-special-case[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия