【專案經驗】安裝服務時的總結
總結一
1、服務安裝軟體編寫時漏了呼叫一個函式,UpdateListView(),導致啟動服務,一直不重新整理狀態,除錯時一直抓著sc.start()不放,一直以為是這個問題。
報錯:
{System.InvalidOperationException: 無法開啟計算機“.”上的 OnlineService 服務。
---> System.ComponentModel.Win32Exception: 拒絕訪問。
--- 內部異常堆疊跟蹤的結尾 ---
在 System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
在 System.ServiceProcess.ServiceController.Start(String[] args)
在 ServerManager.ServiceAPI.RunService(String NameService) 位置 g:\大通\大通伺服器\ServerManager\ServiceAPI.cs:行號 88}
總結二
將服務應用程式改為服務時 步驟1:新建兩個元件Windows服務 分別命名為OnlineService和OnlineServiceInstaller.cs 引用新增System.Configuration.Install和System.ServiceProcess
OnlineService繼承ServiceBase,重寫OnStart( )和重寫OnStop( );
protected override void OnStart(string[] args)
{
m_server = new AsyncServer();
m_logger = new FileLogger();
m_server.SetLogger(m_logger);
m_logger.InitLogAPI(GlobalData.GetAppPath(), "OnlineServer.log");
ServerConfig config = new ServerConfig();
if (!config.ReadFile(GlobalData.GetAppPath() + "\\ServerConfig.xml"))
{
m_logger.Log ("無法讀取配置檔案!");
return;
}
if (config.DBServerInfo == null)
{
m_logger.Log("無法從配置檔案中讀取資料庫配置!");
return;
}
if (config.TCPServerInfo == null)
{
m_logger.Log("無法從配置檔案中讀取伺服器配置!");
return;
}
DBGlobal.SetDBServer(config.DBServerInfo.Server, config.DBServerInfo.DBName,
config.DBServerInfo.User, config.DBServerInfo.Password);
m_server.Start(config.TCPServerInfo.IP, config.TCPServerInfo.Port);
}
protected override void OnStop()
{
if (m_server.Runing)
{
m_server.Stop();
}
}
OnlineService.Designer.cs不作修改 OnlineServiceInstaller.cs元件上新增兩個控制元件 第一個是serviceInstaller1、第二個是serviceProcessInstaller1 OnlineServiceInstaller.Designer.cs中改寫
this.serviceInstaller1.Description = "MDIA Online Server";
this.serviceInstaller1.DisplayName = "OnlineService";
this.serviceInstaller1.ServiceName = "OnlineService";
OnlineServiceInstaller.cs
[RunInstaller(true)]
public partial class OnlineServiceInstaller : Installer
{
public OnlineServiceInstaller()
{
InitializeComponent();
}
}
//public不要忘了,會出現解除安裝不成功或者安裝不成功
static class Program
{
/// <summary>
/// 應用程式的主入口點。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// 同一程序中可以執行多個使用者服務。若要將
// 另一個服務新增到此程序中,請更改下行以
// 建立另一個服務物件。例如,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new OnlineService() };
ServiceBase.Run(ServicesToRun);
}
}
總結三
服務獲取AppPath時的不能再使用Windows.Form.
System.Windows.Forms.Application.StartupPath
static public string GetWindowsServiceInstallPath(string ServiceName)
{
string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
string path = Registry.LocalMachine.OpenSubKey(key).GetValue("ImagePath").ToString();
//替換掉雙引號
path = path.Replace("\"", string.Empty);
FileInfo fi = new FileInfo(path);
return fi.Directory.ToString();
}
static public string GetAppPath()
{
string strPath = GetWindowsServiceInstallPath("OnlineService");
return strPath;
}
總結四
Access資料庫連線報錯,未在本機註冊Micsoft.Access 驅動 解決辦法:安裝一個驅動Access驅動安裝包(64位的)
ODBC驅動方式:
Driver={Microsoft Access Driver (*.mdb)};Dbq=c:somepathdbname.mdb;Uid=Admin;Pwd=pass;
微軟的odbc驅動存在一些不穩定的bug,有可能導致此類錯誤。應該將其修改為oledb的access驅動方式。微軟本身已經放棄了對odbc資料來源連線方式的支援,並建議使用者使用oledb方式
OLEDB驅動方式:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:somepathdbname.mdb;User Id=admin;Password=pass;
32位系統
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:somepathdbname.mdb
64位系統
Access的SQL語句和SQLServer不一樣 accesss要用的是”#” +time.Text+ “#”,SQL是可以直接用單引號。 Access中* 為匹配多個字串,但是在C#編寫Access的模糊查詢中必須用 %才能查詢匹配%,但是,在Access中的SQL查詢中只能使用 *匹配查詢!