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#
Friday, September 22, 2006
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 ก็ได้นะครับ
แต่ผมจะเขียนเป็นโปรแกรม อิอิ
ทำดังนี้ครับ
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 นะครับ ^-^ ทำงานได้ดีมั๊กๆ ^ ^
โดยวิธีการคือผมทำ 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
ความจริงแล้วเค้าไม่แนะนำให้ทำแบบนี้นะครับ ( แต่ผมจะทำเพราะยังไม่ได้ออนไลน์ )
ตอนนี้ใหม่สุดจากเวบเค้าก็เป็นรุ่น 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
ผมเองจำได้นะว่ามันทำได้ แต่ก็ไม่เคยมี 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..
ตัวอย่าง 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);
###########################################################
วิธีการนี้เราสามารถที่จะนำไปประยุกต์ใช้กับโปรแกรมแปลงประเภทฐานข้อมูลได้ . . หรือนำไป
ประยุกต์ใช้กับโปรแกรมประเภทอื่นๆ ^ ^
ไฟล์ 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 ครับผม
และ ชื่อของ 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
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 คงช้ามากๆเหมือนกัน
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
แค่นี้เอง
นั่นเป็นเหตุผลที่ผมต้องใช้ 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 ออกมาเท่านั้นเอง ^ ^
แต่ก็นั่นแหละ บางทีก็อยากจะรู้ไว้บ้างเหมือนกัน
ตัวอย่าง 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# นะครับ )
สำหรับ 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 ที่ชี้ไปที่เวบไซต์ของผม ^^
ได้ไม่ได้เดี๋ยวก็รู้กันแล้วครับ ( แต่ผมว่าได้นะ เพราะเมื่อกี้ได้ยินเสียงเพลงแล้ว )
เมื่อเดือนสิงหา ที่ผ่านมา
มาวันนี้ผมได้ทดสอบนำไฟล์ 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 ใหม่ขึ้นมาแล้วก็ไปแก้ซะ . . .
งานนี้ คงต้องบอกว่าผมโชคดีนะ ที่ว่าเคยอ่าน 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
( ที่เหลือผมยังคิดไม่ออกครับ ^ ^ )
เลยได้ขอคำแนะนำเกี่ยวกับการสร้าง 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 ก็จะสามารถใช้ได้เช่นเคยครับ
ซึ่งผมเองก็ไม่มั่นใจนะครับว่าเป็นไวรัสอะไร แต่เคยเจออาการนี้มานานแล้ว
อาการที่พบจะมีหลายอาการไป แล้วแต่โชคแต่ดวงดังนี้
- เข้า 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();
}
สามารถทำได้โดยวิธีการดังนี้ ( ใน .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 อีกตั้งหาก
เราก็ต้องทำการ 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
การใช้งาน 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
ซึ่งที่ผมทราบเพราะผมเคยต้องเขียน 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
โดยถือเป็นมาตรฐานอย่างหนึ่งในการ เขียนโปรแกรม
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
ความจริงแล้ว 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 :: โปรแกรมที่ดีเริ่มที่การออกแบบ
บังเอิญผมเจอ 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)
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
หลังจากผมได้ทดลองใช้แล้ว ก็พบว่าเร็วขึ้น แต่ก็ไม่ได้มากมายนัก . . . แต่ก็ยังดีครับ ^ ^
ก็คือเวลาที่เสียไปกับการ 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 ด้วยผมก็หวังว่าจะได้เห็นคำติชมและวิจารณ์ตามเวบบอร์ด
ระหว่างนี้ก็รอต่อไป ^ ^
ไม่เชื่อก็ต้องเชื่อนะ ว่าปัญหามันอยู่ที่ 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
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");
กลับผ่าน - -'' ไม่เข้าใจ ไม่เข้าใจ ไม่เข้าใจ แต่ช่างมันเถอะครับ ^^
เช่นหากต้องการเขียนโปรแกรมให้ 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");
กลับผ่าน - -'' ไม่เข้าใจ ไม่เข้าใจ ไม่เข้าใจ แต่ช่างมันเถอะครับ ^^
Subscribe to:
Posts (Atom)