我一直在开发这个Windows服务,将一些数据从本地firebird数据库传输到SQL数据库。
我没有实际的安装程序安装程序,因为我只是掌握服务,但我确实包含了一个Project Installer,根据本教程 http://msdn.microsoft.com/en-us/library/zt39148a.aspx
以下是获得想法的开始:
namespace MyNewService
{
public partial class MyNewService : ServiceBase
{
public MyNewService()
{InitializeComponent();}
static Timer timer;
protected override void OnStart(string[] args)
{
this.AutoLog = false;
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource", "MyLog");
}
eventLog1.Source = "MySource";
timer = new Timer();
timer.Interval = 10000;//set interval
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
start_timer();
}
private void start_timer()
{
eventLog1.WriteEntry("In OnStart.");
timer.Start();
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
eventLog1.WriteEntry("Starting Work. Time elapsed" + timer.Interval);
string connFb = ConfigurationManager.ConnectionStrings["FbConString"].ConnectionString;
FbConnection FbCon = new FbConnection(connFb);
string connSql = ConfigurationManager.ConnectionStrings["SqlConString"].ConnectionString;
SqlConnection SqlCon = new SqlConnection(connSql);
try
{
FbCon.Open();
SqlCon.Open();
}
catch (Exception e0)
{
eventLog1.WriteEntry("----------Exception Message: {0}" + e0.Message);
}
string FB1 = "SELECT FIRST 500 * FROM SC_JOBS ……";
string sql1 = ("UPDATE Jobs SET JobID = @JId, …..)");
using (FbCommand Command = new FbCommand(FB1, FbCon))
{
//Console.Write(line);
DateTime date = new DateTime(2013, 1, 1, 0, 0, 0);
try{
Command.Parameters.AddWithValue("@DT", date);
using (FbDataReader DbReader = Command.ExecuteReader())
while (DbReader.Read())
{
var Job = new Job();
Job.JobID = Convert.ToInt32(DbReader["JOBSID"]);
// Some more processing going on...//
这是我的Appconfig
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.diagnostics>
<switches></switches>
</system.diagnostics>
<connectionStrings>
<add name="SqlConString" connectionString="user id=...; password=...;server=213.171....; database=...;MultipleActiveResultSets=True" />
<add name="FbConString" connectionString="User=…;Password=….;Database=192.168…:C:\\Window Designer 7\\Database\\fdsdatabase.fds;DataSource=192.168….;Port=3050;Dialect=3;" providerName="FirebirdSql.Data.FirebirdClient"/>
</connectionStrings>
</configuration>
我使用 installutil 安装该服务,并且至少在我的系统上,该服务运行完全正常。它也没有依赖项(只是一个firebird dll,它包含在带有服务exe的bin / debug文件夹中) 当我在另一台电脑上试用它(Windows 8 / .NET framework 4.5 / Visual studio express)时,它会因为我难以理解的原因而启动和停止。
我没有得到任何日志消息 我确实在事件查看器(Windows日志/应用程序)中遇到了这个错误,但只发生过一次:
“服务被标记为交互式服务。但是,系统配置为不允许交互式服务“
所以这就是我到目前为止所尝试的内容:
我知道这个问题之前已经被问了很多,但是我所经历的解决方案并没有让我失望。我正处于这个项目的最后期限,因此非常感谢任何帮助
答案 0 :(得分:0)
根据我的经验,服务开始并立即停止的情况有两个原因之一。
第一个原因是程序员没有服务做任何事情,即它没有运行一个线程来保持服务的运行。鉴于您的服务适用于您的计算机,这不是问题。
第二个原因是服务构造函数或OnStart
回调中发生异常。查看您的代码,您的服务构造函数是最小的,所以我怀疑问题出在哪里。但是,您的OnStart
回调会尝试与事件日志进行交互,这需要一定量的提升用户权限。如果我不得不猜测,我会说试图检查是否&#34;我的来源&#34;存在或(更有可能)创建&#34;我的来源&#34;事件源正在抛出一个未被捕获或以某种方式记录的异常。要验证这一点,最好在问题机器上调试服务。当然,如果您有足够的用户权限,则可能无法实现。因此,您可以在OnStart
的内容周围放置一个try-catch块,如果发生异常,请在您有权访问的文件夹中创建一个文本文件(例如,您的Users文件夹)并编写该文件的异常内容,包括堆栈跟踪,以便您可以更清楚地了解正在发生的事情。
如果问题不在OnStart
回调中,则下一个要检查的位置是您的计时器回调函数。
HTH