วันพุธที่ 24 ตุลาคม พ.ศ. 2555

หาข้อมูล ซ้ำ sql server


/****** Script for SelectTopNRows command from SSMS  ******/
SELECT shopID, COUNT(*)
FROM tbl_shopDeptUnit
GROUP BY shopID
HAVING COUNT(*)>1

วันพฤหัสบดีที่ 11 ตุลาคม พ.ศ. 2555

สร้าง Windows Service และ Installer สำหรับติดตั้งใช้งาน


สร้าง Windows Service และ Installer สำหรับติดตั้งใช้งาน

Windows services เป็น processes ที่ทำงานใน background ไม่มี user interface ที่ติดต่อกับผู้ใช้ Windows Service สามารถเริ่มทำงานโดยอัตโนมัติเมื่อคอมพิวเตอร์เริ่มทำงาน แม้ว่าผู้ใช้จะยังไม่ได้ log in เข้าไปใช้งานก็ตาม ดังนั้น Windows Service จึงเหมาะสำหรับงานที่มีการทำงานอยู่ตลอดเวลา และไม่ต้องการติดต่อกับผู้ใ้ช้โดยตรง เช่น Web Server, Database Server 
โดยในวันนี้เราจะมาสร้าง Windows Service อย่างง่าย โดยทำงานตรวจสอบสถานะการทำงานของเว็บไซด์แล้วเก็บข้อมูลลง text ไฟล์
สร้าง Service Project
1. เปิด Visual Studio สร้าง Windows Service project ตั้งชื่อว่า MonitorWebSite
2.เลือก service designer view เปลี่ยน Name และ ServiceName เป็น MonitorWebsite พร้อมทั้งกำหนดค่า CanPuaseAndContinue และ CanShutDown เป็น True
3.เพิ่ม System.Timers, System.IO, และ  System.Net namespaces เข้าไปใน Service1.cs ด้วยคำสั่งต่อไปนี้
1using System.Timers;
2using System.IO;
3using System.Net;
4. แก้ไข MonitorWebSite class โดยเพิ่มคำสั่งในการสร้าง Timer object ด้วยคำสั่งดังต่อไปนี้
1private Timer t = null;
5. ภายใน MonitorWebSite contructor ทำการสร้าง Timer object และกำหนดให้ Timer เรียกใช้เมธอดทุกๆ 10 วินาที ด้วยคำสั่งต่อไปนี้
1t = new Timer(10000);
2t.Elapsed += new ElapsedEventHandler(t_Elapsed);
6. เพิ่มคำสั่งเข้าไปในเมธอด OnStart ของ MonitorWebSite class เพื่อสั่งให้ Timer เริ่มทำงาน ด้วยคำสั่งต่อไปนี้
1t.Start();
7. เพิ่มคำสั่งเข้าไปในเมธอด OnStop ของ MonitorWebSite class เพื่อสั่งให้ Timer หยุดทำงาน ด้วยคำสั่งต่อไปนี้
1t.Stop();
8. ทำการ override  เมธอด OnPause, OnContinue และ OnShutdown เพิ่มคำสั่งเพื่อสั่งให้ Timer เริ่มและหยุดการทำงาน ด้วยคำสั่งต่อไปนี้
01protected override void OnContinue()
02{
03t.Start();
04}
05protected override void OnPause()
06{
07t.Stop();
08}
09protected override void OnShutdown()
10{
11t.Stop();
12}
9. ภายในเมธอดที่ได้ระบุไว้เป็น  ElapsedEventHandler ให้ทำการเขียนคำสั่งเพื่อตรวจสอบสถานะของเว็บไซด์และเขียนเวลาปัจจุบันและสถานะการทำงานของเว็บลงใน text ไฟล์
พร้อมทั้งดักจับความผิดพลาดที่เกิดขึ้นจากการทำงานด้วย exception handler คำสั่งที่ได้เป็นดังนี้
01void t_Elapsed(object sender, ElapsedEventArgs e)
02{
03    try
04    {
05        // Send the HTTP request
06        var url = "http://www.microsoft.com";
07        var g = (HttpWebRequest)WebRequest.Create(url);
08        var r = (HttpWebResponse)g.GetResponse();
09
10        var text = string.Format("{0} for {1} : {2}", DateTime.Now, url, r.StatusCode);
11
12        WriteTextToFile(text);
13
14        // Close the HTTP response
15        r.Close();
16    }
17    catch (Exception ex)
18    {
19        var text = string.Format("{0} Exception: {1}",DateTime.Now, ex.Message);
20    }
21}
22
23private void WriteTextToFile(string text)
24{
25    // Log the response to a text file
26    var path =
27    AppDomain.CurrentDomain.SetupInformation.ApplicationBase +
28    "log.txt";
29    TextWriter tw = new StreamWriter(path, true);
30    tw.WriteLine(text);
31
32    //close textwriter
33    tw.Close();
34}
10. build project และแก้ไขความผิดพลาดที่เกิดขึ้น (compile time error) ตอนนี้เรายังไม่สามารถใช้งาน service ที่สร้างมาได้เนื่องจาก service ตัวนี้ยังไม่ได้ถูกติดตั้ง
สร้าง Service Installer สำหรับ service ที่ได้สร้างไว้แล้ว
1. เพิ่ม installer เข้าไปใน service project โดย click ขวาที่ service designer
2.  ที่ ProjectInstaller Designer ให้ click เลือก serviceInstaller1 แล้วกด F4 เพื่อเรียก Properties Windows ขึ้นมา
แล้วกำหนด installer พร็อพเพอร์ตี้เป็นดังนี้
StartType Automatic.
Description “Logs responses from Microsoft.com”.
DisplayName “Web Site Monitor”.
รูปประกอบ
หลังจากนั้นให้ click  เลือก serviceProcessInstaller1 แล้วกำหนดค่า propety  Account เป็น LocalSystem. เพื่อให้มีสิทธิ์ในการเขียน text ไฟล์ได้ 
รูปประกอบ
3. กำหนดให้ service project เป็น startup object 
1.เข้าไปที่ project properties windows
2. เลือก Application Tab
3. Startup object: ให้เลือก MonitorWebSite.Program

