Friday, September 22, 2006

วิธีการสั่งรัน Process โดยไม่เริ่มหน้าต่างใหม่

Capturing the output from a console application in C#
Submitted by rlipscombe on Mon, 2005-02-07 21:35.C#
The .NET framework class library provides a handy Process class for running (and monitoring) other applications.

Here's how to grab hold of a Stream object for the input and output of a process.


Process process = new Process();
process.StartInfo.FileName = fileName;
process.StartInfo.Arguments = arguments;

// We have to turn off UseShellExecute to redirect the input and output.
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;

// If we're a Windows.Forms application, we'll want to turn
// off the new console window that appears.
process.StartInfo.CreateNoWindow = true;

// We have to turn on EnableRaisingEvents to enable the Exited event.
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(OnExited);

// We can't get at the StandardInput and StandardOutput properties until
// after the process is started.
process.Start();

// The Process class gives us StandardInput and StandardOutput
// properties, but they're a StreamWriter and StreamReader.
StreamWriter inputWriter = process.StandardInput;
Stream inputStream = inputWriter.BaseStream;

// If you want the underlying stream, you need the BaseStream
// property.
StreamReader outputReader = process.StandardOutput;
Stream outputStream = outputReader.BaseStream;

StreamReader errorReader = process.StandardError;
Stream errorStream = errorReader.BaseStream;

Ref :: Capturing the output from a console application in C#

Tuesday, September 19, 2006

Netsh อีกแล้ว . . .

ตัวอย่างการสั่งเปลี่ยน IP ให้ NIC โดยไม่ต้องอ่านจาก TextFile เหมือนรอบก่อน
ทำดังนี้ครับ

netsh interface ip set address "Local Area Connection" static 10.0.0.123 255.255.0.0 10.0.0.1 1
netsh interface ip set dns "Local Area Connection" static 10.0.0.1

ง่ายๆครับเห็นป่ะ . . .

แต่ก็ comment อย่างเดิมใช้ได้แต่กับ XP ขึ้นไปนะครับ

ใช้เวลาในการเปลี่ยน 15 วินาทีขึ้นไป ( ในการประมวลผลคำสั่ง ) ขึ้นกับความเร็ว
ผมว่าเปลี่ยนเองก็พอๆกัน . . ทำไว้เป็น Bat ก็ได้นะครับ

แต่ผมจะเขียนเป็นโปรแกรม อิอิ

Monday, September 18, 2006

การเปลี่ยน IP ผ่าน Commad Line

วันนี้ผมได้ทดลองทำการเปลี่ยน IP Address ผ่าน Command Line นะครับ
โดยวิธีการคือผมทำ TextFile ไว้เพื่อเก็บข้อมูลเกี่ยวกับ IP Address ดังนี้

# ----------------------------------
# Interface IP Configuration
# ----------------------------------

pushd interface ip

set address name = "Internet" source = static addr = 10.0.0.109 mask = 255.0.0.0
set address name = "Internet" gateway = 10.0.0.2 gwmetric = 1

set dns name = "Internet" source = static addr = 203.146.237.237
add dns name = "Internet" addr = 203.146.237.222
popd

# End of interface IP configuration

จากนั้นก็ Save เช่นผมเซฟ เป็นชื่อ TOT.txt

เวลาจะใช้งานก็เปิด Command Line ขึ้น แล้วพิมพ์คำสั่ง

netsh -f (ชื่อไฟล์)

รอสักครู่ ค่าของ IP ที่ตั้งไว้ใน NIC จะถูกเปลี่ยนตามที่กำหนดครับ

ทั้งหมดนี้ผมทดสอบบน Windows XP Pro นะครับ ^-^ ทำงานได้ดีมั๊กๆ ^ ^

Saturday, September 16, 2006

Login root ด้วย ssh บน FreeBSD 6.0

วันนี้ผมว่างครับเลยกลับมาลองงม FreeBSD อีกรอบ แผ่นที่มีก็เป็นรุ่น 6.0
ตอนนี้ใหม่สุดจากเวบเค้าก็เป็นรุ่น 6.1 ผมเลยไม่ซีเรียด

ตอนนี้ลงเสร็จแล้วเซทต่อเนทแล้ว ติดปัญหาอย่างเดียวครับ คือ ผมลง SSH ไป
แต่ผม Login ด้วย root ไม่ได้

แต่ตอนนี้ผมได้คำตอบเลยเลยขอ Note ไว้สักหน่อย

วิธีก็คือ

แก้ไขไฟล์ /etc/ssh/sshd_config
หา #PermitRootLogin no

ให้ลบ # ออก แล้วแก้ no เป็น yes จะได้เป็น
PermitRootLogin yes

