Прочитал руководство Microsoft по проектированию архитектуры приложений.
Как по мне, так получился неплохой хорошо структурированный справочник.
К примеру, проектируем слой представления, смотрим, ага здесь уместно будет использовать шаблоны MVC и Command. Так нужно бы поподробнее, кликаем по ссылке и попадаем на страницу MSDN, где эти шаблоны описаны и.т.д.
Собственно, руководство можно скачать здесь
P.S. Эх мечты, мечты ...
воскресенье, 28 марта 2010 г.
суббота, 13 марта 2010 г.
суббота, 6 марта 2010 г.
Пример применения WAITFOR DELAY
Такой вот небольшой примерчик. Допустим мы знаем, что некое действие на сервере (к примеру заполнение некой таблицы) закончиться примерно к 7.00, но точное время будет постоянно меняться. После того как таблица заполнится, нам необходимо выполнить какое-нибудь действие (к примеру сформировать отчеты и разослать их пользователям по почте).
Как это можно сделать? Я вижу несколько вариантов:
1. Запускать формирование отчетов сразу же после обновлений необходимой таблицы, к примеру прописав на таблице с логами триггер. Минус, пока не отработает триггер, не начнется следующий этап.
2. Создание user configurable trace event (не знаю как красиво перевести) используя sp_trace_generateevent. Вроде как грамотное решение. Так сказать событийная модель в SQL Server, я, правда, не разбирался со всякими там WMI Provider, WQL и другими страшными словами:) Но возможности которые открываются выглядят заманчиво. Может когда-нибудь разберусь, и буду использовать.
3. Я пока пришел к следующему решению. Создаем на сервере джоб, который стартует в предполагаемое время, ждет окончания обновлений, и делает свою работу (формирует отчеты). Естественно, минусы в том что на сервере вместе с основными обновлениями крутиться что-то еще есть. а) возрастает нагрузка на сервер; б)могут возникнуть блокировки, поэтому нужно следить что именно делается в джобе (как любит говорить один мой знакомый: "Один в #опе, два в уме", в моем случае в джобе идет Select из одной единственной таблицы, которая после обновлений не изменяется на протяжении всего дня, вроде проблем быть не должно).
Ну и в виде кода все это дело может выглядить примерно так:
Как это можно сделать? Я вижу несколько вариантов:
1. Запускать формирование отчетов сразу же после обновлений необходимой таблицы, к примеру прописав на таблице с логами триггер. Минус, пока не отработает триггер, не начнется следующий этап.
2. Создание user configurable trace event (не знаю как красиво перевести) используя sp_trace_generateevent. Вроде как грамотное решение. Так сказать событийная модель в SQL Server, я, правда, не разбирался со всякими там WMI Provider, WQL и другими страшными словами:) Но возможности которые открываются выглядят заманчиво. Может когда-нибудь разберусь, и буду использовать.
3. Я пока пришел к следующему решению. Создаем на сервере джоб, который стартует в предполагаемое время, ждет окончания обновлений, и делает свою работу (формирует отчеты). Естественно, минусы в том что на сервере вместе с основными обновлениями крутиться что-то еще есть. а) возрастает нагрузка на сервер; б)могут возникнуть блокировки, поэтому нужно следить что именно делается в джобе (как любит говорить один мой знакомый: "Один в #опе, два в уме", в моем случае в джобе идет Select из одной единственной таблицы, которая после обновлений не изменяется на протяжении всего дня, вроде проблем быть не должно).
Ну и в виде кода все это дело может выглядить примерно так:
USE [Temp] GO IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbLog]') AND type in (N'U') ) BEGIN DROP TABLE [dbo].[tbLog] END CREATE TABLE [dbo].[tbLog]( [Date] [datetime] NULL ) ON [PRIMARY] -- ------------------------------------------------------------ IF EXISTS ( SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spTestDelay]') AND type in (N'P', N'PC') ) BEGIN DROP PROCEDURE [dbo].[spTestDelay] END GO CREATE PROCEDURE [dbo].[spTestDelay] AS BEGIN DECLARE @Flag bit SET @Flag = 0 WHILE @Flag = 0 BEGIN -- waiting for updates IF EXISTS( SELECT 1 FROM [dbo].[tbLog] WHERE DATEDIFF(DAY, Date, GETDATE()) = 0 ) BEGIN -- Run necessary stored procedures SET @Flag = 1 END ELSE BEGIN WAITFOR DELAY '00:01' END END END