我正在尝试制作我的应用程序,其目的是在磁盘上备份数据库并通过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#代码中。 无论如何也许有人会使用我的代码:) 谢谢你的回复。
答案 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服务的设置
即可