- PR -

Windowsサービスを使って一定周期でDBアクセスしたいのですが

1
投稿者投稿内容
しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 2008-11-10 10:06
言語:VisualStdio2008 C#
DB:SQL Server2005

Windowsサービスを使用して一定周期でDBへアクセスしたいのですが
一定周期でDBにアクセスするには、どのような仕組みにした方が
理想的なのでしょうか?


現在、Windowsサービスの中でSystem.Threadingのtimerを使用して
10秒間隔でクラスライブラリのメソッドを呼んでいます。
メソッドでは、DBへアクセスした結果を戻り値としてWindowsサービス返しています。
この場合、1回の処理のみで、次の10行後の処理が動きません。

どなたかすみません、ご教授ください。お願いします。
しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 2008-11-10 10:41
現在、Windowsサービスの中でSystem.Threadingのtimerを使用して
10秒間隔でクラスライブラリのメソッドを呼んでいます。
メソッドでは、DBへアクセスした結果を戻り値としてWindowsサービス返しています。
この場合、1回の処理のみで、次の10行後の処理が動きません。
---------------------------------------------------------------
上記で発生している原因が、
LINQの部分をコメントにして、サービスを開始したら一定周期で動作しました。
どうもLINQを使ってSELECTしているのが原因と考えられるのですが、対処方法はあるのでしょうか?
知っている方がいらっしゃいましたら、ご教授お願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-11-10 12:34
今提示されている情報からは、LINQ 式が間違っているのだろう、という推測が出来るだけです。
もうちょっと、原因を絞り込みましょう。
しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 2008-11-10 13:09
Jittaさん、ありがとうございます。

LINQの処理については、WINDOWSサービス以外では、正常に動作しています。
今回、Windowsサービスの中に移植したのですが、1回しか動作せずに
次の周期イベントに移りません。
接続文字列の設定が不足しているのでしょうか?

接続文字列については、以下に示します。
ConnectionString =
"Data Source=test001;Initial Catalog=pubs;IntegratedSecurity=True";

しん
ベテラン
会議室デビュー日: 2008/05/27
投稿数: 63
投稿日時: 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/05/27
投稿数: 63
投稿日時: 2008-11-10 15:36
失礼しました。解決しました。
1

スキルアップ/キャリアアップ(JOB@IT)