วันจันทร์ที่ ๒๖ พฤศจิกายน พ.ศ. ๒๕๕๐

เทคนิคการทำ multiple query ใน connection เดียว โดยใช้ MARS ใน ADO.NET 2.0 (Multiple active result sets - MARS)

ส่วนใหญ่แอพพลิเคชั่นที่ต้องติดต่อฐานข้อมูล เรามักจะสร้าง DataAccess Layer มาเป็นตัวจัดการกับฐานข้อมูล แทนที่จะติดต่อโดยตรง ซึ่งตัว DatAccess นี้ ก็ต้องใช้ ADO.NET ที่มี Connection object เป็นตัวระบุฐานข้อมูล ซึ่งการ query หรือ insert, update, delete แต่ละครั้ง (รวมทั้งการ call Store Procedure ด้วย) ก็ต้องเปิด/ปิด connection ทุกครั้ง ถ้ามีการติดต่อกับฐานข้อมูลถี่มากๆ จะทำให้ประสิทธิภาพโดยรวมลดลง เพราะต้องใช้ bandwidth ของระบบเครือข่ายมากขึ้น ผมเคยแอบ query หลายๆ ครั้งใน connection เดียว ผลที่ได้คือ ระบบเตือนว่า "There is already an open DataReader associated with this Connection which must be closed first."

ทางแก้คือ ใช้เทคนิคการสร้าง connection ด้วย MARS (Multiple Active Result Sets) เทคนิคนี้ใช้ได้เฉพาะ SQL Server 2005 กับ ADO.NET 2.0 เท่านั้น (เวอร์ชั่นต่ำกว่านี้ทำไม่ได้) วิธีการก็แสนง่าย แค่ระบุ MultipleActiveResultSets=True เพิ่มเข้าไปใน Connection String เท่านั้นเอง เช่น

"Server=myServerAddress;Initial Catalog=TestDatabase;User Id=admin;Password=1234;User Instance=False;MultipleActiveResultSets=True"

แหล่งข้อมูล :
Connection String (SQL Server 2005)
ADO.NET 2.0 Multiple Active Resut Sets per connection in Sql Server 2005
Multiple Active Result Sets (MARS) in SQL Server 2005
Developing Client Applications with ADO .NET 2.0
Execute Multiple Queries on a Single Connection
Teach Old Data New Tricks with the Fully Loaded Advances in ADO.NET 2.0

วันศุกร์ที่ ๒๓ พฤศจิกายน พ.ศ. ๒๕๕๐

ลองของใหม่กับ Visual Studio 2008 Express Edition

Visual Studio 2008 Express Edition
เช่นเดิมครับ กับรุ่นใช้งานฟรีเวอร์ชั่น express ซึ่งพ่วง SQL Server 2005 Express มาด้วย (SQL Server 2008 จะออกในประมาณปีหน้า) ตัวที่ผมนำลงที่เครื่องตัวเองนั้น ผมเลือกดาวน์โหลดแบบ offline install ซึ่งรวมทุกตัวเลย ขนาดประมาณ 800 MB กว่าๆ ถ้าใครอยากจะ install แยก ก็ต้องเลือกแบบ web install ซึ่งถ้าเน็ตไม่แรงผมไม่แนะนำ

ใช้เวลาลงประมาณครึ่ง ชม. (แล้วแต่เครื่องใครเร็วใครช้า) ใครไม่อยากลง SQL Server 2005 Express ก็ไม่ต้องเลือก .NET Framework ที่มากับ 2008 คือเวอร์ชั่น 3.5

สิ่งที่เปลี่ยนแปลงไปในการพัฒนา Windows Application คือ WPF(Windows Presentation Foundation) ซึ่งผมลองเล่นซักพักแล้วมึนครับ เพราะแนวคิดการสร้าง UI ต่างไปจากเดิมมาก สงสัยต้องเหนื่อยศึกษาเพิ่มเติม ที่สังเกตคือ UI ทั้งหมดคือ XAML สามารถกำหนดรูปแบบ รูปร่างหน้าตา อีเวนต์ ได้จากใน XAML เลย ส่วน control ต่างๆ ก็มีแปลกๆ เพิ่มขึ้นเยอะ เช่น Elipse (วงรี), Frame, Canvas, Expander เป็นต้น

แต่ Intelisense ฉลาดขึ้นเยอะเลย ผมรู้สึกว่าการเขียน VB.NET ใน VS2008 ตัวนี้ให้อารมณ์เหมือน C# เลยครับ เดี๋ยวต่อไปอาจขอลอง LINQ และ WPF ให้ชำนาญก่อน แล้วค่อยมาบอกกล่าวกัน (ที่จริง .NET 2.0 ยังศึกษาไม่ครบเลย)