4. เพิ่ม Setup Project เข้าไปใน solution โดยไปที่ File > Add > New Project > Other Project Types > Setup and Deployment > Visual Studio Installer ตั้งชื่อ project ว่า
MonitorWebSiteSetup
แล้วทำการเพิ่ม output จาก service project ที่ได้สร้างไว้เข้าไปใน setup project
4.1 click ขวาที่ setup project แล้ว เลือก Add > Project Output

ที่ Add Project Output Group Windows 
  1. เลือก MonitorWebSite Project
  2. เลือก Primary output
  3. click OK
5. เพิ่ม custom action สำหรับติดตั้ง service executable ไฟล์ใน application folder
เลือก setup uproject  click ขวา เลือก View > Custom Actions
ที่ Custom Action editor แล้ว click ขวา Add Custom Action..
ที่ Select Item in Project Windows  ให้ double click Application Folder
แล้วเลือก Primary output from MonitorWebSite (Active) แล้ว click OK
ผลลัพธ์ที่ได้
6. Build  setup project
ติดตั้ง เริ่มการทำงานและจัดการกับ service ที่ได้สร้างไว้
1. double click  Setup.exe ที่ได้สร้างไว้และทำการติดตั้ง Windows Service ด้วย default setting
2. เปิด Computer Management, และเลือก Services node.
3. Right-click  Web Site Monitor service, แล้วเลือก Start. สังเกต Services snap-in แสดง Name และ  Description ที่ได้กำหนดไว้ตอนสร้าง Service Project
4. รอประมาณ 30 วินาที แล้วำทำการเปิด text ไฟล์ ที่ทำการ log ข้อมูลการทำงานของเว็บไซด์
ข้อมูลใน log.txt
16/7/2012 11:31:42 AM for http://www.microsoft.com : OK
26/7/2012 11:31:48 AM for http://www.microsoft.com : OK
36/7/2012 11:31:58 AM for http://www.microsoft.com : OK
46/7/2012 11:32:08 AM for http://www.microsoft.com : OK
56/7/2012 11:32:18 AM for http://www.microsoft.com : OK
66/7/2012 11:32:28 AM for http://www.microsoft.com : OK
5. หยุดการทำงานของ service ชั่วคราวรอประมาณ 30 วินาที แล้วตรวจดูว่าจะไม่มีข้อมูลใหม่เพิ่มเข้าไปใน log ไฟล์
6. เปิดให้ service ทำงานต่อ, รอประมาณ 30 วินาที ตรวจดูว่าใน log ไฟล์มีข้อมูลใหม่เพิ่มเข้าไป
7. หยุดการทำงานของ service โดยใช้คำสั่ง net stop monitorwebsite ผ่าน command line
8. uninstall service ด้วยการ double click  Setup.exe แล้วทำตามขั้นตอนในหน้า wizard ที่แสดงขึ้นมา
หวังว่าผู้อ่านจะได้รับความรู้เบื้องต้นในการสร้าง Windows Service นะครับ