Thursday, May 31, 2007

CD ASP.NET 2.0 โดย อ.ธงชัย

วันนี้ไปที่ร้านหนังสือ บังเอิญพบ CD+หนังสือ ASP.NET 2005 Traning โดย อ.ธงชัย ซึ่งเป็น CD การเรียนการสอนที่ดีมากๆ เพราะได้ติดตามตั้งแต่ ASP.NET 2003 ที่มี CD ทั้งหมด 6 แผ่น


ในเวอร์ชัน ASP.NET 2005 หรือ ASP.NET 2.0 นี้ อ.ธงชัย ได้จัดทำขึ้น 2 ชุด ชุดละ 3 แผ่น ราคาชุดละ 240 บาทเท่านั้น ถ้าซื้อทาง On-line ยังลดราคาเหลือชุดละ 204 บาทเท่านั้นเอง ผมขอสนับสนุนสื่อการเรียนการสอนของคนไทยอย่างนี้มากๆครับ นอกจากเนื้อหาที่มีมากและมีคุณภาพแล้ว ราคายังถูกอีกด้วยครับ และผมขอสนับสนุนของแท้เท่านั้นครับ


วันนี้จึงได้อุดหนุนมาทั้ง 2 ชุด รวม 6 แผ่น เนื้อหาจะต่อเนื่องจากเวอร์ชัน 2003 ครับ โดยรวมแล้ว "ดีมากครับ" ไม่ผิดหวังเลยครับ


สามารถดูเนื้อหาได้ทีนี่ครับ ASP.NET 2005 Traning ชุดที่ 1 , ASP.NET 2005 Traning ชุดที่ 2


ปล.ผมไม่ได้รับผลประโยชน์ใดๆ กับการ post เรื่องนี้นะครับ เป็นความชอบส่วนตัวและเนื่องจากเห็นของเขามีคุณภาพจริง กรุณาพิจารณาและตัดสินใจด้วยตนเองด้วยนะครับ อย่าเชื่อผมมากเลยครับ

Thursday, May 24, 2007

การใช้ Transaction ใน ADO.NET

ADO.NET Transaction เริ่มต้นด้วยการใช้ BeginTransaction method ของ Connection class ซึ่ง method นี้จะคืนค่า sqlTransaction object ถึงแม้จะใช้ OleDbConnection, OracleConnection ก็จะมี BeginTransaction method เหมือนกัน

เมื่อทำการ execute งานภายใน Transaction block เสร็จแล้ว จะต้องเรียก Commit หรือ Rollback method อย่างใดอย่างหนึ่งตามที่ต้องการ

ในการทำงานร่วมกับ ADO.NET Transaction ต้องเปิด connection และสร้าง instance ของ transaction จากนั้นก็เรียกใช้ method ต่างๆ ที่จำเป็นซึ่งจะอธิบายต่อไป

Transaction ที่ ADO.NET สนับสนุน คือ sqlTransaction class ซึ่งมี namespace คือ System.Data.SqlClient โดย sqlTransaction class มร property หลัก 2 ตัว คือ
  • Connection คือ instance ของ sqlConnection ที่ instance ของ Transaction อ้างถึง
  • IsolationLevel เป็นการระบุ IsolationLevel ของการทำ Transaction

Method ของ Transaction class ที่สำคัญประกอบด้วย
  • Commit เป็นการเรียกให้ transaction ทำการ commit
  • Rollback เป็นการเรียกให้ transaction ทำการ rollback
  • Save เป็นการทำ save point ให้กับ transaction ทำให้สามารถ rollback ไปยังจุดที่ save point ไว้ได้

ขั้นตอนในการทำงานของ ADO.NET Transaction
  1. ติดต่อฐานข้อมูล
  2. สร้าง SqlCommand instance และระบุ parameters ที่จำเป็น
  3. เปิดฐานข้อมูล
  4. เรียก BeginTransaction method ของ Connection object เพื่อทำการเริ่มต้น Transaction
  5. ทำการ execute ข้อความ sql statements โดยใช้ command instance
  6. เรียก Commit method ของ Transaction object เพื่อให้ transaction เสร็จสมบูรณ์ หรือ เรียก rollback method เืพื่อยกเลิก transaction
  7. ปิดการติดต่อกับฐานข้อมูล

code ด้านล่างเป็น code สั้นๆ ที่แสดงวิธีการทำงานของ transaction โดยใช้ ADO.NET

