C#:在备份sql数据库时出现了令人讨厌的错误

时间:2013-07-10 12:05:22

标签: c# database backup

我正在尝试制作我的应用程序,其目的是在磁盘上备份数据库并通过ftp或邮件发送它。 所以我做了一个研究,最后我写了一个Windows服务项目和另一个正在进行数据库备份的控制台项目。两者都运行良好,两者都是在同一个Visual Studio中编写的,但是当我试图在Windows服务中放置备份代码时,它不起作用。我不明白为什么。我试过把代码而不是示例(创建一个文件并在那里写一行,这部分工作得很好)我甚至尝试用另一种方法来做,然后调用这个方法。

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 management studio中创建了一个数据库帐户(不是Windows帐户),我将此帐户的用户ID和密码直接放入我的Windows服务中的C#代码中。 无论如何也许有人会使用我的代码:) 谢谢你的回复。

2 个答案:

答案 0 :(得分:0)

您是否检查过Windows服务是否有权在您指定的位置编写文件。服务不一定以用户身份运行,因此不要假设您可以在哪里编写文件服务。

您是否尝试过写入c:\ ProgramData?

下的文件夹?

如果您不确切知道问题是什么,那么您需要找出答案。尝试在服务启动时添加System.Diagnostics.Debugger.Launch();,然后跟踪调试器内的更改。

答案 1 :(得分:0)

您编写的Windows服务正在为您的SQL Server使用“集成安全性”。

如果您不想在代码中输入登录凭据,则应将执行用户设置为本地帐户,或者在SQL Management Studio中授予所需用户(例如LocalSystem)对数据库的访问权限。

通常,Windows服务作为LocalSystem,LocalService或NetworkService运行。只需在services.msc中更改Windows服务的设置

即可