วันเสาร์ที่ 15 พฤศจิกายน พ.ศ. 2551

HttpModules กับ IIS 7 ทำไมไม่โหลด Mudule ละค้าบ

ปัญหาใหม่มาละคร้าบ หลังจากที่ เปลี่ยนมาใช้ Windows Vista กะเค้าบ้าง ผลก็คือ โปรแกรมเก่า ที่ทำไว้ ดันใช้ไม่ได้ เนื่องจาก Module ไม่ทำงาน ตอนเริ่มโปรแกรม เลยได้ความรู้ใหม่เลย ซึ่งก็คือ หากอยู่ในโหมด classic application pool
การใช้งาน Modules ก็จะเหมือนเดิมคือ

            
            


แต่ถ้าเป็นโหมด Default Application Pool
ก็จะกลายเป็น

 
        
        
            
            
            
            
        

(จริงๆ  ตรงนี้มีต่อนะ แต่ขอย่อละกัน...)

 



ซึ่ง เป็นการใช้ Module ของ IIS 7 ครับ
แถมท้ายด้วยว่า โปรเจ็คที่สร้างจาก Visual Studio 8 กับ Version Express นั้น ตัว dll System.Web.Extension คนละเวอร์ชั่นกันครับ ตัว Express ได้ dll ใหม่กว่าด้วยซ้ำ ผลคือ ต้องสร้างโปรเจ็คใหม่ แล้วเอาโค๊ดของเก่ามาลงอีกรอบ

การป้องกันปัญหาสำหรับ Mudule เพราะไม่รู้ว่าเซิฟที่จะเอาไปลง IIS Version ไหน ก็ใส่ไปทั้งคู่ก็ได้ครับ ไม่เป็นไร ผมลองละ - -'

วันพฤหัสบดีที่ 6 พฤศจิกายน พ.ศ. 2551

EventHandler By UserControl For Out side

เหมือนเวลาที่เราต้องการ คลิกที่ปุ่ม ใน UserControl แต่ต้องการให้ Event ที่ได้จากการคลิกที่ปุ่ม เกิดข้างนอก UserControl (ยกตัวอย่างบนฟอร์ม ที่เราเอา UserControl ไปวาง) เขียนได้ดังนี้นะคร้าบ

ใน User Control จะให้เกิด Event เมื่อคลิกที่ ปุ่ม LinkButton

public event EventHandler CustomMyEvent;

protected void LinkButton_Click(object sender, EventArgs e)
{
//Can Inser Other Code here.

CustomMyEvent(this, e);

//Can Inser Other Code here.
}

ในหน้าเพจที่ Code Behind สมมุติว่าใช้ชื่อ UserControl ว่า MyUserControl เมื่อคลิกที่
LinkButton แล้ว ให้ทำงานที่ MyCustomUserEvent

protected void Page_Load(object sender, EventArgs e)
{
MyUserControl.CustomMyEvent += new EventHandler(MyCustomUserEvent);
}

void MyCustomUserEvent(object sender, EventArgs e)
{
//Any thing can happend here.
}

เวลาไม่มาก เลยเขียนอธิบายสั้นๆ ได้ใจความแค่นี้ อยากรู้เป็นไง ต้องลองทำดูครับ มีปัญหาสงสัยถามได้นะครับ

วันเสาร์ที่ 27 กันยายน พ.ศ. 2551

Background Transparent ( filter or opacity ) พื้นหลังกับความกระจ่างใส

มาทำ พื้นหลังให้โปร่งใสกัน ครับ แยกกันนะครับ สำหรับ IE และ Fire fox (อีกแล้วครับ)

IE ใช้
.MessageBackground { filter:alpha(opacity=70); }

Fire Fox ใช้
.MessageBackground { opacity:0.7; }

ยกตัวอย่างมาง่าย ๆ ลองใช้กันดูนะครับ สำหรับ ajax Popup windows

Double margin Bug in IE6 when float

มาละคับ พี่น้องคับ ไม่อยากจะแก้อะไรมากกับ IE6 แต่ว่า โปรแกรมบริษัท จำเป็นต้องซัพพอร์ท ด้วยผู้ใช้หลายคน ยังคงใช้ เวอร์ชั่นคลาสสิคนี้อยู่ เข้าเรื่องเลยละกันครับ เรื่องมีอยู่ว่า เวลา Float พวก ออบเจ๊ค ทั้งหลาย แล้วใส่ margin เข้าไปเนี่ย Browser อื่น ก็ปกติ แต่ ie6 จะแถม margin ให้เป็นสองเท่า แต่ก็มีทางแก้ ก็คือ การใช้ display : inline เข้าช่วย โดยต่อเข้าไปจาก Float ละคับ margin ก็จะกว้างเป็นปกติ
อ่านะ แต่ปัญหาไม่ได้หยุดแค่นั้น เมื่อเราจำเป็นต้องซัพพอร์ท FireFox ซึ่ง บางครั้ง การ Float tag anchor จำเป็นต้อง display:block ด้วย แต่ firefox เจ้ากรรมเราไม่ซัพพอร์ท display: inline - block นะสิครับ ซึ่งคำสั่งนี้สงวนโดย IE
คงต้องแยกกันใช้ โดย firefox ให้ใช้ display: -moz-inline-box; แทน ส่วน ie ก็ใช้ display:inline-block; ไปตามปกติ นะครับ

