Just a Ordinary Programmer
Archive for October, 2009
Pharse Object to XML String | เปลี่ยน Object ไปเป็น XML ดีกว่า
Oct 2nd
เคยไหมที่แบบว่าอยากจะเก็บ Object สักตัว ลง Database แล้วเดี๋ยวค่อยเรียกมาใช้ทีหลัง
เมื่อก่อนผมก็ อ้อ Object นี้มี กี่ Attributes ก็ยัดลง database ตาม field นั้น ๆ
จะเก็บกัน 3 Object ก็สร้าง 3 Table เขียน 6 method (แปลงลง database แล้วก็ แปลงกลับมาใช้อีก) เฮ้อ เหนื่อยว่ะ
จนมาเจอวิธีนี้ ผมเขียน class มี static method ไว้ใช้เลย ใช้ได้กับทุก object เก็บลง field เดียวเป็น xml string โอ้ว แหล่มเลย
ลองดู code นะครับ
(ส่วนนี้ ผมไม่ comment นะคับ comment แล้วรู้สึกว่าจะยาว แต่ถ้าสงสัยก็ ถามไว้เดี๋ยวมาตอบคับ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | using System; using System.Xml; using System.Xml.Serialization; using System.IO; public class ObjectPharsing{ public static string ToXml(Object obj) { if (obj==null) throw new Exception("The object is not initialzed"); StreamWriter writer = null; XmlSerializer serializer = null; string result = null; try { MemoryStream mem = new MemoryStream(); writer = new StreamWriter(mem); serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(writer, obj); byte[] data = mem.ToArray(); result = System.Text.Encoding.UTF8.GetString(data); } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { if (writer != null) writer.Close(); } return result; } public static object ToObject(string xml, Type type) { byte[] data = System.Text.Encoding.Default.GetBytes(xml); MemoryStream mem = new MemoryStream(data); StreamReader reader = null; XmlSerializer serializer = null; object obj = null; try { reader = new StreamReader(mem); serializer = new XmlSerializer(type); obj = System.Convert.ChangeType(serializer.Deserialize(reader), type); } catch (Exception ex) { throw new Exception(ex.Message + "\r\n" + ex.StackTrace, ex); } finally { reader.Close(); } return obj; } } |
เวลาจะใช้ก็
1 2 3 4 5 6 7 8 9 10 11 12 13 | //...blah blah blah MyClass mc = new MyClass(); mc.attribute1 = "Init. Value"; mc.attribute2 = 20; //... blah blah blah จะกำหนดค่าอะไรก็กำหนดไป ทำอะไรก็ทำไป //แล้วก็ค่อยมาแปลงเป็น xml string string mcXml = ObjectPharsing.ToXml(); //คราวนี้ก็ค่อยเอา mcXml ไปลง database //สมมติเราเอาค่ามาจากที่เราลง database มาใช้ string restoreXml = ds.Tables[0].rows[0]["XML_STRING"].toString(); MyClass restoreMc = (MyClass)ObjectPharsing.ToObject(restoreXml,typeof(MyClass)); |
C#.NET Query with Parameter
Oct 2nd
คนเรามันก็เหมือนกิ้งก่า อยู่ที่ไหนก็เปลี่ยนไปตามนั้น (จริง ๆ ก็คือทำเสร็จแล้วลืมนั่นเอง เจอของเก่าเขาทำไว้ไงก็ทำงั้น)
จริง ๆ ผมก็เคยเขียน code แบบนี้มาตั้งนานละ แต่ก็ลืม ๆ ไปเพราะว่าที่ทำงานที่นี่ Programmer ส่วนใหญ่เวลาจะเขียน Query ก็เอา String เชื่อม ๆ ต่อ ๆ กับ Value จนได้ Query มาชุดนึง แล้วก็เอาไป Query
มันก็ทำงานได้ดีอยู่หรอก แต่วันนี้นี่สิ วันที่ผมต้องมาแก้ไขระบบนิดหน่อย แล้วดันตั้ง Query ข้อมูล ที่เป็น DateTime เอาแล้วไง จะ Query ยังไงล่ะ จะทำให้เป็น format ไหน มันก็แล้วแต่เครื่องที่จะเปิดนี่นาว่าเขาจะตั้งไว้เป็นยังไง
หรือจะเขียน Store Procedure เอ แล้วถ้าไม่มีสิทธิ์ล่ะ แล้วถ้าเขียน Store Procedure ไม่เป็นล่ะ (จริง ๆ อันนี้แหล่ะเหตุผลจริง ๆ ของผม)
วุ่นวาย ๆ ปวดหมอง ๆ
ก็เลยแนะนำวิธีนี้ละกัน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SqlConnection conn = new SqlConnection(ConnectionString); //เขียน Query แล้วก็ใส่ @ชื่อparam แทน Parameter ที่จะใช้ string sql = "SELECT * FROM MyTable " + "WHERE Name=@name AND RegisDate=@regisdate"; SqlCommand cmd = new SqlCommand(sql, conn); //ก็ Add parameter ก่อน โดย ชื่อก็จะขึ้นต้นด้วย @ //แล้วก็เหมือนกับที่เราเขียนใน sql query ด้านบน แล้วก็ระบุ Type ด้วยนะ cmd.Parameters.Add("@name", SqlDbType.VarChar); cmd.Parameters.Add("@regisdate", SqlDbType.DateTime); //จากนั้นก็กำหนดค่ามันลงไป ตาม Type นั้น ๆ //จะเป็น DateTime หรืออะไรก็ใส่กันไปโต้ง ๆ เลย cmd.Parameters["@name"].Value = 'Krucode'; cmd.Parameters["@regisdate"].Value = DateTime.Now; // อ่ะ ก็เอา Data ไปใช้ SqlDataAdapter mydata = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); mydata.Fill(ds, "CL"); |
มันจะช่วยแก้ปัญหาเรื่อง DateTime ได้ชะงัดนัก
จริง ๆ ผมเชียร์ให้เขียน code แบบนี้นะ ดีกว่าเขียนเชื่อม string แบบ
1 2 | string sql = "SELECT * FROM MyTable " + "WHERE Name='"+Krucode+"' ORDER BY NAME"; |
นะ แก้ลำบาก
สู้ ๆ o.O!
Padding String | จาก ’1′ เป็น ’0001′
Oct 2nd
วันนี้ผมจะมาเขียนเรียกใช้ Function ตัวเล็ก ๆ ง่าย ๆ แต่มักจะลืมเวลาจะใช้ -*- (จริง ๆ นี่ก็ลืมทุก Function เลยนะ ฮ่า ๆ)
Function ตัวนี้ก็ง่าย ๆ มั่ก เวลาเราต้องการจะเปลี่ยนตัวเลข (หรือข้อความ) จาก 1 เป็น เลขพวกเลขต่อเนื่องแบบ 4 หลักเช่น 0001 เนี๊ยะ มันก็ง่าย ๆ ประมาณนี้แหล่ะครับ (ดู code น่าจะเข้าใจ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | string myNumber1 = "1"; string myNumber2 = "34"; Console.Write(myNumber1.PadLeft(4, 0)); //จะได้ 0001; Console.Write(myNumber2.PadLeft(4, 0)); //จะได้ 0034 Console.Write(myNumber1.PadRight(4, 0)); //จะได้ 1000 Console.Write(myNumber2.PadRight(4, 0)); //จะได้ 3400 |
รูปแบบการใช้ก็ string x = y.PadLeft(ความยาวทั้งหมดที่ต้องการ, ตัวอักษรที่จะเติมจนยาวเท่าที่ต้องการ);
PadLeft ก็จะเติมทางซ้าย (ให้ข้อความเดิมอยู่ชิดขวา)
PadRight ก็จะเติมทางขวา (ให้ข้อความเดิมอยู่ทางซ้าย)
ไม่ยากใช่ไหมคับ ^___^
เปิดโปรเจ็ค .NET 2003
Oct 2nd
“แว๊กกก!”
ผมเกิดอาการอย่างนี้ทุกทีที่ต้องเปิด Project ของ Visual Studio .NET 2003
วันนี้ก็เลยรวบรวมปัญหาที่เจอ และวิธีเปิดที่ลองมานักต่อนักแล้วชะงัด
หลังจากทีได้โปรเจ็คมาแล้ว
สมมติ ไฟล์ผมเก็บไว้ที่ D:\MyFolder\ThisProject\
โดยมี ไฟล์ MySolution.sln และไฟล์ MyProject.csproj อยู่ใน folder นั้น (ไฟล์อื่น ๆ ของโปรเจ็คด้วยนะ ละไว้ในฐานที่เหมือนจะเข้าใจ)
ทำตามขั้นตอนเลยละกัน
- คลิกขวาที่ folder ThisProject เลือก Properties เลือก tab Web Sharing เลือก Share This Folder

มันจะไปสร้าง Alias ใน IIS ให้เรา เพื่อที่จะเข้าเวป http://localhost/ThisFolder ได้ - เช็คว่า มีไฟล์ชื่อ MyProject.csproj.webinfo อยู่ไหม ถ้าไม่มี ก็สร้างไฟล์นี้ซะ เนื้อหาข้างในไฟล์ก็
<VisualStudioUNCWeb> <Web URLPath = "http://localhost/ThisFolder/MyProject.csproj" /> </VisualStudioUNCWeb>
- ก็ double click MySolution.sln ได้เลย
- ในกรณีที่มี Error เกิดขึ้น “Unable to get project file from the web server.”
- ลบไฟล์ MySolution.suo
- ลบ folder ThisFolder ที่ C:\Documents and Settings\USERNAME\VSWebCache\COMPUTER_NAME\
- double click MySolution.sln อีกครั้ง ถ้ายังไม่ได้อีกให้ทำใจ
เฮ้ย! ไม่ใช่! ให้เข้า IIS ลบ Virtual Directory ของเรา สร้างใหม่ ให้ไปที่ ThisFolder แล้วก็เข้า MySolution.sln อีกครั้ง
- ในกรณีที่มี Error เกิดขึ้น “Unable to get project file from the web server.”
ผมก็ไม่ได้ expert มาจากไหน แต่หลังจากเปิด VS2003 มาหลายโปรเจ็คแล้ว ก็เลยรวบรวมวิธีเก็บไว้น่ะครับ ผมอาจจะไม่รู้ว่ามันเป็นเพราะอะไร หาสาเหตุไม่ได้ diagnosis ไม่ได้ แต่ รู้แค่ว่า แก้อย่างนี้แล้วเปิดได้ ก็เอามาแชร์ ๆ ไว้น่ะครับ (กันตัวเองลืม)
ถ้ายังไงใครเจอวิธีที่ดีกว่าก็ช่วยมาแบ่งบันด้วยนะครับ ^____^
SVN | Subversion | การควบคุมเวอร์ชั่น
Oct 2nd
วันก่อน (วันที่เท่าไหร่ฟ๊ะ) พี่ @roofimon เข้ามา session give ‘n’ take ที่ S! (ซึ่งผมก็ take ‘n’ take ตลอดเลย) มาพูดเรื่อง Subversion (กับ “Java เร็ว (ตายละ) Ruby ห่วย Python กาก PHP กระจอก” ที่เป็น session นึงใน barcamp#3 ที่พี่เค้าไปพูด … อันนี้ถ้าสนใจจะโพสวิดีโออีกที)
สำหรับคนที่ไม่รู้เลยว่าไอ่ Subversion คืออะไร (เช่น โปรแกรมเมอร์บ้าน ๆ ที่ทำงานคนเดียวอย่างผม) ผมว่าวิดีโออันนี้น่าจะทำให้เข้าใจ concept ได้ดีขึ้น
ปล. ขออภัยสำหรับคุณภาพวิดีโอที่เฮ่ย มาก กล้องมันเฮ่ย เลยทำให้หน้าพี่ roofimon มืดทะมึนมาเชียว เลยไม่รู้เลยว่าพี่เค้าหล่อแหลม (เหลา) ขนาดไหน