อ๋อ...ลืมพูดถึง Visual Web Developer 2008 ไป ซึ่งตัวนี้ผมเห็นแค่มีโปรเจ็คชนิด WCF เพิ่มขึ้นมาเท่านั้น ไม่มีโปรเจ็คเทมเพลตแบบ AJAX ตอนแรกนึกว่าจะไม่มี AJAX มาด้วย ที่แท้ก็ build-in มาแล้ว เป็น Microsoft AJAX Library เวอร์ชั่น 3.5 ครับ (Microsoft AJAX Library 1.0 ใช้กับ .net framework รุ่นก่อนหน้าเท่านั้น)

สุดท้าย ที่เครื่องผมลง VS2005 อยู่นะครับ ไม่ก้าวก่ายกันครับ สบายใจได้ ก็เหมือนตอน VS2005 ออกใหม่ๆ นึกว่าจะไปกวน VS2003 ที่แท้ก็สงบเสงี่ยมอยู่ของใครของมันครับ (ที่จริงที่เครื่องผมลง Expression Blend + .NET 3.0 ไว้ด้วยซ้ำ) และที่สำคัญไม่ช้านะครับ พอๆ กับ VS2005 เลยครับ

แหล่งข้อมูล :
Visual Studio 2008 Express Developer Center

วันพฤหัสบดีที่ ๒๒ พฤศจิกายน พ.ศ. ๒๕๕๐

รูปแบบโครงสร้างของ Regular Expression (Regular Expression Syntax)

เรื่องราวของ Regular Expression นั้น มีมานานก่อนการเกิดขึ้นของ .NET เพราะมีพื้นฐานมาจากวิชา Theory of Computation ซึ่งมีการนำไปใช้ในการทำ string matching กันอย่างมาก โดยมีภาษา Perl ที่ได้รับการยกย่องว่าเป็นเทพในเรื่องนี้ และก็กลายเป็นรูปแบบที่ .NET ยืมมาใช้ด้วย (Perl5 compatible) การทำ string matching นั้น มีประโยชน์มากในการกลั้นกรอง หรือตรวจสอบข้อความที่ต้องการ

ที่ผมใช้บ่อยๆเห็นจะเป็นการตรวจสอบ user input สำหรับ .NET แล้ว กรณีที่เป็น Web Application สามารถใช้คอนโทรลกลุ่ม validation เช่น RequiredFieldValidator, RangeValidator เป็นต้น ซึ่งหนึ่งในนั้นมีคอนโทรลที่ชื่อ RegularExpressionValidator อันมีความสามารถ ในการสกัดเอาเฉพาะข้อความที่ต้องการได้ รูปแบบสไตล์ AJAX ด้วย (เพราะเบื้องหลังใช้ความสามารถของ JavaScript) โดยต้องเขียน Regular Expression ไว้ที่ properties ชื่อ ValidationExpression ส่วนกรณีเป็น Windows Application นั้น จะใช้คลาส System.Text.RegularExpressions.Regex มาตรวจสอบเอง (ที่จริงกรณีเป็น Web Application ก็สามารถใช้คลาสนี้ตรวจสอบเองที่ฝั่งเซิร์ฟเวอร์ก็ได้)

