- - PR -
Windowsサービスを使って一定周期でDBアクセスしたいのですが
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-11-10 10:06
言語:VisualStdio2008 C#
DB:SQL Server2005 Windowsサービスを使用して一定周期でDBへアクセスしたいのですが 一定周期でDBにアクセスするには、どのような仕組みにした方が 理想的なのでしょうか? 現在、Windowsサービスの中でSystem.Threadingのtimerを使用して 10秒間隔でクラスライブラリのメソッドを呼んでいます。 メソッドでは、DBへアクセスした結果を戻り値としてWindowsサービス返しています。 この場合、1回の処理のみで、次の10行後の処理が動きません。 どなたかすみません、ご教授ください。お願いします。 |
|
投稿日時: 2008-11-10 10:41
現在、Windowsサービスの中でSystem.Threadingのtimerを使用して
10秒間隔でクラスライブラリのメソッドを呼んでいます。 メソッドでは、DBへアクセスした結果を戻り値としてWindowsサービス返しています。 この場合、1回の処理のみで、次の10行後の処理が動きません。 --------------------------------------------------------------- 上記で発生している原因が、 LINQの部分をコメントにして、サービスを開始したら一定周期で動作しました。 どうもLINQを使ってSELECTしているのが原因と考えられるのですが、対処方法はあるのでしょうか? 知っている方がいらっしゃいましたら、ご教授お願いします。 |
|
投稿日時: 2008-11-10 12:34
今提示されている情報からは、LINQ 式が間違っているのだろう、という推測が出来るだけです。
もうちょっと、原因を絞り込みましょう。 |
|
投稿日時: 2008-11-10 13:09
Jittaさん、ありがとうございます。
LINQの処理については、WINDOWSサービス以外では、正常に動作しています。 今回、Windowsサービスの中に移植したのですが、1回しか動作せずに 次の周期イベントに移りません。 接続文字列の設定が不足しているのでしょうか? 接続文字列については、以下に示します。 ConnectionString = "Data Source=test001;Initial Catalog=pubs;IntegratedSecurity=True"; |
|
投稿日時: 2008-11-10 15:15
プロジェクト:Windowsサービス
以下のソースから10秒周期で動作させているのですが 最初の処理では、正常にテーブルから目的の値を取得できるのですが 次の10秒後の処理にはいかずにイベントログで確認すると OnStartメソッドに遷移しているのですが、記述が誤っているのでしょうか? ご教授頂けないでしょうか? 宜しくお願いします。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; namespace DBWebControlService { public partial class DBWebControlService : ServiceBase { //接続文字列 private static string ConnectionString = "Data Source=TEST001;Initial Catalog=pubs;Integrated Security=True"; private static DataClassesDataContext dtc = new DataClassesDataContext(ConnectionString); public DBWebControlService() { InitializeComponent(); String sMessage = "タイマー監視:" + Convert.ToString(DateTime.Now); EventLog.WriteEntry(sMessage); Run(); } /// <summary> /// 10秒周期でイベントを発生させる /// </summary> public void Run() { TimerCallback timerDelegate = new TimerCallback(MyClock); Timer timer = new Timer(timerDelegate, null, 0, 10000); } public void MyClock(object o){ // String sStatus = ""; // WEBCOMMANDsテーブル var vRtuWebCmd = from p in dtc.WEBCOMMANDs where p.KEY_NO == 1 select p; if (vRtuWebCmd.Count() > 0) { foreach (var item in vRtuWebCmd) { String sStatus = item.IP; } } sMessage = "タイマー監視結果:" + Convert.ToString(DateTime.Now) + ":" + sStatus; // ↓↓↓↓↓↓↓↓↓↓↓↓結果をイベントログに出力後、OnStartに遷移している。 EventLog.WriteEntry(sMessage); } protected override void OnStart(string[] args) { EventLog.WriteEntry("開始しました"); } protected override void OnStop() { EventLog.WriteEntry("停止しました"); } } } |
|
投稿日時: 2008-11-10 15:36
失礼しました。解決しました。
|
1