Наблюдатель реестра C#

Я думаю, что вы можете сделать это с помощью одной агрегации:

select (case when max(Story_Resolutiondate) < '2019-01-01' then 1 else month(max(Story_Resolutiondate))
        end) as monat,
       (case when max(Story_Resolutiondate) < '2019-01-01' then 2019 else year(max(Story_Resolutiondate))
        end) as jarh,
       v.projectId,
       count(distinct StoryId)
from [Story] s join
     [Epic] e 
     on s.EpicID = e.EpicID join
     [Project] v 
     on e.ProjectID = v.ProjectID
group by v.ProjectId;

Я не на 100% считаю то, что вы хотите. Ваши данные предполагают, что вы хотите считать месяцев , но ваш запрос имеет другую логику. Либо вполне выполнимо.

РЕДАКТИРОВАТЬ:

Я думаю union all может делать то, что вы хотите:

select 1 as monat, 2019 as jarh, v.projectId, count(distinct StoryId)
from [Story] s join
     [Epic] e 
     on s.EpicID = e.EpicID join
     [Project] v 
     on e.ProjectID = v.ProjectID
group by v.ProjectId
having max(Story_Resolutiondate) < '2019-01-01'
union all
select month(Story_Resolutiondate) as monat, 
       year(Story_Resolutiondate) as jahr,
       v.projectId, count(distinct StoryId)
from [Story] s join
     [Epic] e 
     on s.EpicID = e.EpicID join
     [Project] v 
     on e.ProjectID = v.ProjectID
where Story_Resolutiondate >= '2019-01-01'
group by v.ProjectId, year(Story_Resolutiondate), month(Story_Resolutiondate)
20
задан Andrew Ensley 11 May 2009 в 18:28
поделиться

4 ответа

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

// --------------------------------------------------------------------------------------------------------------------- 
// <copyright file="Program.cs" company="">
//   
// </copyright>
// <summary>
//   Defines the WmiChangeEventTester type.
// </summary>
// ---------------------------------------------------------------------------------------------------------------------
namespace WmiExample
{
    using System;
    using System.Management;

    /// <summary>
    /// </summary>
    public class WmiChangeEventTester
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="WmiChangeEventTester"/> class.
        /// </summary>
        public WmiChangeEventTester()
        {
            try
            {
                // Your query goes below; "KeyPath" is the key in the registry that you
                // want to monitor for changes. Make sure you escape the \ character.
                WqlEventQuery query = new WqlEventQuery(
                     "SELECT * FROM RegistryValueChangeEvent WHERE " +
                     "Hive = 'HKEY_LOCAL_MACHINE'" +
                     @"AND KeyPath = 'SOFTWARE\\Microsoft\\.NETFramework' AND ValueName='InstallRoot'");

                ManagementEventWatcher watcher = new ManagementEventWatcher(query);
                Console.WriteLine("Waiting for an event...");

                // Set up the delegate that will handle the change event.
                watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);

                // Start listening for events.
                watcher.Start();

                // Do something while waiting for events. In your application,
                // this would just be continuing business as usual.
                System.Threading.Thread.Sleep(100000000);

                // Stop listening for events.
                watcher.Stop();
            }
            catch (ManagementException managementException)
            {
                Console.WriteLine("An error occurred: " + managementException.Message);
            }
        }

        /// <summary>
        /// </summary>
        /// <param name="sender">
        /// The sender.
        /// </param>
        /// <param name="e">
        /// The e.
        /// </param>
        private void HandleEvent(object sender, EventArrivedEventArgs e)
        {
            Console.WriteLine("Received an event.");
            // RegistryKeyChangeEvent occurs here; do something.
        }

        /// <summary>
        /// </summary>
        public static void Main()
        {
            // Just calls the class above to check for events...
            WmiChangeEventTester receiveEvent = new WmiChangeEventTester();
        }
    }
}
27
ответ дан 30 November 2019 в 00:27
поделиться

Вам нужно будет использовать WMI для него. См. http://msdn.microsoft.com/en-us/library/aa393035.aspx

0
ответ дан 30 November 2019 в 00:27
поделиться

Вы ограничены WMI? Если нет, вы можете использовать обертки RegNotifyChangeKeyValue , такие как RegistryMonitor

3
ответ дан 30 November 2019 в 00:27
поделиться

You really don't need WMI, as others have pointed out. I too have used RegistryMonitor with no problems.

If you need an example, there's already example code for the RegistryMonitor on the page itself. Did you scroll down to this bit on the code project:

public class MonitorSample
{
    static void Main() 
    {
        RegistryMonitor monitor = new 
          RegistryMonitor(RegistryHive.CurrentUser, "Environment");
        monitor.RegChanged += new EventHandler(OnRegChanged);
        monitor.Start();

        while(true);

        monitor.Stop();
    }

    private void OnRegChanged(object sender, EventArgs e)
    {
        Console.WriteLine("registry key has changed");
    }
}
2
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

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