C#
string connectionString = ...; //Some connection string
SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.Open();

SqlTransaction sqlTransaction = sqlConnection.BeginTransaction();

SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Transaction = sqlTransaction;

try
{
sqlCommand.CommandText = "Insert into Employee (EmpCode, EmpName) VALUES (1, 'Joydip')";
sqlCommand.ExecuteNonQuery();
sqlCommand.CommandText = "Insert into Dept (DeptCode, DeptName, EmpCode) VALUES (9, 'Software', 1)";
sqlCommand.ExecuteNonQuery();
sqlTransaction.Commit();
//Usual code
}

catch(Exception e)
{
sqlTransaction.Rollback();
//Usual code
}

finally
{
sqlConnection.Close();
}
VB.NET
Dim connectionString As String = "..."  'Some connection string
Dim _sqlConnection As New SqlConnection(connectionString)
_sqlConnection.Open()

Dim _sqlTransaction As SqlTransaction = _sqlConnection.BeginTransaction
Dim _sqlCommand As New SqlCommand
_sqlCommand.Transaction = _sqlTransaction

Try
_sqlCommand.CommandText = "Insert into Employee (EmpCode, EmpName) VALUES (1, 'Joydip')"
_sqlCommand.ExecuteNonQuery()
_sqlCommand.CommandText = "Insert into Dept (DeptCode, DeptName, EmpCode) VALUES (9, 'Software', 1)"
_sqlCommand.ExecuteNonQuery()
_sqlTransaction.Commit()
Catch ex As Exception
_sqlTransaction.Rollback()
Finally
_sqlConnection.Close()
End Try
ส่วน code ต่อไปเป็น code ที่ใช้ "using" เพื่อกำหนดขอบเขตหรือ scope ของ object

C#
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction = null;

try
{
sqlConnection.Open();
transaction = sqlConnection.BeginTransaction();

command.Transaction = transaction;

command.CommandText = "Insert into employee (empID, empName) values (1, 'Joydip');
command.ExecuteNonQuery();

command.CommandText = "Insert into dept (deptID,deptName,empID) values (9,'Software',1)";
command.ExecuteNonQuery();

transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
throw ex;
}
finally
{
sqlConnection.Close();
}
}

VB.NET
Using _sqlconnection As New SqlConnection(connectionString)
Dim command As SqlCommand = _sqlconnection.CreateCommand
Dim _sqlTransaction As SqlTransaction = Nothing

Try
_sqlconnection.Open()
_sqlTransaction = _sqlconnection.BeginTransaction

command.Transaction = _sqlTransaction

command.CommandText = "Insert into Employee (EmpCode, EmpName) VALUES (1, 'Joydip')"
command.ExecuteNonQuery()

command.CommandText = "Insert into Dept (DeptCode, DeptName, EmpCode) VALUES (9, 'Software', 1)"
command.ExecuteNonQuery()

_sqlTransaction.Commit()
Catch ex As Exception
_sqlTransaction.Rollback()
Throw ex
Finally
_sqlconnection.Close()
End Try
End Using
ADO.NET 2.0 มีคุณสมบัติเพิ่มเข้ามาใหม่มากมาย โดยมีความยืดหยุ่นและง่ายในการใช้งานมากขึ้น สำหรับ transaction มี namespace ใหม่เรียกว่า System.Transaction โดยเป็นการปรับปรุงการทำ Transaction แบบกระจาย (Distributed Transaction)

System.Transaction ประกอบด้วย TransactionScope class ที่สามารถกำหนด object ไว้ภายใน scope เพื่อสนับสนุนการทำ transaction เมื่อ transaction ทำงานเสร็จจะทำการ mark ให้เป็น complete ได้โดยการเรียกใช้ method ชื่อ TransactionScope.Complete

Transaction จะทำำการ rollback เมื่อ instance ของ transaction ถูกทิ้งโดยการเรียก Dispose method

code ด้านล่างเป็นเพียง code ตัวอย่างส่วนหนึ่งสำหรับการใช้ System.Transaction
C#
using (System.Transactions.TransactionScope transactionScope = new System.Transactions.TransactionScope())
{
SqlConnection sqlConnection = newSqlConnection(connectionString);
string sqlString = "Update emp set empName = 'Joydip Kanjilal' where empID = 9";
SqlCommand cmd = newSqlCommand(sqlString , sqlConnection);
sqlConnection.Open();
cmd.ExecuteNonQuery();
sqlConnection.Close();
}
VB.NET
Using _transactionScope As New System.Transactions.TransactionScope
Dim _sqlConnection As New SqlConnection(connectionstring)
Dim _sqlString As String = "Update emp set empName = 'Joydip Kanjilal' where empID = 9"
Dim cmd As SqlCommand = New SqlCommand(_sqlString, _sqlConnection)
_sqlConnection.Open()
cmd.ExecuteNonQuery()
_sqlConnection.Close()

