using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data.Common;
using System.Messaging;
using System.Threading;
using System.Diagnostics;
using System.ServiceProcess;
using CJIJ.DataCore;
namespace CJIJ.AdverServer
{
public class AdverServerWinSvc : System.ServiceProcess.ServiceBase
{
///
/// 필수 디자이너 변수입니다.
///
private System.ComponentModel.Container components = null;
private System.Diagnostics.EventLog eventLog1;
private System.Timers.Timer timer1;
public System.Messaging.MessageQueue msmq;
public System.Messaging.Message msg;
//public businessLogic BOobj;
public AdverServerWinSvc()
{
// 이 호출은 Windows.Forms 구성 요소 디자이너에 필요합니다.
InitializeComponent();
timer1.Enabled = true;
timer1.Interval = 25;
timer1.Elapsed += new System.Timers.ElapsedEventHandler(MQReader);
// TODO: InitComponent를 호출한 다음 초기화 작업을 추가합니다.
}
// 프로세스의 주 진입점입니다.
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
// 같은 프로세스 내에서 둘 이상의 사용자 서비스가 실행될 수 있습니다.
// 이 프로세스에 다른 서비스를 추가하려면 두 번째 서비스 개체를 만들도록
// 다음 줄을 변경합니다. 예를 들면 다음과 같습니다.
//
// ServicesToRun = New System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new AdverServerWinSvc() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
///
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
///
private void InitializeComponent()
{
this.timer1 = new System.Timers.Timer();
this.eventLog1 = new System.Diagnostics.EventLog();
((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
//BOobj = new businessLogic("Data Source=210.174.197.113; Initial Catalog=Advertisement_Action; User Id=webaccount; Password=&dnpqdblog%^&");
//BOobj = new businessLogic("server=210.174.197.113; database=Advertisement_Action; uid=webaccount; pwd=&dnpqdblog%^&");
this.timer1.Enabled = true;
this.CanPauseAndContinue = true;
this.ServiceName = "CJIJ_Advertisement";
((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();
MQPrepared();
}
public void MQReader(object sender, System.Timers.ElapsedEventArgs e)
{
msg = msmq.Receive(new TimeSpan(0,0,0,10));
msg.Formatter = new XmlMessageFormatter(new String[] {"System.String,mscorlib"});
MQDoStored(msg);
}
private void MQPrepared()
{
//MQ 없으면 생성 있으면 해당 큐 객체 반환
if(MessageQueue.Exists(@".\Private$\CJIJAdvertisement02"))
msmq = new System.Messaging.MessageQueue(@".\Private$\CJIJAdvertisement02");
else
msmq = MessageQueue.Create(@".\Private$\CJIJAdvertisement02");
}
private int MQDoStored(Message objMsg)
{
int returnValue, AdvertisementCD, nGender, nAge;
//MQ 메세지 받아서 데이터로 저장하는 곳
string strLabel = objMsg.Label.ToString();
string strBody = (string)objMsg.Body.ToString();
string [] vData = strBody.Split(new Char [] {'_'});
AdvertisementCD = Convert.ToInt16(vData[0].ToString());
nGender = Convert.ToInt16(vData[1].ToString());
nAge = Convert.ToInt16(vData[2].ToString());
returnValue = AdverStat_Log(strLabel, AdvertisementCD, nGender, nAge);
//returnValue = BOobj.AdverStat_Log(strLabel, AdvertisementCD, nGender, nAge);
if(returnValue == -1)
{
Err_EventLogWrite("MQDoStore Failed / Label : " + strLabel + " / Body : " + AdvertisementCD.ToString() + "_" + nGender.ToString() + "_" + nAge.ToString());
}
return returnValue;
}
public static int AdverStat_Log(string procName, int AdvertisementCD, int nGender, int nAge)
{
//MQ 메세지 받아서 데이터로 저장하는 곳
int returnValue = 0;
int effectrow = 0;
string connAdvertisement_Action;
connAdvertisement_Action = "Network Library=DBMSSOCN; Data Source=210.174.197.112; User ID=webaccount; Password=&dnpqdblog%^&; Initial Catalog=Advertisement_Action";
DbObject obj = new DbObject(connAdvertisement_Action);
switch(procName.ToLower())
{
case "impression":
procName="up_Adsmanager_Impression_Action_set";
break;
case "click":
procName="up_Adsmanager_Click_Action_set";
break;
default:
procName="up_Adsmanager_Impression_Action_set";
break;
}
SqlParameter[] parameters = {
new SqlParameter("@AdvertisementCD", SqlDbType.Int, 4),
new SqlParameter("@nGender", SqlDbType.TinyInt, 2),
new SqlParameter("@nAge", SqlDbType.SmallInt, 4)
};
parameters[0].Value = AdvertisementCD;
parameters[1].Value = nGender;
parameters[2].Value = nAge;
try
{
returnValue = obj.RunProcedure(procName, parameters, out effectrow);
return returnValue;
}
catch(SqlException e)
{
AdverServerWinSvc.Err_EventLogWrite("DbObject Failed / Err Number : " + e.Number+ " / Err Source : " + e.Source + " / Err Message : " + e.Message + " / Err ProcName" + e.Procedure);
return -1;
}
finally
{
obj = null;
}
}
///
/// 사용 중인 모든 리소스를 정리합니다.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
public static void Err_EventLogWrite(Exception e)
{
if (!System.Diagnostics.EventLog.SourceExists("CJIJ_Advertisement"))
{
System.Diagnostics.EventLog.CreateEventSource("CJIJ_Advertisement", "CJIJ_Advertisement_Err");
}
System.Diagnostics.EventLog EventLog1 = new System.Diagnostics.EventLog();
EventLog1.Source = "CJIJ_Advertisement";
EventLog1.WriteEntry(e.Message);
}
public static void Err_EventLogWrite(string strLogMsg)
{
if (!System.Diagnostics.EventLog.SourceExists("CJIJ_Advertisement"))
{
System.Diagnostics.EventLog.CreateEventSource("CJIJ_Advertisement", "CJIJ_Advertisement_Log");
}
System.Diagnostics.EventLog EventLog1 = new System.Diagnostics.EventLog();
EventLog1.Source = "CJIJ_Advertisement";
EventLog1.WriteEntry(strLogMsg);
}
///
/// 서비스가 작업을 수행할 수 있도록 필요한 동작을 설정합니다.
///
protected override void OnStart(string[] args)
{
Err_EventLogWrite("CJIJ Advertisememt Win Svc Start (email : sorry every one)");
}
protected override void OnContinue()
{
this.timer1.Enabled=true;
InitializeComponent();
}
///
/// 이 서비스를 중지합니다.
///
protected override void OnStop()
{
this.timer1.Enabled=false;
Err_EventLogWrite("CJIJ Advertisememt Win Svc End (email : sorry evenyone~)");
}
}
}
-------------------- DATA BASE Query Global ------------------------
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace CJIJ.DataCore
{
///
/// Class1에 대한 요약 설명입니다.
///
public class DbObject
{
protected SqlConnection Connection;
private string connectionString;
public DbObject(string newConnectionString)
{
connectionString = newConnectionString;
Connection = new SqlConnection(connectionString);
}
protected string ConnectionString
{
get{return connectionString;}
}
private SqlCommand BuildIntCommand(string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = BuildQueryCommand(storedProcName, parameters);
command.Parameters.Add(new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null));
return command;
}
private SqlCommand BuildQueryCommand(string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = new SqlCommand(storedProcName, Connection);
command.CommandType = CommandType.StoredProcedure;
foreach(SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
return command;
}
public int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
{
int result;
Connection.Open();
SqlCommand command = BuildIntCommand(storedProcName, parameters);
rowsAffected = command.ExecuteNonQuery();
result = (int)command.Parameters["ReturnValue"].Value;
Connection.Close();
return result;
}
public SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
{
SqlDataReader returnReader;
Connection.Open();
SqlCommand command = BuildQueryCommand(storedProcName, parameters);
command.CommandType = CommandType.StoredProcedure;
returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
return returnReader;
}
public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
{
DataSet dataset = new DataSet();
Connection.Open();
SqlDataAdapter sqlDa = new SqlDataAdapter();
sqlDa.SelectCommand = BuildQueryCommand(storedProcName, parameters);
sqlDa.Fill(dataset, tableName);
Connection.Close();
return dataset;
}
public void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataset, string tableName)
{
Connection.Open();
SqlDataAdapter sqlDa = new SqlDataAdapter();
sqlDa.Fill(dataset, tableName);
Connection.Close();
}
}
}