วันจันทร์ที่ 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