Nine MVP's Blog

27/03/2006

จะทำ combobox แสดงชื่อ SQL Server ที่มีอยู่ใน Network ตอนนั้นทำงัยอ่า

Filed under: Computers and Internet — Nine MVP @ 6:13 pm
เรามาดูวิธีการหา Instance Name ของ SQLServer กัน

งานนี้แนะกันไว้ก่อน พระเอกคือ SQLDMO.dll หุหุ แจ่มครับ สำหรับ MSDE, MSSQL verion 7.0 – 2000

ก่อนอื่นเลย คุณต้องไป add Reference dll เจ้า SQLDMO มาก่อน
โดยเข้าไปที่ tab com

ดังรูปข้างล่าง

Add มันเข้ามาครับ ถ้าหาก หาไม่เจอแย่แล้ว แต่ก็ไม่แย่มาก 
คุณต้อง register ตัว SQLDMO.dll นี้ด้วยตัวเอง

ไปดูวิธีที่นี่ครับ
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sqldmo/dmoref_con01_8eun.asp

มาต่อกัน ด้วยการ Code เพื่อเรียก Instance Name ของ SQL Server ที่ Active อยู่ใน Network (นึกถึง มหาเวทย์ดูดดาวยังไงไม่รู้แฮะ)
 

‘ใช้ namespace ของ sqldmo
Imports SQLDMO

‘ตอน Form load
‘เรา จะ get all available SQL Servers   คับ

  
Dim sqlApp As New SQLDMO.ApplicationClass()
‘ค้นหา Instance ของ MSSQL ที่ Active
Dim sqlServers As SQLDMO.NameList = sqlApp.ListAvailableSQLServers()

‘เอามาใส่ ComboBox
Dim i As Integer
For i = 0 To sqlServers.Count – 1
   Dim srv As Object = sqlServers.Item((i + 1))
   If Not (srv Is Nothing) Then
      Me.cboServers.Items.Add(srv)
   End If
Next i

If Me.cboServers.Items.Count > 0 Then
   Me.cboServers.SelectedIndex = 0
Else
   Me.cboServers.Text = "<ไม่พบ SQL Servers>"
End If

จบการนำเสนอครับ

จะเปลี่ยนภาษาบน KeyBoard กะ .Net

Filed under: Computers and Internet — Nine MVP @ 6:08 pm
ใครที่บอกว่า VB6 นั้นเก่าโบราณ ผมคิดว่าเขาดูถูกบรรพบุรุษของ VB ค่อนข้างมาก เพราะว่าความรู้เก่าใน VB6 นั้นสามารถนำมาใช้งานกับ VB.NET ได้เป็นอย่างดี หุหุ (นอกเรื่องละ)

มาดูกันครับ ผมไปหา WIN API ผิดตัวตั้งนาน โชคดีที่ได้ผู้แนะนำ คุณ jib ต้องขอบคุณอีกครั้ง
 
Imports System.Runtime.InteropServices

‘ประกาศ API Function ไว้ใช้งาน

Private
Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long

‘ที่นี้ตอนใช้ก็เรียก

Dim resultLanguageKeyBoard As Long

resultLanguageKeyBoard  = ActivateKeyboardLayout(1, 0&)

‘ตอนที่จะเทียบค่า

 8975933078306161694 ‘ค่าที่ return ออกมาว่าเป็น ThaiKeyBoard

 8975933078304785417 ‘ค่าที่ return ออกมาว่าเป็น EngKeyBoard

rrrrrrrrrrrrrr

อ่ะนั่นแน มาเขียนโปรแกรมเปลี่ยนวันเวลาของเครื่องคอมเรากันเถอะ

Filed under: Computers and Internet — Nine MVP @ 5:46 pm
หลายคนสงสัยมานาน ๆ ๆ ๆ แล้วว่าเราจะแก้ไขเวลาเครื่องได้ยังงัย โดย Programmatic มาถึงเวลนี้ ผมเลยเสนอ appdominizer ตัวใหม่ ที่จะช่วยให้ท่านแก้ไขวันเวลาในเครื่องได้ดั่งใจหวัง แน่นอน งานนี้หนีไม่พ้น Win32 API อีกแล้ว
โฮ่มาเริ่มกันเลย
 
 
มาดู Class ที่ผมดัดแปลงมาจาก MS กันดีกว่า  (download code ด้านล่าง)
SystemTimes.cs
using System;

using System.Globalization;

using

System.Runtime.InteropServices;

