2013-07-10 2 views
1

Я пытаюсь сделать свое приложение, целью которого является сделать резервную копию базы данных на диске, а также отправить ее через ftp или почту. Итак, я сделал исследование и, наконец, написал проект службы Windows и еще один проект на консоли, который создает резервную копию базы данных. Оба работают хорошо, и оба они написаны в той же Visual Studio, но когда я пытаюсь поместить код создания резервных копий в службу Windows, он не работает. Я не понимаю, почему. Я попытался поставить код вместо примера (который создает файл и записывает одну строку там, и эта часть работает хорошо), и я даже попытался сделать другой метод, чтобы сделать это, а затем вызвать этот метод.C#: раздражающая ошибка при создании резервной копии базы данных sql

служба

Windows, полностью такой же, как here и в классе SpadesAdminService вместо

System.Diagnostics.EventLog.WriteEntry("SpadesAdminSvc", 
             ServiceName + "::Execute()"); 

я сделал этот код (работает хорошо - сделать пустой файл на моем диске каждые 5 секунд, должно быть написано «текст в файл», но файлы появляются):

using (FileStream fs = File.OpenWrite("C:\\place\\" + DateTime.Now.ToString("ddMMyyyy_HHmmss") + ".txt")) 
     { 
      Byte[] napis = new UTF8Encoding(true).GetBytes("text to files")); 
      fs.Write(napis, 0, napis.Length); 
     } 

Мой класс решений резервного копирования (одна также работает хорошо):

namespace makeBackUpConsole 
{ 
class Program 
{ 

    static void Main(string[] args) 
    { 
     string dbname = "exampleToniDatabase"; 
     SqlConnection sqlcon = new SqlConnection(); 
     SqlCommand sqlcmd = new SqlCommand(); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataTable dt = new DataTable(); 
     sqlcon.ConnectionString = @"Server=GRAFIKA-2\SQLEXPRESS;Integrated Security=True;" + "Database=exampleToniDatabase"; 
     string destdir = "C:\\place\\"; 
     if (!System.IO.Directory.Exists(destdir)) 
     { 
      System.IO.Directory.CreateDirectory("C:\\place\\"); 
     } 
     try 
     { 
      sqlcon.Open(); 
      sqlcmd = new SqlCommand("backup database " + dbname + " to disk='" + destdir + "\\" + DateTime.Now.ToString("ddMMyyyy_HHmmss") + ".Bak'", sqlcon); 
      sqlcmd.ExecuteNonQuery(); 
      sqlcon.Close(); 
      MessageBox.Show("Backup database successfully"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error During backup database!"); 
     } 
    } 
} 
} 

Я копирую этот класс вместо моего кода, чтобы файлы txt и служба Windows не работали. Вот код:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.ServiceProcess; 
using System.IO; 
using System.Text; 

using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

namespace toni.exampleService.Services 
{ 
public class exampleAdminService : exampleServiceBase 
{ 
    public exampleAdminService() 
    { 
     this.ServiceName = "exampleAdminSvc"; 
    } 
    protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
    } 
    protected override void OnStop() 
    { 
     base.OnStop(); 
    } 
    protected override int Execute() 
    { 
     //using (FileStream fs = File.OpenWrite("C:\\development\\toni\\dd\\" + DateTime.Now.ToString("ddMMyyyy_HHmmss") + ".txt")) 
     //{ 
     // Byte[] napis = new UTF8Encoding(true).GetBytes("Dzień i godzina: " + DateTime.Now.ToString("ddMMyyyy_HHmmss")); 
     // fs.Write(napis, 0, napis.Length); 
     //} 

     string dbname = "exampleToniDatabase"; 
     SqlConnection sqlcon = new SqlConnection(); 
     SqlCommand sqlcmd = new SqlCommand(); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataTable dt = new DataTable(); 

     sqlcon.ConnectionString = @"Server=GRAFIKA-2\SQLEXPRESS;Integrated Security=True;" + "Database=exampleToniDatabase"; 

     string destdir = "C:\\place\\"; 

     if (!System.IO.Directory.Exists(destdir)) 
     { 
      System.IO.Directory.CreateDirectory("C:\\place\\"); 
     } 
     try 
     { 
      sqlcon.Open(); 
      sqlcmd = new SqlCommand("backup database " + dbname + " to disk='" + destdir + "\\" + DateTime.Now.ToString("ddMMyyyy_HHmmss") + ".Bak'", sqlcon); 
      sqlcmd.ExecuteNonQuery(); 
      sqlcon.Close(); 
      MessageBox.Show("Backup database successfully"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error During backup database!"); 
     } 
     return 0; 
    } 
} 

}

Конечно все библиотеки, а также связаны между собой.

Ищите любые советы, пожалуйста, помогите мне.

Заранее благодарю вас за приятный день.

Редактировать: Эй, проблема решена. Я создал учетную запись базы данных (не учетную запись Windows) в студии управления sql, и я поместил эту учетную запись User Id и Password непосредственно в свой код на C# в службе Windows. В любом случае, возможно, кто-то будет использовать мой код :) Спасибо за ответ.

+1

«не работает» - как именно он не работает? Ошибка компилятора? Исключение брошено? Компьютерное плавление? – Corak

+0

какой пользователь выполняет службу Windows? Кажется, что это проблема управления правами ... – chris6523

+0

@Corak Извините, что не описал это, «не работает» означает, что это компиляция, затем я устанавливаю службу, и когда я включаю эту службу, работает некоторое время (~ 5 секунд) и всегда останавливается, файл не появляется. Без исключений. Просто обслуживание отключается собой через несколько секунд, забывая о моем файле. – user2399117

ответ

0

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

Вы пытались написать в папку под c: \ ProgramData?

Если вы не знаете точно, в чем проблема, тогда вам нужно выяснить это. Попробуйте добавить System.Diagnostics.Debugger.Launch(); при запуске службы и затем отслеживать изменения внутри отладчика.

+0

тот же сервис Windows может сделать в том же файле .txt файла, но есть проблема, чтобы поставить .bak там .. поэтому я не думаю, что это касается разрешения. Я попробовал C: \ ProgramData также не появляется мой файл :( Я буду читать больше о System.Diagnostics.Debugger.Launch(); СПАСИБО! – user2399117

0

Служба Windows, которую вы запрограммировали, использует «Интегрированную безопасность» для вашего SQL Server.

Если вы не хотите вводить учетные данные в своем коде, вы должны либо установить исполняющего пользователя в свою локальную учетную запись, либо предоставить доступному пользователю (например, LocalSystem) доступ к вашей базе данных в вашей SQL Management Studio.

Обычно служба Windows работает как LocalSystem, LocalService или NetworkService. Просто измените настройки для службы Windows в службах.msc

+0

спасибо, я должен был установить «Intergrated Security» для «true» 'или' sspi ', я попробовал также поместить идентификатор пользователя и пароль в код, но он еще не помог , что эти настройки об учетной записи в коде должны быть в порядке, потому что в версии на консоли все идет хорошо с этими данными в службе .msc Я много пробовал с LocalSystem, LocalService и наверняка не NetworkService, так или иначе я тоже пытался – user2399117

Смежные вопросы