การเขียน Regular Expression และตัวอย่างการใช้งาน
\ คือ สัญลักษณ์บ่งบอกอักขระพิเศษที่ต่อท้ายมัน เช่น \\ หมายถึง \, \( หมายถึง (, \n หมายถึง newline, \r หมายถึง return

^ คือ สัญลักษณ์บ่งบอกว่าเป็น จุดเริ่มต้นของข้อความ (กรณีที่ใช้อ๊อบเจ็ค Regex แล้วกำหนดพร็อบเพอร์ตี้ Option เป็น MultiLine จะถือว่า \n หรือ \r คือจุดเริ่มต้นเสมอ)

$ คือ สัญลักษณ์ของ จุดสิ้นสุดของข้อความ ซึ่งคล้ายกับ ^

(ส่วนใหญ่สัญลักษณ์ ^ หรือ $ จะใช้กับข้อความที่มีหลายบรรทัด)

* คือ สัญลักษณ์ที่บ่งบอกว่า อักขระหน้ามันจะมีซ้ำกี่ครั้งก็ได้ หรือไม่มีเลยก็ได้ (หรือพูดง่ายๆ ว่าตั้งแต่ 0 ตัวขึ้นไป) ตัวอย่างเช่น ab* หมายถึง a, ab, abb, abbb, abbb... อีกตัวอย่าง (ab)*c หมายถึง c, abc, ababc, abab....c เป็นต้น

+ คือ สัญลักษณ์ที่คล้ายๆ * แต่ต่างกันที่ + จะต้องมีอย่างน้อย 1 ตัว (หรือตั้งแต่ 1 ตัวขึ้นไป) ถ้าใช้ตัวอย่างคล้ายๆ ด้านบนเช่น ab+ หมายถึง ab, abb, abbb... อีกตัวอย่าง (ab)+c หมายถึง abc, ababc, abab.....c

? คือ สัญลักษณ์ที่บ่งบอกว่า อักขระหน้ามันจะมีหรือไม่ก็ได้ แต่ถ้ามีจะมีแค่ชุดเดียว ตัวอย่างเช่น ab? หมายถึง a หรือ ab เท่านั้น อีกตัวอย่าง a(bc)? หมายถึง a หรือ abc เท่านั้น

(ข้อสังเกต สัญลักษณ์จะครอบคลุมแค่อักขระหน้ามันตัวเดียวเท่านั้น เช่น ab+ แค่อักษร b ตัวเดียวเท่านั้นที่มีอย่างน้อย 1 ตัว ถ้าต้องการให้ครอบคลุมตัวอักษรที่ต้องการให้ใส่วงเล็บคลุมไว้)

ตัวอย่างการนำไปใช้จริง
email
รูปแบบ "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
ตัวอย่างที่ valid ผ่าน เช่น ex-th3.d@thailand5-go.co.th
ตัวอย่างที่ valid ไม่ผ่าน เช่น ex-@gmail.

แหล่งข้อมูล :
Introduction to Regular Expressions
Regular Expression Syntax
Use Regular Expressions to Constrain Input in ASP.NET

วันจันทร์ที่ ๑๒ พฤศจิกายน พ.ศ. ๒๕๕๐

อัพโหลดไฟล์แบบ AJAX บน ASP.NET (ASP.NET AJAX FileUpload)

ในการทำระบบอัพโหลดไฟล์บน ASP.NET AJAX Extension โดยใช้ FileUpload Control นั้น ผมพบว่าไม่สามารถอัพโหลดได้ เมื่อลอง Debug ดู พบว่า property ชื่อ PostedFile ของอ็อบเจ็ค FileUpload มีค่าเป็น 'null' หรือ 'Nothing' ผมจึงได้พยายามหาคำตอบจึงพบว่า ในเว็บ http://www.asp.net/ajax/documentation/live/overview/UpdatePanelOverview.aspx (หัวข้อ Controls that Are Not Compatible with UpdatePanel Controls) ได้บอกเป็นทางการไว้แล้วว่า server control ใดบ้างที่ UpdatePanel Control ไม่ซัพพอร์ต ซึ่งหนึ่งในนั้นคือ FileUpload ที่มีการใช้งานแบบ asynchronous postback (เป็นการทำงานโดย default ของ UpdatePanel Control)

ด้วยปัญหาที่ได้เขียนมา ผมก็ต้องแก้ไขปัญหาโดยการค้นคว้าหาข้อมูลจากอินเตอร์เน็ต ซึ่งพบว่า มีคนแก้ปัญหานี่ไว้หลายวิธี เรียงตามความยุ่งยากในการ implement นะครับ ได้แก่

1. กำหนดให้ UpdatePanel Control ที่มี FileUpload Control ทำงานแบบ synchronous postback นั้นคือต้องไปกำหนด attribute ของ UpdatePanel เป็น UpdateMode="Conditional" แล้วเพิ่มแท็ก <Triggers> เข้าไปแท็กลูกของแท็ก UpdatePanel Control เช่น

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:PostBackTrigger ControlID="btnUpload" />
</Triggers>
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" Width="380px" />
....

* ข้อเสียของวิธีที่ 1 คือ ถ้าเราใช้ AJAX Control ที่ทำงานแบบ asynchronous postback เช่น UpdateProgress (ซึ่งถือเป็นเสน่ห์ของ web app. แบบ AJAX) จะไม่สามารถทำงานได้

2. เขียน JavaScript เพิ่ม เพื่อเสริมการทำงาน ซึ่งเท่าที่ผมค้นมาได้ก็เห็นอยู่ 3 คน คือ
1).ของ Dzianis ซึ่งเขียนโค้ดไว้ใน CodeProject.com โดย Dzianis ได้ใช้ AJAX ร่วมกับเว็บเซอร์วิสในการอัพโหลดไฟล์
2).ของ Vinayak Kumar Shrestha เป็นคนเนปาล เขียนรายละเอียดไว้ที่บล็อกตัวเอง 2 บทความ โดยบทความแรก (Uploading files using asp.net ajax extensions) เป็นการบอกปัญหาและทางแก้ไข บทความที่ 2 (ajax extensions file upload workaround) เป็นตัวอย่างจริงในการแก้ปัญหาซึ่งมีโค้ด VB.NET ให้ดาน์วโหลดด้วย (zip 4kB) ซึ่งผมลองนำมาใช้ดู พบว่ายังมีการมี postback หน้าเว็บอยู่ ทำให้มีไม่ความรู้สึกเป็น AJAX
3).ของ Kazi Manzur Rashid (Amit) ซึ่งเขียนวิธีของเค้าไว้ในบทความ Create An Ajax Style File Upload ที่บล็อกเค้า มีให้ดาน์วโหลดโค้ดด้วย

