วันอังคารที่ 21 ธันวาคม พ.ศ. 2553

aspx to html

คือการรับค่า page ที่เป็น ASPX เพื่อแปลงเป็น HTML page ธรรมดา เอาไปใช้ประโยชย์ในเรื่องดูข้อผิดพลาดของหน้วเว็บที่เราทำขึ้นมาว่าตอนแปลงไปเป็น file ที่ browser แล้วมีตรงไหนผิดพลาดอยู่บ้างและส่วนตัวผมทำขึ้นเพื่อแปลง file aspx ไปเป็น HTML ธรรมดาในการดึงข้อมูลจาก database มาแสดงซึ่งเป็น database ที่ไม่มีการเปลี่ยนแปลงแล้ว

public static string GenHTMLfile(string strURL,string fileName)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
request.Headers.Add("Cookie", "TheEncryptedValueRetrieved");
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string strResult = sr.ReadToEnd();
StreamWriter sw = new StreamWriter(HttpContext.Current.Server.MapPath("~/tmp/" + fileName));
sw.WriteLine(strResult);
// Close StreamWriter and StreamReader
sr.Close();
sw.Close();
}

//Response.Redirect("test.html");
}

catch(Exception)
{
throw;
//Response.Write(ex.Message);
}
return fileName;
}

Page Output Caching

โจทย์ส่วนตัวของผมคือ มีการดึงข้อมูลจาก Database ที่ไม่มีการเปลี่ยนแปลงแล้วมาแสดงผลเป็น web archives เมื่อสร้างหน้าเว็บออกมาแล้วมันใช้เวลาในการ load อยู่ระยะนึ่งเพราะมีข้อมูลอยู่พอสมควร
ทางออกที่ 1 ที่คิดได้คือ เปลี่ยน page aspx ไปเป็น HTML ธรรมดาโดยการเขียน Function แปลง aspx ไปเป็น HTML ปัญหาคือถ้ามีการเปลี่ยนแปลงใดๆเกิดขึ้นผมก็ต้องมา generate ใหม่และหน้าหลักของผมแยกออกเป็น 5 ทางเลือก ผมต้องทำหน้า HTML 5 หน้าขึ้นมา (ดูไม่ค่อยดีเท่าไร)
ทางออกที่ 2 (คิดได้ที่หลัง ตอนก่อนอาบน้ำตอนเช้า) ถ้าเราสามารถ cahing result ที่ได้มาจาก database ได้ในหน้า aspx ก็คงจะดี
ถึงที่ทำงานเปิด google serach "asp.net cache database result" ได้หน้า
http://msdn.microsoft.com/en-us/library/ms972379.aspx
http://vsreddy.wordpress.com/2008/07/23/database-caching-in-aspnet/
http://asp.net-tutorials.com/caching/output-cache/
http://support.microsoft.com/kb/323290/th
สรุปคือ เพิ่มคำสั่งในหน้า aspx ส่วนบนสุดเข้าไป
<%@ OutputCache Duration="5" VaryByParam=”None” Location="Server" %>
Duration หน่วยเป็นวินาที server จะไปดูว่าถ้า cache ยังไม่ expire ก็เอาค่าจาก cache มาแต่ถ้า cahe expire แล้วก็ไปดึงค่าใหม่มาใส่ใน cache แล้วเอามาแสดงผล
VaryByParam
= None ไม่มีขึ้นกับ parameter ใดๆเป็นเหมือนกันทั้ง Page
= Same Param ขึ้นอยู่กับ Parameter Value ที่กำหนดลงไป เช่น กำหนด VaryByParam="campus"
ถ้า campus ต่างกันมันก็จะเก็บไว้คนละ cache กัน
ตัวอย่าง campus=5 ก็จะ cache result ไว้ค่านึ่ง ถ้า campus=9 ก็จะเก็บ cahce result ไว้ที่นึ่ง
และค่า VaryByParam ส่งมาได้หลายค่าแยกโดย semicolon

location =
* Any -เก็บ cache result browser, proxy server ,Server
* Client- browser
* Server
* None-ปิดการงาน cache
*...

OutputCache - varybycontrol ขึ้นอยู่กับค่าของ Control ในหน้า aspx
OutputCache - varybycustom สร้างค่าที่มีผลกับ cache ขึ้นมาเอง
OutputCache - varybyheader ...

วันพุธที่ 28 กรกฎาคม พ.ศ. 2553

การสร้าง Function ใน SQL Server 2008

T-SQL Functions มี 3 แบบ
Scalar : data types ที่คืนค่ากลับมาได้เป็น Text, ntext, image แต่ไม่สนับสนุน timestamp
CREATE FUNCTION dbo.getFac
(
@SID nvarchar(3)
)
RETURNS /* datatype */ nvarchar(120)
AS
BEGIN
declare @name nvarchar(120)
select @name = FacName from Faculty where FacID=@SID
RETURN /* value */@name
END

การนำไปใช้งาน
SELECT DeptID, DeptName, FacID, dbo.getFac(FacID) AS FacName
FROM Dept


Inline Table-Valued : คืนค่า table data type เป็นเหมือนการนำเอา Scalar Function มาใช้ในการดึงค่าใน table มาแสดง คล้ายๆการสร้าง view เพื่อแสดง report ที่ต้องการได้
CREATE FUNCTION dbo.TableDeptFacName
(
@FacID nvarchar(3)
)
RETURNS TABLE
AS
RETURN
SELECT DeptID, DeptName, FacID, dbo.getFac(FacID) AS FacName
FROM Dept
WHERE FacID=@FacID

การนำไปใช้งาน
SELECT DeptID, DeptName, FacID, FacName
FROM dbo.TableDeptFacName('002') AS TableDeptFacName_1

002 คือรหัสคณะที่ส่งเข้าไป

Multi-Statement : เป็นการคล้ายการสร้าง temp table ตามที่ต้องการ สามารถ pass parameter เข้าไปได้
CREATE FUNCTION dbo.TableTmpDeptName
(
@FacID nvarchar(3)
)
RETURNS @DeptFacNameTB TABLE ([DeptID] [nvarchar] (4),[DeptName] [nvarchar] (120))
AS
BEGIN
INSERT INTO @DeptFacNameTB
SELECT DeptID,DeptName FROM Dept WHERE FacID=@FacID
DECLARE @cnt INT
SELECT @cnt = COUNT(*) FROM @DeptFacNameTB
IF @cnt = 0
INSERT INTO @DeptFacNameTB (
[DeptID],
[DeptName] )
VALUES ('000','No Department In This Faculty')
RETURN
END

การนำไปใช้งาน
SELECT DeptID, DeptName
FROM dbo.TableTmpDeptName('000') AS TableTmpDeptName_1

ข้อดีการทำงานทั้งหมดใน function อยู่ใน Database Server ถ้าต้องการแก้ไขใดก็สามารถทำได้ที่ Server