Вставка базы данных в FileSystemEventHandler с Windows Service - PullRequest
0 голосов
/ 26 февраля 2019

Мне удалось заставить Службу работать вместе со вставкой FileSystemEventHandler в текстовый файл, но теперь это нужно изменить, чтобы вставить в базу данных и текстовый файл.

using System;  
using System.Collections.Generic;  
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;  
using System.IO;  
using System.Linq;  
using System.ServiceProcess;  
using System.Text;  
using System.Threading.Tasks;  
using System.Timers;  
namespace WindowsServiceTest
{
    public partial class Service1 : ServiceBase
    {
        Timer timer = new Timer(); // name space(using System.Timers;)  
        public static string path = ConfigurationManager.AppSettings["findpath"];
        public Service1()
        {
            InitializeComponent();
        } 

        protected override void OnStart(string[] args)
        {
            WriteToFile("Service is started at " + DateTime.Now);
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = 10000; //number in milisecinds  
            timer.Enabled = true;
            FileSystemWatcher watcher = new FileSystemWatcher
            {
                Path = path,
                NotifyFilter = NotifyFilters.LastWrite,
            };
            watcher.Created += new FileSystemEventHandler(FileSystemWatcher_Changed);
            watcher.Renamed += new RenamedEventHandler(FileSystemWatcher_Renamed);
            watcher.Changed += new FileSystemEventHandler(FileSystemWatcher_Changed);
            watcher.EnableRaisingEvents = true;
        }

        public static void FileSystemWatcher_Changed(object source, FileSystemEventArgs e)
        {
            using (SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Database=ServiceTest;Integrated Security=True;"))
            {
                try
                {
                    con.Open();
                    var command = new SqlCommand("Insert into test(URL, Location) values(@URL, @agendaname);", con);
                    command.Parameters.Add("@URL", System.Data.SqlDbType.VarChar, 100).Value = e.Name;
                    command.Parameters.Add("@agendaname", System.Data.SqlDbType.VarChar, 100).Value = "Case History";
                    command.ExecuteNonQuery();
                }
                catch
                {
                    WriteToFile($"Failed to insert: {e.Name} into the database");
                }
            }
        }
        public static void FileSystemWatcher_Renamed(object source, RenamedEventArgs e)
        {
            WriteToFile($"File Renamed: {e.OldFullPath} renamed to {e.FullPath}");
        }
        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            WriteToFile("Service is recalled at " + DateTime.Now);
        }
        protected override void OnStop()
        {

            WriteToFile("Service is stopped at " + DateTime.Now);
        }

        public static void WriteToFile(string Message)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + "\\Logs";
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            string filepath = AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
            if (!File.Exists(filepath))
            {
                // Create a file to write to.   
                using (StreamWriter sw = File.CreateText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
            else
            {
                using (StreamWriter sw = File.AppendText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
        }
    }
}

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

Любая помощь приветствуется, с уважением.

1 Ответ

0 голосов
/ 26 февраля 2019

Службы Windows работают в другом контексте безопасности, чем консольные приложения.Как показали комментарии, исключение относится к вашей строке подключения.Если мы проанализируем строку connectiong, мы увидим, что вы аутентифицируетесь с помощью IntegratedSecurity="True"., поскольку ваша служба Windows работает под учетной записью службы, сбой аутентификации.Я указал 2 варианта решения этой проблемы.

Вариант 1. Служба запускается под учетной записью Windows (не рекомендуется, но будет работать для тестирования)

  1. Открыть окно запуска (Win Flag + R)
  2. Тип Services.MSC
  3. Найдите свой сервис и щелкните правой кнопкой мыши свойства
  4. Выберите вкладку входа в систему
  5. Введите имя пользователя и пароль для входа в Windows, чтобы служба работала как

Вариант 2: создать учетную запись SQL Server

  1. Создать имя пользователя и пароль в SQL для базы данных
  2. Обновить строку подключения, чтобы указать новыйимя пользователя и пароль созданы
...