End Using
TransactionScope ยังสนับสนุนการทำ distributed transaction อีกด้วย สามารถใช้งาน transaction สำหรับการติดต่อหลายฐานข้อมูล ตัวอย่าง code ด้านล่างใช้ TransactionScope class เพื่อทำ transaction กับหลายฐานข้อมูล

C#
using (TransactionScope transactionScope = new TransactionScope())
{
using (SqlConnection codesDatabaseConnection = new SqlConnection(codesDatabaseConnectionString))
{
SqlCommand sqlCommandCodes = codesDatabaseConnection.CreateCommand();
sqlCommandCodes.CommandText = "Insert Into codes (codeID,codeText) values (1,'Test')";
codesDatabaseConnection.Open();
sqlCommandCodes.ExecuteNonQuery();
codesDatabaseConnection.Close();
}

using (SqlConnection statesDatabaseConnection = new SqlConnection(statesDatabaseConnectionString))
{
SqlCommand sqlCommandStates = statesDatabaseConnection.CreateCommand();
sqlCommandStates.CommandText = "Insert into States(stateID,stateName) values (1, 'Test')";
statesDatabaseConnection.Open();
sqlCommandStates.ExecuteNonQuery();
statesDatabaseConnection.Close();
}

transactionScope.Complete();
}
VB.NET
Using _transactionScope As New System.Transactions.TransactionScope
Using _codesDatabaseConnection As New SqlConnection(codesDatabaseconnectionString)
Dim _sqlCommandCodes As SqlCommand = _codesDatabaseConnection.CreateCommand
_sqlCommandCodes.CommandText = "Insert Into codes (codeID,codeText) values (1,'Test')"
_codesDatabaseConnection.Open()
_sqlCommandCodes.ExecuteNonQuery()
_codesDatabaseConnection.Close()
End Using

Using _statesDatabaseConnection As New SqlConnection(statesDatabaseConnectionString)
Dim _sqlCommandStates As SqlCommand = _statesDatabaseConnection.CreateCommand
_sqlCommandStates.CommandText = "Insert into States(stateID,stateName) values (1, 'Test')"
_statesDatabaseConnection.Open()
_sqlCommandStates.ExecuteNonQuery()
_statesDatabaseConnection.Close()
End Using
_transactionScope.Complete()
End Using
จุดที่ต้องสังเกต
sqlTransatcion object ต้องคืนค่าี่มาจาก BeginTransaction method และนำไปกำหนดที่ Transaction property ของ Command object ถ้าไม่ได้ทำตามนี้ InvalidOperationException จะถูก throw ออกมา
Connection instance ต้องเรียก Open method ก่อนที่จะเริ่ม transaction ใหม่ ถ้าไม่ได้ทำตามนี้ InvalidOperationException จะถูก throw ออกมา
ดังนั้น เพื่อที่จะปรับปรุงการทำงานของแอพพฃิเคชั่นให้ดีึ้ขึ้น ควรเก็บ transaction ให้สั้นที่สุดเท่าที่จะทำได้ ซึ่งจะช่วยลดการ lock และสามารถทำงานได้อย่างต่อเนื่องมากขึ้น นอกจากนั้นคุณควรวิเคราะห์ว่า batch statement ของคุณต้องการ transaction คือไม่ โดยพยายามอย่าใช้ transaction ที่ไม่จำเป็นเนื่องจากจะกระทบประสิทธิภาพตามที่ได้กล่าวไว้ข้างต้น

Wednesday, May 23, 2007

Deployment ASP.NET 2.0 Web Application

การ deploy ASP.NET 2.0 Web Application โดยใช้ Visual Studio 2005 นั้นสามารถทำได้ 3 แบบ
1. แบบ Copy Web Site
2. แบบ Publish Web Site
3. แบบทำ Package Installer

วิธี Copy File เป็นวิธีที่ง่ายที่สุด เพียงทำการ copy Web Application ทั้งหมดไปยัง Web server ที่ต้องการ ซึ่งใน Visual Studio 2005 ก็มี Tools ที่ใช้ support การ copy web site ตามรูป