ความจริงแล้วเค้าไม่แนะนำให้ทำแบบนี้นะครับ ( แต่ผมจะทำเพราะยังไม่ได้ออนไลน์ )

Thursday, September 14, 2006

Access Point 2 Access Point

วันนี้รุ่นพี่ที่ทำงาน โทรมาถามว่า AP มันสามารถทำ Repeat กับ AP ด้วยกันได้ไหม
ผมเองจำได้นะว่ามันทำได้ แต่ก็ไม่เคยมี AP หลายๆตัวเลยไม่เคยได้ทำสักที

หลังจากวางสายก็เลยหาข้อมูลเกี่ยวกับการทำ Repeat สัญญานด้วย AP ก็ได้ข้อมูลมาดังนี้

- AP ทุกตัวที่จะใช้จะต้องมี Mode Repeat ด้วย
- AP ควรจะเป็น ยี่ห้อ และ รุ่นเดียวกัน ( ให้ตรวจสอบ Firmware ด้วย )

ผมเองก็ยังไม่ได้ลองทำ แต่เร็วๆนี้คงได้ลองเพราะต้องไปวางระบบเครือข่าย ที่ส่วนของห้องตรวจ
และจะต้อง Hybrid เข้ากับ Wire Network

งานนี้สั่ง Access Point ไป 4 ตัว กะจะให้สัญญานในย่านนั้น แรงๆ ( มีสำรองเสีย 1 ตัว )
จะลองทำ Repeat ก็งานนี้แหละครับ ^ ^

อีกเรื่องหนึ่ง ผมได้ข้อมูลมาว่า ทั่วๆไปแล้ว AP สามารถส่งสัญญานได้ประมาณรัศมี 100 เมตร
และสามารถรองรับการเชื่อมต่อเข้ามา ตั้งแต่ 100 เครื่องขึ้นไป แต่ถึงเท่าไร ไม่มีระบุ

Ref :: The Lord Of Wireless

Tuesday, September 12, 2006

ตัวอย่างการสร้าง Assembly ใน .Net

วันนี้ผมทดลองเขียน Assembly เกี่ยวกับ Network ของผมเอง เพื่อความสะดวกในการทำงาน

ตัวอย่าง CODE พัฒนาโดย C# หลังคอมไฟล์จะได้เป็นไฟล์ Stamp.Net.DLL

using System;
using System.Net;
using System.Collections.Generic;
using System.Text;

namespace Stamp.Net
{
public class IPClass
{
private string IP;
private string host;

public string version()
{
string APIversion = "1.0";

return APIversion;
}

public string hostName()
{
string hName = Dns.GetHostName();

host = hName;

return host;
}

public string getHostname()
{
hostName();
return host;
}

public string getMyIP()
{
string ip = null;

getHostname();

IPHostEntry ipEntry = Dns.GetHostEntry(host);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
ip += addr[i].ToString();
}

IP = ip;
return IP;
}

public string getOtherIP(string domain)
{
string ip = null;

IPHostEntry ipEntry = Dns.GetHostEntry(domain);
IPAddress[] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
{
ip += addr[i].ToString();
}

IP = ip;
return IP;
}
}
}

ผมทดลองใช้แล้วนะครับ ^^ พูดได้แค่ว่า Yes !! It work..

วิธีการนำข้อมูลใน DataSet ออกมาเป็น XML

วิธีในการนำ DataSet ออกมาเป็น XML วันนี้จะ Note การนำข้อมูลใน DataSet ออกมาเป็น
ไฟล์ XML โดยการดึงข้อมูลใน DataBase มาทำเป็น XML File สามารถทำได้ผ่าน DataSet
โดยวิธีการใช้งาน Method

DataSet.WriteXML(Filename.XML);

ซึ่ง Method นี้จะทำการนำข้อมูลใน DataSet มาเขียนใส่ไฟล์ XML

สำหรับวิธีการนำเข้าก็ใช้ Method

DataSet.ReadXML(Filename.XML);

###########################################################

วิธีการนี้เราสามารถที่จะนำไปประยุกต์ใช้กับโปรแกรมแปลงประเภทฐานข้อมูลได้ . . หรือนำไป
ประยุกต์ใช้กับโปรแกรมประเภทอื่นๆ ^ ^

Monday, September 11, 2006

โปรแกรมติดต่อ WMI ที่ผมลองเขียน

วันนี้ผมลองเขียนโปรแกรมติดต่อ WMI เพื่อเรียกดู Memory ที่เหลือให้ใช้ในระบบ
และ ชื่อของ SoundCard ในเครื่องของผม Sourcecode ดังนี้ครับ

using System;
using System.Management;
using System.Collections.Generic;
using System.Text;