วันศุกร์ที่ 26 กันยายน พ.ศ. 2551

max width and max height Css All Browser

สำหรับการใช้งาน Max Width and Max Height นั้น ใน IE 7 และ Firefox แสดงผลได้ดี ไม่มีปัญหา แต่ว่า IE 6 ไม่ซับพอร์ทอ่ะจิ ทำอย่างไร มาดูกันครับ
(มันไม่ซับพอร์ทเพราะว่า Max Width กับ Max Height มันเป็น Css Version 2 ครับ)

.MaxHeight
{
max-height: 150px;
_height: expression( this.scrollHeight > 150 ? "150px" : "auto" );
}

.MaxWidth
{
max-width: 100px;
_width:expression(document.body.clientWidth > 100? “100px”: “auto” );
}

หรือ

.MaxWidth2
{
max-width: 100px;
_width:expression(this.width > 100? “100px”: “auto” );
}

สำหรับเครื่องหมาย หน้า css มีความหมายดังนี้นะครับ มีไว้สำหรับเบราเซอร์บางตัวเท่านั้น มันเป็นการ hack css ไม่อยากแนะนำครับ เป็นไปได้ เขียน Detect Browser แล้ว ใช้ตัวที่เหมาะกับ Browser นั้น ๆ จะดีกว่าครับ
# สำหรับ IE
_ สำหรับ IE6 และเวอร์ชั่นต่ำกว่า

วันจันทร์ที่ 12 พฤษภาคม พ.ศ. 2551

ข้อมูลประเภทวันที่กับฐานข้อมูล (DateTime DataType width Database)

สืบเนื่องมาจากวันนี้นั่งเขียนเกี่ยวกับใส่ข้อมูลลง Database แรก ๆ ก็ไม่มีปัญหาอะไร พอใช้ MS Access นี่สิ อยู่ ๆ ก็ฟ้องมาว่า "Data type mismatch" มันอารายกันวุ้ย ก็ไปปรึกษากะนายกูเกิ้ล อีกตามเคย ได้ความว่า
ตัว Provider ที่ใช้กับเจ้า Access เนี่ย มันมีปัญหากับพวกข้อมูลประเภทวันที่ ที่มี milliseconds น่ะสิ
แล้วจะแก้ไงอ่ะหรอ ง่ายมาก ก็ทำให้มันเป็นข้อมูล DateTime แบบไม่มี milliseconds อ่ะจิ
ตามนี้เลยคร้าบ

DateTime value = DateTime.Now;
value = new DateTime( value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second )

แค่นี้ ก็ไม่มี milliseconds ละ เวลาใช้กับฐานข้อมูล Access ก็ม่ายมี "Data type mismatch" ละ
แต่ถ้าจะเอารายละเอียดเรื่องเวลา ( มี milliseconds ด้วย ) ก็ใช้ Database อื่นละกันคร้าบ

วันศุกร์ที่ 9 พฤษภาคม พ.ศ. 2551

เมื่อจะมีเงื่อนไขค่าว่าง Null ในฐานข้อมูล (Database have null value)

จะเอาเงื่อนไขอันใดไปเก็ทมันมาละเนี่ย เผอิญ ลอง มั่ว ๆ ดู

SELECT * FROM UserDetails WHERE Email = NULL;
SELECT * FROM UserDetails WHERE Email = "";
SELECT * FROM UserDetails WHERE Email = '';

ก็ไม่ได้ แต่แล้วอยู่ ๆ ก็ระลึกชาติได้ ถ้ามัน null ก็ใช้อันนี้จิ
SELECT * FROM UserDetails WHERE Email IS NULL;

แล้วถ้าไม่ null ก็ใช้ อันนี้
SELECT * FROM UserDetails WHERE Email IS NOT NULL;

อิๆ ผ่านไป ๆ

เมื่อต้องเข้าถึงตารางชื่อสงวนในฐานข้อมูล กับพารามิเตอร์ ( Table and Parameter )

ขอรวบยอดเรื่องชื่อตาราง กับ การใส่พารามิเตอร์ไว้ด้วยกันเลยนะ

แบบว่า ดันไปตั้งผิด ตั้งพลาด ไม่ก็ไปเอาของชาวบ้านเค้ามา ชื่อตารางดันเป็นชื่อ ที่ฐานข้อมูล ไม่แนะนำ้ให้ใช้ซะนี่ (พวกชื่อสงวน) ยกตัวอย่างง่ายๆ เลยก็คือ ตารางชื่อ User เอาไปตั้งใน MySql ยังพอไหว
แต่ไปตั้งใน Access หรือ MsSql นี่จะเรียกใช้ รับรองว่าใบ้กิน ทางแก้ ก็ง่ายๆ เปลี่ยนชื่อตาราง ไม่ก็ เปลี่ยนคำสั่ง Query มันซะใหม่ ก็แค่นั้นเองครับ ดูตัวอย่างนะ