คลิกขวาที่ Project เลือก Copy Web Site

เลือก Connection ถ้ายังไม่มีให้กด Connect เพื่อเลือก ปลายทางที่จะ copy ไป

ทางด้านซ้ายคือ source ของเรา ส่วนทางด้านขวาคือ target ปลายทางที่เราจะ copy ไปวาง Tools ตัวนี้สามารถทำการ synchronize เพื่อตรวจสอบตามแตกต่างของไฟล์ได้ด้วยครับ

สำหรับการ Publish Web Site นั้นเป็นการ compile Web Application แล้วค่อยนำไปวางบน Web Server หรือ Compile ไปที่ Web Server เ้ลยก็ได้(แต่ไม่เหมาะ) ตามรูป

ไปยังเมนู Build --> Publish Web Site


ระบุ Target Location โดยอาจกดปุ่ม ... เพื่อกำหนดปลายทาง

กรณีนี้แนะนำให้เก็บลงเครื่องตนเองก่อนแล้วค่อย copy ทั้งหมดไปวางไว้ที่ Web Server

ถ้าเลือก Allow this precompiled site to be updatable หมายถึง คุณสามารถแก้ไข Page layout ได้( aspx file) หลังจากที่ Publish แล้ว ถ้าไม่เลือกไว้ aspx file จะเก็บเพียง markup text เพราะ layout ก็จะถูก compile ไปด้วย
>>การเลือก Allow this precompiled site to be updatable จะทำการ compile ไฟล์ code-behind classes ทั้งหมด เป็น assembly ส่วน .aspx, .asmx, .ashx จะไม่ compile แต่ถ้าไม่เลือก .aspx, .asmx, .ashx ก็จะ compile เป็น assembly ด้วย (แต่ถ้าเขียน code แบบ in-line ใน single file ยังไงก็ไม่ compile ครับ) ส่วน static file พวก .htm, .html, text file, graphic file ก็ไม่ compile เช่นกัน

ส่วนการ Deploy แบบ Package Installer เป็นการทำ Package สำหรับติดตั้งที่ Web Server ยังขอไม่กล่าวถึงครับ

Tuesday, May 22, 2007

รู้จักกับ Silverlight

ได้อ่านบทความเรื่อง รู้จักกับ Silverlight ใน blognone แล้วรู้สึกดีครับ เป็นภาษาไทยอ่านเข้าใจง่ายดีครับ อยากให้ศึกษาไว้ครับ เพราะจะมีบทบาทมากขึ้นในอนาคตครับ

เนื้อหาตามลิงค์ นี้เลยครับ รู้จักกับ Silverlight

Monday, May 21, 2007

แนะนำหนังสือชุดสำหรับสอบเป็น MCPD:Web Developer


หนังสือชุด Microsoft® .NET Framework Web Developer Core Requirements
ประกอบไปด้วยหนังสือ 3 เล่ม เหมาะกับผู้ที่ต้องการสอบเป็น
Microsoft Certified Professional Developer : Web Developer
ภายในหนังสือจะประกอบไปด้วย แบบฝึกหัด ตัวอย่างข้อสอบ เป็นต้น

สามารถดูรายละเอียด และ สั่งซื้อได้ที่ IT Book house ครับ
หรือหากต้องการซื้อที่ Amazon ก็ตามสะดวกครับ (ไม่มี link ให้นะ อิอิ)

Free e-learnning from Microsoft

ของ Free ครับ

1.ให้เข้าไปที่ http://www.microsoft.com/learning/access/

2.พิมพ์ access code : 70-87-MSVS2005-3804

3.ทำการ Sign In ด้วย Microsoft Live ID

4.คลิกที่ My Learning

ดูรายละเอียดได้ ที่นี่

ความจริงมีนานแล้ว แต่อยากบอกอีก เผื่อยังมีคนไม่ทราบ

ผมลงทะเบียนไปนานแล้ว จะหมดอายุในวันที 25/5/2007 นี้แล้ว....อะจ๊าก ยังดูไม่ครบ 100% เลย

Wednesday, May 2, 2007

MSDN Seminar: Better Web Experience

งานสัมมนา MSDN
เรื่อง Better Web Experience
ในวันที่ 22 พค. 2550
สนใจดูรายบะเอียดเพิ่มเติมครับ

Agenda
Register
Map

งานนี้จัดที่ Sofitel Central Plaza Bangkok