1

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

Windows 服务与此处和 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# 中的代码中。无论如何,也许有人会使用我的代码 :) 感谢您的回复。

4

2 回答 2

0

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

您是否尝试过写入 c:\ProgramData 下的文件夹?

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

于 2013-07-10T12:08:43.583 回答
0

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

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

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

于 2013-07-10T12:17:50.810 回答