namespace

SystemTimes

{

/// <summary>

/// Summary description for SystemTime.

/// </summary>

public class SystemTime

{

[DllImport("kernel32.dll",SetLastError=

true)]

private extern static void GetSystemTime(ref SYSTEMTIME lpSystemTime);

[DllImport("kernel32.dll",SetLastError=true) ]

private extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime);


public
SystemTime()

{}

private struct SYSTEMTIME

{

public ushort wYear;

public ushort wMonth;

public ushort wDayOfWeek;

public ushort wDay;

public ushort wHour;

public ushort wMinute;

public ushort wSecond;

public ushort wMilliseconds;

}

 

private SYSTEMTIME sysTime = new SYSTEMTIME();


///
<summary>

/// ใช้สำหรับตั้งค่าเวลาของเครื่อง

/// </summary>

/// <param name="dt"> วันเวลาที่ต้องการตั้งค่าใหม่ </param>

public void setDateTime(DateTime dt)

{

//แปลง TimeZone ให้เป็น UTC

dt = dt.ToUniversalTime();

sysTime.wYear = (

ushort)dt.Year;

sysTime.wMonth = (

ushort)dt.Month;

sysTime.wDayOfWeek = (ushort)dt.DayOfWeek;

sysTime.wDay = (

ushort)dt.Day;

sysTime.wHour = (

ushort)dt.Hour;

sysTime.wMinute = (ushort)dt.Minute;

sysTime.wSecond = (

ushort)dt.Second;

sysTime.wMilliseconds = (

ushort)dt.Millisecond;

//ตั้งเวลาใหม่

SetSystemTime(

ref sysTime);

}


///
<summary>

/// ใช้สำหรับ รับค่าเวลาของระบบ

/// </summary>

/// <returns></returns>

public DateTime GetDateTime()

{

GetSystemTime(

ref sysTime);

DateTime newDateTime =

new DateTime(sysTime.wYear,sysTime.wMonth,sysTime.wDay,

sysTime.wHour,sysTime.wMinute,sysTime.wSecond,sysTime.wMilliseconds);

//แปลง UTC จาก machine ไปเป็น TimeZone ณ ปัจจุบัน

newDateTime = newDateTime.ToLocalTime();

return newDateTime;

}

}

}

ตอนเรียกใช้  Code vb.net

Imports SystemTimes

Private systime As SystemTime

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    systime = New SystemTime

End Sub

Private Sub GetTime_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetTime.Click

    DateTimePicker1.Value = systime.GetDateTime()

End Sub

Private Sub SetTime_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SetTime.Click

    systime.setDateTime(DateTimePicker2.Value)

    MsgBox("Now = " + Now + vbCrLf + "systime.GetDateTime() =" + systime.GetDateTime())

End Sub

มาดูผลการทำงานกัน

1. เปิดโปรแกรมขึ้นมาเทียบ กับ Date and Time Property ของ Windows

2. ต่อมาจะทำการตั้งค่าโดยใส่ วันที่ ๆ ต้องการลงไป ใน DateTimePicker ตัวล่าง โดยใส่ค่า 01/01/2550 01:00:00
และเวลาปัจจุบันตอนนี้คือ 25/03/2549 09:53:25

3. หลังกดปุ่ม Set DateTime ก็จะได้ผลลัพธ์ตามรูปข้างล่าง

สามารถ Dowload Code ของ Project Test นี้ ได้ที่ 
http://www.filelodge.com/files/hdd2/17512/Test_SystemTime.rar

Tip&Trick เพิ่มประสิทธิภาพการทำงานของ Windows Forms Apps ของคุณ

Filed under: Computers and Internet — Nine MVP @ 5:42 pm
สืบเนื่องจากว่า ภาษาอังกฤษของบางคนไม่ค่อยแข็งแรงเท่าไหร่
เลยปล่อยปะละเลยบทความดี ๆ ที่ MS ได้ตีพิมพ์ให้เหล่าโปรแกรมเมอร์ได้ไปอ่านเพิ่มเติมความรู้กัน
นั้นก็คือ MSDN, MSDN Magazine

ผมจึงหยิบบทความเรื่อง Practical Tips For Boosting The Performance Of Windows Forms Apps
ที่อยู่ใน MSND Magazine เดือน March 2006 มาทดลองดูว่าจริงหรือไม่อย่างไร