Access และ MsSql
SELECT * FROM [User] WHERE Email = @Email;
MySql
SELECT * FROM User WHERE Email = ?userName

อ๊ะ นั่นแน่ เห็นอะไรมั้ย ที่ User ของ Access กับMsSql ต้อง มี เครื่องหมาย [ ] คร่อม
ก็เพราะว่า User เป็นคำสงวน ของ Access และ MsSql ครับ ทีนี้ก็เข้าถึงได้สบาย ๆ
แต่ว่าเขียนไป ๆ ไปติดตรง พารามิเตอร์นี่อีก ( ทำไมต้องใช้พารามิเตอร์หรอ กันพวก Sql Injection ไง )

แบบว่า ทาง Microsoft เนี่ย ใช้ @ แต่ว่า ทาง MySql ใช้ ? เวลา เพิ่มพารามิเตอร์ ก็ต้องแยกกันใช้
อยากใช้ร่วมกันได้ ( ทำโปรแกรมแบบ มัลติดาตาเบส MultiDataBase ) ก็ต้องมีทริกส์พิเศษละครับ

วันอังคารที่ 6 พฤษภาคม พ.ศ. 2551

ตรวจสอบชื่อ Email แบบหลายที่อยู่ ( Multiple Email Validation)

เกี่ยวกับการ ตรวจสอบชื่อ Email หลาย ๆ ตัว ที่ปกติ จะคั่นด้วย "," หรือ ";" ซึ่งจะมี ช่องว่าง (space) หรือไม่ก็ได้ พอดีมีน้องคนนึงเค้าถามมา เลย ๆ ไปค้น ๆ มา ช่วงแรกหมดหวัง เพราะ อ่านเจอบางที่ บอก มัน ประมาณว่า Impossible เลยอ่ะ แต่หา ๆ ไป (Google หาอะไร ก็เจอ (มั้ง)) ก็พบว่า อัจฉริยะ ที่ยังเล่นอินเตอร์เน็ต และ เขียนโปรแกรมยัง มีอยู่ โดย ได้เผยแพร่โค๊ดออกมาดังนี้

(\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*\;*\,*\ *)*

เจ๋ง มากครับ เพ่ เยี่ยมยอดจิงๆ ครับ ไม่รู้คิดได้ไง อ้างอิงจากที่นี่นะครับ

วันจันทร์ที่ 5 พฤษภาคม พ.ศ. 2551

Web.config Connection String Access and SQL2005 With AppSettings

<appSettings>
<add key="DatabaseUse" value="DatabaseAccess"/>
<add key="SecretKey" value="xxx"/>
</appSettings>

<connectionStrings>
<add name="DatabaseAccess" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Database.mdb;Jet OLEDB:Database Password='';" providerName ="System.Data.OleDb"/>
<add name="DatabaseSQL2005" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=DatabaseSql;User ID=sa;pwd=dbms;" providerName ="System.Data.SqlClient"/>
</connectionStrings>

เวลาเรียกใ้ช้

string connStr = ConfigurationManager.ConnectionStrings["DatabaseAccess"].ConnectionString;
string connSQL = ConfigurationManager.ConnectionStrings["DatabaseSQL2005"].ConnectionString;

หรือเรียกจาก AppSettings
ConfigurationSettings.AppSettings["DatabaseUse"]

วันศุกร์ที่ 2 พฤษภาคม พ.ศ. 2551

sql server เปรียบเทียบระหว่าง NULLIF และ ISNULL

Explanation of NULLIF
Syntax:
NULLIF ( expression , expression )

Returns a null value if the two specified expressions are equal. NULLIF returns the first expression if the two expressions are not equal. If the expressions are equal, NULLIF returns a null value of the type of the first expression. NULLIF is equivalent to a searched CASE function in which the two expressions are equal and the resulting expression is NULL.

Following is good example of NULLIF and CASE from BOL:

USE AdventureWorks;
GO
SELECT ProductID, MakeFlag, FinishedGoodsFlag,
NULLIF(MakeFlag,FinishedGoodsFlag)AS ‘Null if Equal’
FROM Production.Product
WHERE ProductID < 10;
GO
SELECT ProductID, MakeFlag, FinishedGoodsFlag,‘Null if Equal’ =
CASE
WHEN MakeFlag = FinishedGoodsFlag THEN NULL
ELSE MakeFlag
END
FROM
Production.Product
WHERE ProductID < 10;
GO

Explanation of ISNULL
Syntax:

ISNULL ( check_expression , replacement_value )

Replaces NULL with the specified replacement value. The value of check_expression is returned if it is not NULL; otherwise, replacement_value is returned after it is implicitly converted to the type of check_expression, if the types are different.

Following is good example of ISNULL from BOL:

USE AdventureWorks;
GO
SELECT AVG(ISNULL(Weight, 50))
FROM Production.Product;
GO

Observation:
Interesting observation is NULLIF returns null if it comparison is successful, where as ISNULL returns not null if its comparison is successful. In one way they are opposite to each other.

Puzzle:
How to create infinite loop using NULLIF and ISNULL? If this is even possible?

Reference : Pinal Dave (http://www.SQLAuthority.com), BOL