namespace CS_TestWMI
{
class Program
{
static void Main(string[] args)
{
SelectQuery query = new SelectQuery("Win32_OperatingSystem");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);

foreach (ManagementObject read in search.Get())
{
Console.WriteLine("Query From Win32_OperatingSystem");
Console.WriteLine(read.GetPropertyValue("FreePhysicalMemory"));
Console.WriteLine(read.GetPropertyValue("Caption"));
Console.WriteLine(read.GetPropertyValue("SerialNumber"));
Console.ReadLine();
}

SelectQuery query2 = new SelectQuery("Win32_SoundDevice");
ManagementObjectSearcher search2 = new ManagementObjectSearcher(query2);

foreach (ManagementObject read2 in search2.Get())
{
Console.WriteLine("Query From Win32_SoundDevice");
Console.WriteLine(read2.GetPropertyValue("ProductName"));
Console.ReadLine();
}
}
}
}

ทดสอบแล้วทำงานได้ครับ ^^ เป็น ConSole Application ครับผม

MySQL Storage Engine Detail

รายละเอียด Storage Engine ประเภทต่างๆใน MySQL

mysql> show engines;
+------------+---------+-------------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+-------------------------------------------------------+
| MyISAM | YES | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| HEAP | YES | Alias for MEMORY |
| MERGE | YES | Collection of identical MyISAM tables |
| MRG_MYISAM | YES | Alias for MERGE |
| ISAM | NO | Obsolete storage engine, now replaced by MyISAM |
| MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys |
| INNOBASE | YES | Alias for INNODB |
| BDB | YES | Supports transactions and page-level locking |
| BERKELEYDB | YES | Alias for BDB |
| NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables |
| NDB | NO | Alias for NDBCLUSTER |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | YES | Archive storage engine |
| CSV | NO | CSV storage engine |
| FEDERATED | YES | Federated MySQL storage engine |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) |
+------------+---------+--------------------------------------------+

Ref:: MySQL Storage Engine Detail

Friday, September 08, 2006

ทดลองใช้ WMI ครั้งแรก

เริ่มเลยขอทำ Reference Links ไปที่ WMI ใน MSDN ก่อนนะครับ

Ref :: WMI

คือว่าแบบนี้ครับ วันนี้ผมมีเวลาว่างช่วงบ่ายเล็กน้อย และเคยมีความคิดว่า เออนะ อยากเขียน
โปรแกรมที่สามารถ เรียกรายละเอียดของ Hardware มาดูได้

แต่ผมก็ไม่เข้าใจหรอกนะว่ามันจะไปเรียกมาได้ยังไง แต่อยู่ๆ ผมก็นึกถึง WMI ขึ้นมาได้
ว่าผมเคยอ่านใน MSDN ของ Microsoft และก็ในกระทู้ของอาจารย์สุเทพ

Ref :: กระทู้เกี่ยวกับ WMI ใน Greatfrieds.biz

และผมก็ทดลองใช้หลายๆอย่างดังนี้
- เรียก Printer ที่มีในเครื่อง
- ตรวจดูจำนวน CPU และ ชื่อ CPU
- เรียกดูชื่อ CD-ROM

และผมยังพบอีกว่า ผมสามารถทำ Remote ด้วย WMI ได้ . . ( เด็ดดวง )

ข้อเสีย

จากที่ผมพบข้อเสียในการใช้ WMI ด้วย .Net ( คือตัว .net จะทำ Wrapper ) ให้เราเอง
ก็ช่วยให้เขียนได้ง่ายเหมือนกับเขียน .Net เองเลย แต่ติดตรงที่ทำงานช้าไปนิด . . เพราะที่
ผมทดลองนี่เป็น Console App นะ . . ถ้าเป็น Winapp คงช้ามากๆเหมือนกัน

การตั้งค่าหน้ากระดาษ ให้ Printer บน WinXP

ผมติดปัญหากับโปรแกรมที่ใช้ในที่ทำงาน ( รพ. ) มาได้ประมาณ 5 เดือนแล้ว
นั่นเป็นเหตุผลที่ผมต้องใช้ Windows98/ME ในการสั่งพิมพ์ต่างๆ ในชุดโปรแกรม Mrecord

จนกระทั่งวันนี้ผมได้เจอกระทู้เกี่ยวกับวิธีการตั้งค่ากระดาษบน Windows XP

ต้องขอขอบคุณคุณ GOOK เพื่อนจาก Community ของ Greatfriends.biz จริงๆครับ.

หลังจากผมทดลองตั้งค่าตามที่แนะนำไว้ในกระทู้ ก็ปรากฏว่าสามารถใช้ได้จริงๆ . .
เรื่องง่ายๆ ที่เป็นความรู้ใหม่เลยนะครับ ผมคิดมาตลอดเลยว่ามันทำไม่ได้ : P

