Как я сообщаю в мое приложение, если было изменение в таблице моей базы данных SQL Server?

Мне хотелось бы знать, как я могу реализовывать это, так как он мог бы осуществлять механизм закоулка для приложения примера, написанного в C#. Это осуществление предназначалось, чтобы он закончился как книжный магазин.

Я знаю, что у EntityFramework есть немного похожий механизм с Делом Refresh, и что у NHibernate есть уровни закоулка. Но у меня есть неопределенная идея о концепции и у меня нет идеи о том, как они функционируют внутри.

Из-за небольшого количества, которое я исследовал, я знаю, что что-то имеет общее с SQL Сервер Брокер Service, где услуга посылает сообщения MSMQ, и с моего приложения я делаю pooling против MSMQ, но никогда я не видел пример осуществления.

Обновление

Хорошо, для contextualizar, куда применяется это, говорится о Системе Управления Складов на промышленном уровне. У системы есть около 15 услуг прокручивая изображение в окне в то же время и спрашивая у него в базу данных все время на движении продуктов и контейнеров, что - соответствующие зоны хранения.

По какой причине есть 15 услуг функционируя?

У склада, который использует эту систему управления, есть несколько линий со сканерами кода бруска читая около 10 этикеток в минуту вовремя я шифрую и, каждая из этой линии, у него есть услуга в особенности, потому что он изменяет логику в каждой линии и в каждой логике он делает проверку в различные услуги и существование вышеупомянутого штрих-кода в базе данных.

Кроме того, у него есть 10 AGV (Аутоматед Гидед Vehicle), у которых есть услуги как: Эмитент заданий для AGV, Проектировщика Заданий, Который они нужно реализовывать, и т.д. и эти находятся постоянно pooleando против базы данных ища новые задания, чтобы реализовывать. То же самое последует с конечными остановками рабочих подъемника за тем, что все время poolean база данных в поисках новых команд движения контейнеров.

Остается добавлять, что также получение, офис и хранение также автоматизированы, и у каждой из этих есть Ваш (s) собственный (s) услуга (s).

Почему система не имеет middleware?

Я должен доводить до сведения, что эта система, такой величины, не имеет middleware (что был бы славой, которая у него была бы, потому что он оплатил бы много архитектурных проблем), так как это система, приспособленная к старой системе 1995 года aprox. и другие системы более, где производство было ограничено для этих дат. Теперь, было нужно обновлять и у нас есть проблемы escalabilidad, чтобы увеличивать производство.

Чтобы это понимать, BL и DAL находятся на том же сервере и, поэтому, он не дает мне возможность распространять груз консультации данных.

Я довожу до сведения, что у приложения есть клиент, сделанный в WinForms, где они присоединяются в услуги (консольное приложение).

17
задан 09.07.2019, 06:31
3 ответа

Решение могло бы быть используя "Кери Нотификатионс", которые позволяют, с.NET, получать извещения изменений, реализованных в данных SQL Server. В этой статье о MSDN возможно видеть простой пример как обнаруживать изменения и получать события.

Также может быть интересно объединять это с SignalR для того, чтобы приложения-клиенты не были теми, которые соединяют прямо с SQL Server. В CodeProject есть статья "Реальный Тайм Notifications using SignalR and SQL Dependency", который очень интересен.

Я не знаю, если это решение будет предоставлять результат, который требуется, или если бы наоборот решением смогли быть вещи как SQL Сервер Р Services, ServiceBus...

10
ответ дан 03.12.2019, 23:20
  • 1
    Ты дал ему в гвозде. Справедливое то, в чем я нуждаюсь, чтобы оплачивать мою необходимость. – drielnox 14.12.2015, 19:45

Кроме того, что твоя система будет сильно централизована в SQL Server (и из-за того, что ты комментируешь, он это не кажется) не рекомендовал бы тебе SSBS.

Моя рекомендация состоит в том, чтобы это был твой middleware (там, где случился логический источник события) тот, который стреляет в X процесс (ej. приклеивать сообщение).

В особенном случае кэш-памяти, определением она не была бы должна быть обновленной в среде, распространенной (ej. ферма серверов, которые они обыскивают локально, ты консультируешь bbdd).

Если, о котором говорится, он состоит в том, чтобы поддерживать обысканную стоимость, такую свежую, как было возможно, тогда ты был бы должен оценивать использовать такие схемы как Memcached или сходные (redis...). Главным образом держится единственная кэш-память, имеемая всеми потребителями той же самой.

Если говорится о практике, осуществлять твой собственный memcache может быть развлеченным и интересно.

С другой стороны, может быть, захоти сообщить клиентам неких изменений, в таком случае существуют несколько стратегий, наиболее приведенная в соответствие в твоем случае, может быть, он был бы SignalR, но было бы нужно видеть твой конкретный случай, чтобы видеть, что он формирует взобранный, она самая подходящая.

В любом случае я повторяю, что, за исключением пунктуального мотива, ты поместил в логику контроль на разгрузке этой коммуникации (хорошо будьте кэш-памятью на обновленной стоимости, событии, которое ты пропагандируешь в клиента, и т.д....).

Из-за небольшого количества, которое я исследовал

Ты не описываешь никакой системы кэша (да извещения события). SSBS может посылать сообщения очереди и потом ты с приложения desencolas, такая простого, но эта схема очень жестка и соединена в базу данных, ты нуждаешься администратор очередей и кроме того, твой клиент должен делать pull (спрашивать у администратора очередей ясно, есть ли новые сообщения). Хотя ты не выставляешь конкретную проблему, оно не кажется самым подходящим (или, кажется, есть лучшие альтернативы).

7
ответ дан 03.12.2019, 23:20

Как часть решения, может быть, менее надежная, у тебя может быть DDL TRIGGER, который он вводил бы в таблице, если были изменения в остальных подмостках, и потом консультировать ее с твоего приложения, следующего способа:

CREATE TABLE TRG_TEST
(
ID INT,
NOMBRE_TABLA VARCHAR(50)
)

CREATE TRIGGER TRG_TABLES
ON DATABASE 
AFTER 
    ALTER_TABLE
AS 
    BEGIN
    SET NOCOUNT ON

    DECLARE @TABLE_NAME SYSNAME

    SELECT 
        @TABLE_NAME = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','SYSNAME')

    IF  @TABLE_NAME <> 'TRG_TEST'
    BEGIN
        INSERT INTO TRG_TEST VALUES (1,@TABLE_NAME)
    END

END
GO

Конечно есть лучший выбор, чтобы избегать санкционировать изменение в таблице, которую ты используешь, чтобы вводить изменения, такое что-то как SCHEMABINDING или сходно.

6
ответ дан 03.12.2019, 23:20
  • 1
    Это должен быть лучший opci и # 243; n, использовать trigger, который сообщал бы об изменении в какой-то таблице. – Jorgesys♦ 10.12.2015, 20:39

Теги

Похожие вопросы