Posts tagged: Asp.Net

วิธีการแบ่ง Page ASP.Net ด้วย SQL Server 2005

หลายครั้งที่ต้อง Mantenance เว็บใหญ่ๆ ที่ทำด้วย Asp.net และ Sql server ซึ่งมักจะเจอปัญหา Page load ช้า เนื่องจาก Query ข้อมูลจำนวนมากจาก ฐานข้อมูล เพื่อมาเก็บไว้ใน DataTable แล้วเราก้อค่อย แบ่ง page จากข้อมูลใน DataTable อีกที

ลองนึกภาพดูนะครับ ถ้าเรามีข้อมูลในเว็บบอร์ดที่มีคนออนไลน์พร้อมกัน หลายๆ พันคน และมีจำจวนข้อมูลที่ต้อง Query จากฐานข้อมูล เป็น แสน Records  เราอาจจะไม่เอามาทั้งหมด โดยอาจจะให้แสดงย้อนหลังได้เพียบ 10 หน้า โดยแสดงหน้าละ 150 รายการ รวมกันทั้งหดม ก้อ 1500 Records ที่เราต้อง Query จาก Database ของเรา แล้วต้องมาเสียเวลา แบ่งหน้าด้วย Pagging หรือ โดยใช้ Feature ของ DataGrid ซึ่งทำให้ช้าเป็นอย่างมาก โดยเฉพาะตัว DataGrid เองก้อทำงานช้ามากอยู่แล้ว

แล้วก้อจะเจอคำถามอยู่บ่อยๆ ว่า ทำไม Sql Server ถึงไม่มี Limit เหมือนกับ MySQL จะได้ช่วยให้แบ่าง Page ได้ง่ายๆ
วันนี้ผมเอาวิธีการ ที่เหมือนกับ Select Limit มาฝากกันครับ

อันดับแรก เราต้องกำหนด ID ให้กับ ข้อมูลใน ฐานข้อมูลก่อน โดยใช้ ROW_NUMBER()

SELECT ...
FROM
   (SELECT ...
         ROW_NUMBER() OVER(ORDER BY ColumnName) AS RowNum
    FROM Employees e
   ) AS DerivedTableName
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

หลังจากนั้น เราก้อกำหนดค่าให้กับ @startRowIndex และก้อ @maximumRows คับ ว่าจะให้เริ่มต้นจาก Record ไหน และก้อจำนวนเท่าไหร่

เช่น

SELECT RowNum, EmployeeID, LastName, FirstName
FROM
   (SELECT EmployeeID, LastName, FirstName
       ROW_NUMBER() OVER(ORDER BY EmployeeID) AS RowNum
    FROM Employees e
   ) AS EmployeeInfo

แค่นี้ก้อจะสามารถแบ่ง Query เป็น ช่วงๆ ได้เหมือน Limit ใน MySQL ได้แล้วครับ
หรืออาจจะเอามาประยุกต์ใช้ เป็นแบบนี้ก้อได้นะครับ

DECLARE @startRowIndex INT
DECLARE @maximumRows INT
DECLARE @page INT
 
SET @maximumRows = 200
SET @page = 3
 
SET @startRowIndex = (@page * @maximumRows) - @maximumRows;
IF @page > 1
BEGIN
SET @startRowIndex = (@startRowIndex + 1)
SET @maximumRows = (@maximumRows -1)
END
 
SELECT *
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY USERNAME) AS ROWNUM,
USERNAME, FNAME, LNAME, EMAIL
FROM MEMBER
) AS DerivedTableName
WHERE ROWNUM BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows)

ได้ผลเป็นยังไงแวะกลับมาเล่าสู่กันฟังบ้างนะครับ :-)

วิธีการ add JavaScript ให้กับ Button ใน Asp.net

How to add JavaScript into Asp.net Button control to confirm user before doing the process

Html control :
<INPUT TYPE=“button” VALUE=“Button1″ ONCLICK=“if(confirm(’Do you want delete?’)){ return true; }else{ return false; }”>

.Net control :
Button1.attribute.Add(“onclick”,”if(confirm(’Do you want delete this item(s)?’)){ return true; }else{ return false; }”);

Have fun :)

How to Export DataTable to Spreadsheet using C#

วิธีการ Export ข้อมูลจาก DataTable ไปยัง Excel Spreadsheet ด้วย C#

public static void ExportToSpreadsheet(DataTable table, string name)
{

HttpContext context = HttpContext.Current;
context.Response.Clear();
foreach (DataColumn column in table.Columns)
{

context.Response.Write(column.ColumnName + “;”);

}
context.Response.Write(Environment.NewLine);
foreach (DataRow row in table.Rows)
{

for (int i = 0; i < table.Columns.Count; i++)
{

context.Response.Write(row[i].ToString().Replace(“;”, string.Empty) + “;”);

}
context.Response.Write(Environment.NewLine);

}

context.Response.ContentType = “text/csv”;
context.Response.AppendHeader(“Content-Disposition”, “attachment; filename=” + name + “.csv”);
context.Response.End();

}

// Using
ExportToSpreadsheet(table, “products”);

[ad#menu-link]