วิธีการคือคลิกที่ Start->Printer and Fax
แล้วเลือกที่ Menu :: File -> Server Properties

แค่นี้เอง

คำสั่ง SQL เรียกดู Tables และ Database

ปกติแล้วผมไม่ค่อยได้ใช้คำสั่งพวกนี้สักเท่าไร ก็เพราะว่าเรามี SQL Manager ดีๆให้ใช้เยอะ
แต่ก็นั่นแหละ บางทีก็อยากจะรู้ไว้บ้างเหมือนกัน

ตัวอย่าง SQL ต่อไปนี้ใช้สำหรับ MySQL นะ อันอื่นๆ ยังไม่เคยลองแต่น่าจะคล้ายๆกัน

SHOW TABLES;

SHOW TABLES FROM db_name;

SHOW DATABASES;

SHOW TABLES LIKE 'tbl_name';

SHOW TABLES STATUS;

SHOW COLUMNS FROM tbl_name;

SHOW INDEX FROM tbl_name;

SHOW CREATE TABLE tbl_name;

SHOW CREATE DATABASE db_name;

ทดสอบทุกคำสั่งกับ MySQL 5.0.28 แล้วครับ ^-^

และก็ลองหาข้อมูลเทียบกับ Firebird ดูแล้ว รู้สึกว่าจะคำสั่งเดียวกันเพียงแต่เวลาใช้
FireBird ต้องเรียก ISQL ออกมาเท่านั้นเอง ^ ^

โปรแกรมเข้ารหัสไฟล์ SQLite DB ที่ผมพัฒนาขึ้น

หน้าตาของโปรแกรมที่ผมพัฒนาขึ้นจะเป็นแบบนี้นะครับ










สำหรับ Sourcecode




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Data.SQLite;
using System.Windows.Forms;

namespace SetPasswordProtect
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

public string datasource;
public string ConStr;

private void btnFind_Click(object sender, EventArgs e)
{

if (openFileDlg.ShowDialog() == DialogResult.OK)
{
string dbPath;

dbPath = openFileDlg.FileName;
label3.Text = dbPath;
datasource = dbPath;

ConStr = "Data Source="+datasource+";version=3;";

}
else
{
MessageBox.Show("พบข้อผิดพลาด ","ข้อผิดพลาด");
}
}

private void btnPwdSet_Click(object sender, EventArgs e)
{
if ((datasource == "") || (ConStr == "") || (txtPwdSet.Text == ""))
{
MessageBox.Show("พบข้อผิดพลาด ", " ข้อผิดพลาด");
}
else
{
try
{
SQLiteConnection Conn = new SQLiteConnection(ConStr);
Conn.Open();
Conn.ChangePassword(txtPwdSet.Text);
Conn.Close();

MessageBox.Show("Complete Setting Password", "Result");
}
catch (SQLiteException ex)
{
MessageBox.Show(ex.ToString(), " ข้อผิดพลาดจาก SQLite");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), " ข้อผิดพลาดจากระบบ");
}
}
}
}
}