ก่อนอื่นหลายคนเคยใช้ การ Binding DataSource ต่าง ๆ ไม่ว่าจะเป็น DataSet, ArrayList, Array เข้าไปใน Windows Control

ตัวอย่าง เช่น  Binding DataSet ให้ ComboBox ตัว code ที่เราใช้กันจนแพร่หลายก็คือ  

combobox1.DataSoruce = dataset1.tables["test"];
combobox1.ValueMember = "col1";
combobox1.DisplayMember = "col2";

ซึ่งวิธีนี้ผมเองก็ใช้อยุ่ประจำ แต่ก็รู้สึกได้ว่าdelayค่อนข้างมาก
หากมี combobox ที่ต้อง binding ขณะที่ form_load เป็นจำนวนมาก ๆ ใน Form นั้น

จนได้มาอ่านบทความนี้ของ MS ก็ได้สงสัยว่ามันจะจริงเหรอ ที่ว่าเร็วกว่ามาก ด้วย code ข้างล่างนี้

combobox1.ValueMember = "col1";
combobox1.DisplayMember = "col2";

combobox1.DataSoruce = dataset1.tables["test"];

ผมจึงทดลองด้วยการจับเวลาของการทำงาน ในแต่ละ logic ว่าแบบไหนทำงานได้รวดเร็วกว่ากัน
โดยจะไป get ค่าเวลามาจาก CPU โดยตรง (class ที่ใช้จับเวลา http://www.greatfriends.biz?13622 )

Code Test

// ขณะที่ Form1_Load() ทำงาน

//เอาไว้จับเวลา

HiPerfTimer pf = new HiPerfTimer();


string
constr = "Data Source=(local);Initial Catalog=Northwind;User ID=sa;password=;";

string sql = "select CustomerID, CompanyName from Customers";


DataSet
ds = new DataSet();


//ใช้ข้อมุลจาก Northwind

SqlDataAdapter da = new SqlDataAdapter(sql , new SqlConnection(constr));

da.Fill(ds,

"test");


//จับเวลา การ binding แบบที่เรานิยมใช้กัน

pf.Start();

comboBox1.DataSource = ds.Tables[0];

comboBox1.ValueMember = "CustomerID";

comboBox1.DisplayMember = "CompanyName";

pf.Stop();

label3.Text = pf.Duration.ToString();


//จับเวลา การ binding แบบที่ MS เขาแนะนำมา

pf.Start();

comboBox2.ValueMember =

"CustomerID";

comboBox2.DisplayMember =

"CompanyName";

comboBox2.DataSource = ds.Tables[0];

pf.Stop();

label4.Text = pf.Duration.ToString();


//หาผลต่างของเวลา ทั้ง 2 วิธี

label5.Text = Convert.ToString(Convert.ToDouble(label3.Text) – Convert.ToDouble(label4.Text));

ภาพผลลัพธ์

จะเห็นได้ว่า
Code ที่เราใช้กันประจำ ทำเวลาได้ 0.173930764943589
Code ที่ MS แนะนำ     ทำเวลาได้ 0.0376771349431283
logic ที่เราใช้กันประจำช้ากว่าถึง    0.136253630000461    

ทำไมถึงช้ากว่า 5.6 เท่า น่าสงสัยทีเดียว

ผมอธิบายง่าย ๆ ว่ามีการ Binding DataSource ซ้ำซ้อนเกิดขึ้น ใน Code ที่เราใช้กันเป็นประจำ ทั้ง 3 บรรทัด
แต่ code ของ MS มีการ Bind เกิดขึ้นเพียงครั้งเดียวคือ บรรทัดสุดท้าย

จากบทความนี้ของ MS ช่วยให้เรา ได้คิดกันว่า control ที่เรากำลังใช้ ๆ กันอยู่
มันทำงานข้างในเป็นอย่างไรนั้น หากไม่ศึกษาให้ละเอียดก่อนจะนำมาใช้งาน ก็อาจจะไม่ได้วิธีการทำงานที่ดีที่สุด
ซึ่งก็อาจจะเป็นการเพิ่ม Cost ขึ้นมาโดยไม่รู้ตัวก็เป็นได้

ยังมีอีกหลาย ๆ วิธีครับ ที่จะช่วยให้การทำงานของโปรแกรมของคุณนั้นทำงานได้รวดเร็วขึ้น
ยังงัยก็ลองไปหา download อ่านกันได้ที่นี่ครับ
http://msdn.microsoft.com/msdnmag/htmlhelp.aspx

Create a free website or blog at WordPress.com.