2013-07-10 38 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; 
    } 
} 

}

當然所有的庫以及鏈接。

尋找任何建議,請幫助我。

預先感謝您,祝您有美好的一天。

編輯: 嘿,問題解決了。 我在sql管理工作室創建了一個數據庫帳戶(不是Windows帳戶),並且將這個帳戶的用戶ID和密碼直接放到了我的C#代碼中。 無論如何,也許有人會使用我的代碼:) 感謝您的答覆。

+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使用「集成安全性」。

如果您不想在代碼中輸入登錄憑據,則應該將執行用戶設置爲本地帳戶,或者在SQL Management Studio中授予所需用戶(例如LocalSystem)訪問數據庫的權限。

通常,Windows服務作爲LocalSystem,LocalService或NetworkService運行。只需在服務中更改Windows服務的設置即可。msc

+0

謝謝,我應該有「集成安全性」設置爲'真'或'sspi',我也嘗試將代碼中的用戶ID和密碼,但它並沒有幫助仍然 這個關於代碼帳戶的設置應該沒問題,因爲在控制檯的版本中,一切都會正常工作 服務中.msc我試了很多LocalSystem,LocalService,肯定不是NetworkService,無論如何我也試過 – user2399117