ที่เห็นด้านบนก็คือ Sourcecode ของโปรแกรมที่ผมเขียน ( C# นะครับ )

Thursday, September 07, 2006

ทดลองใส่เพลงบน Blog

ผมเคยเขียนเกี่ยวกับวิธีการ Embled Windows Media Player ลงใน Blog
เมื่อเดือนสิงหา ที่ผ่านมา

มาวันนี้ผมได้ทดสอบนำไฟล์ MP3 ไปวางไว้ใน Server ของผมเองที่เช่าไว้
แล้วก็ทำการ Embled เพลงใส่เข้าไปใน Blog โดยให้ WM ไปเรียกเพลงมา
จาก URL ที่ชี้ไปที่เวบไซต์ของผม ^^

ได้ไม่ได้เดี๋ยวก็รู้กันแล้วครับ ( แต่ผมว่าได้นะ เพราะเมื่อกี้ได้ยินเสียงเพลงแล้ว )








รหัสผ่านที่มากับ Virus

วันนี้ผมเจอไวรัสครับ . . . ไอ้เจ้าไวรัสตัวนี้ มันไปใส่รหัสผ่านให้กับ Administrator ของ XP
งานนี้ คงต้องบอกว่าผมโชคดีนะ ที่ว่าเคยอ่าน algorithm ของ virus ตัวนี้มา ( แต่ก็ลืมแล้ว )
ที่แน่ๆ ผมจำได้ว่า Password มันจะเป็น : hackme หรือ hacked ตัวใดตัวนึง

ก็เป็นดังคาดครับ แก้ไขได้

แต่ที่ยังแก้ไม่ได้ก็คือ Folder Option มันถูก Lock เอาไว้ แต่ผมก็จำได้ว่าให้ทำการแก้ไข
No FolderOption = 1 ( ลบทิ้งซะ ไม่แน่ใจพิมพ์ถูกไหมแต่ประมาณนี้แหละ )

ส่วนไอ่ที่ Registry มันไม่ให้เราแก้ไข ( คือเราเรียก Regedit แล้วใช้ไม่ได้ )
มันบอกว่า The registry has been disable by your administrator
ก็ประมาณนี้มั้ง

แต่ถ้าอยากจะแก้จริงๆก็สร้าง account ใหม่ขึ้นมาแล้วก็ไปแก้ซะ . . .

การสร้าง XSD เพื่อใช้ทำ Report

วันนี้ได้มีโอกาศคุยกับคุณ Nine ซึ่งเป็น MVP ของ Microsoft Thailand คนหนึ่ง
เลยได้ขอคำแนะนำเกี่ยวกับการสร้าง XSD เพื่อใช้ในการทำ Report กับ CR บน .Net

ซึ่งผมเคยศึกษาจากโปรแกรมที่คุณ Nine ได้ทำไว้ให้ แต่โปรแกรมนั้นสามารถใช้ได้กับ
เฉพาะ DBMS ของ MySQL 4 ขึ้นไป และ MS SQL2000 - 2005

แต่ความต้องการของผมมันมากเกินกว่านั้น

จากการที่ผมได้ศึกษา Flow งานของโปรแกรมตัวนั้นผมคาดว่าใช้การ SELECT เอา Schema
ของ Table ( ซึ่งต่อมาคุณ Nine แนะนำให้ผมนึกภาพว่าเป็นการดึง Query ดีกว่า )
จากนั้นก็นำเอา Query ที่ได้มาทำการ บรรจุลง Dataset ( ด้วย DataAdapter )
แต่อย่าลืมอ้างอิงถึง System.Xml และต้องทำการ Add Ref ของ DBMS ที่จะใช้ด้วย
แล้วก็ใช้คำสั่งของ DataAdapter แล้วก็ทำงานตากปกติ แต่ว่าตอนที่เราจะทำการ Fill
ให้ทำดังนี้

dbAdap.Fill(ds,ชื่อของ Schema);
// ชื่อของ Schema คือ ชื่อที่เราจะใช้ในบันทึกเป็น Element Name ของ File

ds.WriteXmlSchema("ชื่อไฟล์ . XSD");

คราวนี้ผมเองก็เตรียมตัวแล้วที่จะทำการ พัฒนาโปรแกรมสร้าง XSD สำหรับ DB ต่างๆ
เพื่อใช้ในงานอื่นๆ

ที่แน่ๆ คงต้องให้ Support Database ต่อไปนี้

- Firebird
- MySQL
- SQLite

( ที่เหลือผมยังคิดไม่ออกครับ ^ ^ )

วิธีการแก้ Registry

วันนี้ Computer ที่ทำงานของผมเจอปัญหาจากที่พี่ไวรัส เค้าทำการฝากรอยรักเอาไว้
ซึ่งผมเองก็ไม่มั่นใจนะครับว่าเป็นไวรัสอะไร แต่เคยเจออาการนี้มานานแล้ว

อาการที่พบจะมีหลายอาการไป แล้วแต่โชคแต่ดวงดังนี้
- เข้า Regedit ไม่ได้
- ใช้ Folder Option ไม่ได้
- เข้า Administrator ไม่ได้เนื่องจากไม่มี Password ที่ใช้เข้า


วิธีการแก้ไขอาการแรกนะครับ ( อาการอื่นๆ ยังคิดไม่ออก )

อาการที่พบนะครับ ขั้นแรกเลย . . เราจะใช้ Regedit ไม่ได้ โดยเมื่อเราเรียก
Start -> Run -> regedit

พี่ MS Windows เค้าจะ Response เรามาดังนี้
Registry editing has been disabled by your adminstrator

พูดง่ายๆ . . มันบอกว่า Registry Edition ถูกปิดไว้โดยผู้ดูแลระบบ
แต่เราก็ Logon ไปเป็นผู้ดูแลระบบแท้ๆ - -''


วิธีการให้เราเรียก Start -> Run -> แล้วพิมพ์ข้อความด้านล่างลงไป
REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableRegistryTools /t REG_DWORD /d 0 /f

ให้ติดกันเป็นบรรทัดเดียวแล้วกด Enter จากนั้นให้ Restart ก็จะสามารถใช้ได้เช่นเคยครับ

Export DataGrid Or DataSet To Excel

วิธีการนำข้อมูลใน DataGrid และ DataSet มาทำการ Export ออกเป็น Excel
สามารถทำได้โดยวิธีการดังนี้ ( ใน .Net Framework 2.0 )

ขั้นตอนแรกให้เราทำการ Add Ref ตัว Excel.dll และเขียน Code ในลักษณะดังนี้

Excel.ApplicationClass excel = new ApplicationClass();

excel.Application.Workbooks.Add(true);
DataTable table = DATASETNAME.Table[0];
int ColumnIndex=0;

foreach(Datacolumn col in table.Columns)
{
ColumnIndex++;
excel.Cells[1,ColumnIndex]=col.ColumnName;
}

int rowIndex=0;

foreach(DataRow row in table.Row)
{
rowIndex++;
ColumnIndex=0;
foreach(DataColumn col in table.Columns)
{
ColumnIndex++;
excel.Cells[rowIndex+1,ColumnIndex]=row.Cells[col.ColumnName].Text;
}
}

excel.Visible = true;
Worksheet worksheet = (Worksheet)excel.ActiveSheet;
worksheet.Activate();
}