3. ใช้ Custom ASP.NET AJAX Server Control ที่มีผู้สร้างไว้ เท่าที่ผมหาเจอ คือของ Subgurim ที่ codeplex.com ตอนที่ผมเขียนเค้าทำถึงเวอร์ชั่น 1.2 ไฟล์ดาวน์โหลดเป็น .dll (ถ้าสนใจวิธีการสร้างหรือต้องการนำมา customize ต่อ ก็มี source code ให้โหลดครับ) ขั้นตอนการนำมาใช้ก็ง่ายๆ เพียงนำไฟล์ FUA.dll ไปวางไว้ในโฟลเดอร์ bin ของ web app. ของเรา แล้วเพิ่ม
<%@ Register Assembly="FUA" Namespace="Subgurim.Controles" TagPrefix="cc1" %>
ที่ไฟล์ .aspx และเอา
<cc1:FileUploaderAJAX ID="FileUploaderAJAX1" runat="server" />
ไปวางไว้ในส่วนที่ต้องการให้แสดงคอนโทรล ส่วนในหน้า code-behide (.cs หรือ .vb) ให้ประกาศเนมสเปชที่ด้านบนก่อน เช่น using Subgurim.Controles; หรือ Imports Subgurim.Controles แล้วเขียนคำสั่งใน Page_Load และ Method ดังนี้

//สำหรับ C#
protected void Page_Load(object sender, EventArgs e)
{
if (FileUploaderAJAX1.IsPosting)
this.managePost();
}

private void managePost()
{
HttpPostedFileAJAX pf = FileUploaderAJAX1.PostedFile;

//กรณีต้องการต้องสอบชนิดและขนาดไฟล์
if (pf.ContentType.Equals("image/gif") && pf.ContentLength <= 5 * 1024)
FileUploaderAJAX1.SaveAs("~/temp", pf.FileName);
}


4. สร้าง Custom ASP.NET AJAX Server Control ขึ้นใช้เอง ซึ่งผมน่าจะเขียนแยกไว้เป็นอีกบทความนึง ผู้สนใจลองดูวีดีโอนี้ไปก่อนครับ How Do I:Build a Custom ASP.NET AJAX Server Control? ความยาวประมาณ 20 นาที

แหล่งข้อมูล :
UpdatePanel Control Overview
ASP.NET AJAX Videos
fileuploadajax.subgurim.net
Simple AJAX File Upload

วันเสาร์ที่ ๑๐ พฤศจิกายน พ.ศ. ๒๕๕๐

รูปแสดงระหว่างรอการทำงาน เหมาะกับ AJAX (AJAX Progress Image Indicators)

ใครที่ใช้ AJAX คงจะต้องการ progress images ไว้แสดงขั้นเวลาแน่นอน พอดีผมไปหาเจอแหล่งรูปดีๆ เลยนำมาบอกกันครับ ตัวอย่างข้างล่าง
Photo Sharing and Video Hosting at Photobucket Photo Sharing and Video Hosting at Photobucket Photo Sharing and Video Hosting at Photobucket Photo Sharing and Video Hosting at Photobucket Photo Sharing and Video Hosting at Photobucket Photo Sharing and Video Hosting at Photobucket

http://www.napyfab.com/ajax-indicators/
เว็บนี้เป็นรูปแสดงทั้งหน้าเลย มีให้เลือกแบบรูปที่มี background สีขาวและดำ (เว็บนี้ไม่มีแล้วนะครับ)

http://www.ajaxload.info/
เว็บนี้ เป็นเครื่องมือให้ generate รูปตามต้องการเลยครับ

http://mentalized.net/activity-indicators/
เว็บนี้รูปน้อย แต่มีแปลกๆ

แหล่งข้อมูล :
Tip/Trick: UpdateProgress Control and AJAX Activity Image Animations