Wednesday, September 06, 2006

Code C# Connect FireBird

หลังจากติดตั้ง ADO.Net Provider For .Net Framework 2 สำหรับ FireBird แล้ว
เราก็ต้องทำการ Add Reference ตัว FirebirdSql.Data.FireBirdClient มาไว้ในโปรเจค
จากนั้นก็ทำการเขียน Code ดังนี้

using System;
using System.Collections.Generic;
using System.Text;
using FirebirdSql.Data.FirebirdClient;

namespace FireBirdTestCon
{
class Program
{
static void Main(string[] args)
{
string ConStr = "Database=C:\\Program Files\\Firebird\\Firebird_1_5"+
"\\examples\\EMPLOYEE.FDB;User=SYSDBA;Password=masterkey;"+
"Dialect=3;Server=localhost;";

FbConnection Conn = new FbConnection(ConStr);
Conn.Open();
Console.WriteLine(Conn.ServerVersion);
Console.ReadLine();
Conn.Close();
}
}
}
ผลจากการรันโค๊ตด้านบน โปรแกรมจะตอบกลับ Version ของ FireBird ที่เราใช้อยู่มา

####################################################

แต่ตอนนี้ผมยังหาตัวจัดการ DBMS ของ FireBird ที่เป็น GUI ไม่ได้เลยครับ T T
และผมก็ยังไม่รู้จัก DataType ของ FireBird อีกตั้งหาก

Firebird Project

เมื่อวานผมได้เขียนอะไรถึง Firebird นิดหน่อย และวันนี้ก็เลยลองหาข้อมูลเกี่ยวกับ
การใช้งาน Firebird กับ .net ก็เจอ ADO.net สำหรับ Firebird

Ref:: FireBird Project

Tuesday, September 05, 2006

ผมเพิ่งรู้ว่า Firebird ฟรี

ผมทราบมาตลอดว่า Borland มี Database ดีดี อยู่ตัวหนึ่งนั่นก็คือ Interbase
ซึ่งที่ผมทราบเพราะผมเคยต้องเขียน Delphi ต่อกับฐานข้อมูล Interbase

ตอนนั้นผมเป็นนักศึกษา มหาวิทยาลัยให้ผมใช้ Borland Delphi 5 ต่อ Interbase
ผมก็ใช้ทำโปรแกรมระบบทะเบียนลูกจ้างหน่วยงานรัฐ ( ลูกจ้างชั่วคราวรายวัน รายเดือน )
ซึ่งผมใช้ Interbase เป็น Database Server

เอากันจริงๆ ผมไม่ค่อยคุ้นเคยกับ Interbase นักหรอกครับแต่ผมก็พอจะรู้ว่า Firebird
ก็เป็น Interbase นั่นแหละ ( คล้ายๆ Fedora กับ Redhat ) ในความคิดของผมนะ
จนผมได้ทราบว่า Borland ประกาศแจก Interbase ให้ใช้ได้ฟรีๆ
แต่ผมไม่รู้ว่า Firebird ก็แจกฟรีด้วย

จนกระทั่งวันนี้ผมต้องปล้ำกับ Firebird เนื่องจากผมต้องติดตั้งชุดโปรแกรม Mrecord
หลังจากที่ผมได้ทดลองใช้สักพัก . . ไม่ลึงซึ้งมาก

ผมพบว่ามันเป็น DBMS ที่น่าสนใจตัวนึงเลยทีเดียว เป็นข้อๆดังนี้
1. ฟรี
2. มีทั้งบน Windows/Linux/Unix/MacOS
3. มีคนบอกว่า Copy ไฟล์ .gdb ไปวางข้าม Platform ของ OS ก็ยังใช้ได้
4. มี Trigger และ Store Procedure ให้ผมใช้ ( ถึงผมจะยังไม่เคยใช้มันจริงๆ )
5. ทำ VIEW ได้
6. น่าจะ Stable กว่า MySQL ในความคิดผมนะ ( ไม่ Confirm )

ผมว่ามันลดต้นทุนให้ Developer ได้ดีทีเดียวนะ แต่ก็อย่างเคยครับมันใหญ่เกินไปสำหรับ
โปรแกรมเล็กๆ . . . แต่ถ้าพัฒนาโปรแกรมใหญ่ๆ ต่อไปนี้ Firebird จะเป็นตัวเลือก
อันดับต้นๆ ของผมเลยล่ะ ( ลองจาก MySQL ) แต่ผมได้ยินมาว่า MySQL ไม่ฟรีบน Window
จริงเท็จนี่ผมเองก็ไม่รู้ แต่ถ้าเป็นจริง ผมก็จะหันไปใช้ DBMS ตัวอื่นแทน

ผมยอมรับว่าปัจจุบันก็ละเมิดลิขสิทธิ์ของ IDE และพวกเครื่องมือพัฒนาอยู่ ก็เพราะผมไม่มีเงินซื้อ
และราคาค่าตอบแทนที่ได้จาก Software ที่ขายไปก็ยังไม่เพียงพอสำหรับการนำไปซื้อลิขสิทธิ์
แต่ถ้าทำเป็นบริษัทผมก็คงต้องหาเงินไปซื้อมาเพื่อทำให้มันถูกต้อง

แต่ปัจจุบันนี้ผมไม่มีเงินเพราะฉะนั้นหน้าที่ของผมก็ควรทำให้มันผิดกฏหมายน้อยที่สุด 5 5 5 5
เพราะผมเชื่อว่า Developer ที่ดี ต้องไม่มีเจตนาที่จะละเมิดทรัพย์สินและความคิดผู้อื่น

Reference :: FireBird Resource

Hungarian Notation

Hungarian Notation เป็นวิธีการประกาศชื่อตัวแปร ให้ง่ายต่อการจดจำ
โดยถือเป็นมาตรฐานอย่างหนึ่งในการ เขียนโปรแกรม

Ref :: Hungarian Notation

Spec ของ C# 3.0

ถึงตอนนี้ .Net จะอยู่ที่ Version 2 แต่ว่า C# ก็ได้ประกาศ Spec ของ V 3 มาแล้ว
ความจริงแล้ว Spec ของ C#3.0 ก็มีเพิ่มมาหลายอย่าง ยกตัวอย่างเช่นการใช้ var ในการ
ประกาศตัวแปร

ตัวอย่าง
var num = 5;
var name = "Piyanut";
var vat = 0.7;

var ในที่นี้คือ variable ซึ่งเราสามารถใช้ประกาศตัวแปรได้โดยไม่ต้องกำหนด datatype
แต่มีข้อแม้คือ เราต้องกำหนดค่าเริ่มต้นให้กับตัวแปรที่ประกาศด้วย var ทันที และค่าที่ตั้งจะต้อง
ไม่ใช่ null

แต่ที่เห็นจะนิยมกันที่สุดคือ LINQ

ตัวอย่างการใช้ LINQ ใน C#3.0 ดูได้จากเวบ Microsoft เช่นเคยครับ
Ref :: LINQ SAMPLE

โปรแกรมที่ดีเริ่มที่การออกแบบ

โปรแกรมที่ดีเริ่มที่การออกแบบ . . . .

บังเอิญผมเจอ Blog บทความนี้มาจาก Blog ของคุณ Bact ซึ่งเกี่ยวกับการออกแบบ Interface
แต่บทความนี้เป็นการออกแบบ User Interface บน MacOS . .

แต่ไม่เป็นไรครับ เพราะเราสามารถนำไปใช้ได้จริงกับทุกๆ OS เนื่องจากการออกแบบโปรแกรมมีพื้นฐาน
มาจากสิ่งเดียวกัน ผมว่าเป็นบทความที่ดีมากๆเลยครับ ขอบคุณผู้เขียนและผู้เรียบเรียงจากใจจริง

Ref :: โปรแกรมที่ดีเริ่มที่การออกแบบ

Document Ref สำหรับ .net จาก Microsoft

Reference Web ทั้งหมดที่แสดงนี้อ้างอิงกับ .Net Framework Version 2.0


Reference
.Net Framework Tool

Win32API Compare with .Net Library

.Net Framework V2 Obsolete Type/Member List (By NameSpace)

การเพิ่มความเร็วตอน StartUp ให้ .net App

ประสบปัญหาเดียวกันแทบทุกคนสำหรับ Dev ที่ใช้ Java หรือ .net ในการพัฒนาโปรแกรม
ก็คือเวลาที่เสียไปกับการ StartUp Program มันช้ามากๆจริงๆ

หลังจากที่ค้นหาข้อมูลทาง Internet และได้ถามผู้คนใน Forum รวมถึงดูจาก MSDN ผมพบว่า
Microsoft ได้เตรียมเครื่องมือไว้ตัวนึงซึ่งใช้สำหรับเพิ่มความเร็วในการ StartUp App ที่พัฒนา
ด้วย .net ได้


นั้นคือ Ngen.exe ( Native Image Generator ) วิธีการใช้งานดูได้จาก MSDN
Ref :: Ngen.exe

หลังจากผมได้ทดลองใช้แล้ว ก็พบว่าเร็วขึ้น แต่ก็ไม่ได้มากมายนัก . . . แต่ก็ยังดีครับ ^ ^

Create Quality Application in Windows Vista

วันนี้ผมกำลังสร้าง Favorites หลังจากที่ทำการ Format เครื่องใหม่เพื่อที่จะให้ลง VS.net2005 ได้
ไม่เชื่อก็ต้องเชื่อนะ ว่าปัญหามันอยู่ที่ Windows ทั้งๆที่ผมไม่พบอาการผิดปกติใดๆจากการใช้งานเลย
แต่ windows ที่ลงจากแผ่นนั้นกลับไม่สามารถติดตั้ง VS.net2005 ได้ ( แปลกแต่จริง )

เช้านี้ทันทีที่เข้ามาผมก็เริ่มเก็บ Favorite ของเวบต่างๆใหม่เนื่องจากของเก่านั้นผมไม่ได้ Backup ไว้
แล้วก็แน่นอนแวะไปเยี่ยม MSDN ของ Microsoft และพบหัวข้อ สร้างโปรแกรมที่ดีบน Vista
ก็เลยทำ Links ไว้ก่อนเพราะ เผื่อจะกลับมาอ่านใหม่ตอนที่เวบ MSDN เอาออกจากหน้าแรก

Ref :: Create Quality Application in Windows Vista

ความจริงมาจนถึงวันนี้ผมยังไม่เชิงเข้าใจว่า .net 3.0 หรือ .net fx เดิมนั้นมันสิ่งที่เพิ่มมาจาก .net 2
คืออะไรกันแน่ กำลังหาข้อมูลอยู่เหมือนกัน แต่เห็นว่า Microsoft เตรียมจะจัดสัมมนาแนะนำเทคโนโลยี
ซึ่งจะแนะนำ WinFx ซึ่งอยู่ใน .net3.0 ด้วยผมก็หวังว่าจะได้เห็นคำติชมและวิจารณ์ตามเวบบอร์ด
ระหว่างนี้ก็รอต่อไป ^ ^

Sunday, September 03, 2006

Connection String

Note กันลืมนะครับ

Connection String ของ .net 2 สำหรับเรียกใช้ Oracle DB
ให้ทำการ Load ไลบรารี่ นี้ครับ

using System.Data.OracleClient;


สำหรับ String Connection

แบบอย่างสั้น
"Data Source=SampleDB;Integrated Security=yes;"

แบบมี User และ password
"Data Source=SampleDB;User Id=oradbuser;Password=securepasswd;Integrated Security=no;"

#######################################################################

และสำหรับ ConnectionString ของ DBMS อื่นๆสามารถดูได้จาก

Connection String

การเรียกใช้โปรแกรมอื่นจากโปรแกรมเรา

ผมไม่รู้ว่าจะตั้ง Title ยังไงดี . . .

เช่นหากต้องการเขียนโปรแกรมให้ Shutdown เครื่องหรือ Restart เครื่องได้ตามต้องการ
แต่จะต้องรันบน Windows XP นะ ^o^

ถ้าต้องการจะสั่ง Shutdown ทำโดย
System.Diagnostics.Process.Start("shutdown", "/s")

ถ้าจะสั่ง Restart ทำโดย
System.Diagnostics.Process.Start("shutdown", "/r");

ง่ายๆเลยก็เปิด cmd ของ WinXP แล้วก็พิมพ์ shutdown ในช่องจะพบวิธีการใช้คำสั่ง shutdown
แต่สิ่งหนึ่งที่ผมไม่เข้าใจก็คือ ทำไมเราใช้คำสั่ง

using System.Diagnostics;

แล้วทำการประกาศ

Process pc = new Process();
pc.start("shutdown","/s");

แล้วถึงไม่ได้ผล . . . - -''

แต่สั่งตรงๆโดยใช้คำสั่ง
System.Diagnostics.Process.Start("shutdown", "/s");

กลับผ่าน - -'' ไม่เข้าใจ ไม่เข้าใจ ไม่เข้าใจ แต่ช่างมันเถอะครับ ^^