การรับค่า Integer จาก MsSql ด้วย C# .. "Size Does Matter"
บันทึกความจำครับ นานๆ ไปเผื่อกลับมาใช้แล้วเดี๋ยวลืม เปิด blog ดูจะได้นึกออก อิอิ ..
Microsoft SQL Server จะมีการเก็บค่าตัวเลข (Interger) หลายแบบด้วยกัน ดังนี้..
Bit | เก็บแค่ 0 กับ 1 (เก็บ Bit เดียว) |
TinyInt | 0-255 (8 Bit) |
SmallInt | -32,768 ถึง 32,767 (16 บิต รวมติดลบ) |
Int | -2,147,483,648 ถึง 2,147,483,647 (32 บิต รวมติดลบ) |
BigInt | -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807 (64 บิต รวมติดลบ .. เยอะจัง) |
ทีนี้การรับค่าจาก MSSql ด้วย C# เนี่ย ถ้าเรารับมาผิดขนาด มันก็จะ Error (จุกจิกจริงแฮะ) เช่น ถ้าผมกำหนด Data Type ของ Database Field นี้เป็น Integer เฉยๆ ซึ่งก็จะเป็น 32 บิต เราก็จะทำดังนี้
ก่อนอื่น .. เราประกาศค่า SqlDataReader ก่อน SqlCommand cmd = Conn.CreateCommand(); cmd.CommandText=sql; SqlDataReader Reader; Reader = cmd.ExecuteReader();
แล้วก็ ..
int x = Reader.GetInt32(0);
ทีนี้ถ้า "ขนาด" ของมันถูกต้อง มันก็จะได้ค่าที่ถูกต้อง แต่ถ้าขนาดของมันไม่ใช่ 32 บิต แต่ดันเป็น 16 หรือ 64 มันก็จะ Error ว่ารับค่ามาขนาดไม่ถูกต้อง
เอาล่ะสิ ตัว DataReader มันไม่มีตัวรับ Integer แบบลอยๆ ซะด้วย (คือไม่เป็น Variant มาให้) ดังนั้น เราก็ต้องหาวิธีจัดการกับมัน
วิธีจัดการกับมันเราก็ต้องตรวจสอบชนิดของมันเสียก่อน แล้วค่อยเลือกให้มันรับค่า .. 5555 ง่ายมาก
if(Reader[0].GetType() == Type.GetType("System.Int64")) { dataIndex.Add(int.Parse(Reader.GetInt64(0).ToString())); } else if(Reader[0].GetType() == Type.GetType("System.Int32")) { dataIndex.Add(int.Parse(Reader.GetInt32(0).ToString())); }
ก็แค่นี้ล่ะครับ เท่านี้ก็รับค่า Integer ได้อย่างไม่ผิดพลาดแล้ว ..
แต่เดี๋ยวก่อน!!!
ยังมีอีกวิธี โดยที่เราไม่ต้องไปสนใจกับ "ขนาด" ของมันเลย แต่เราก็สลับสับหลีกเอาแทน โดยการ .. 1. ทำให้มันเป็น String (ตัวอักษร) เสียก่อน 2. แล้วก็เอาตัวอักษรมา Cast กลับเป็น Integer ว๊ะฮ่าฮ่า .. ตลบหลังมันซะเลย ..
int id = int.Parse(Reader["my_id"].ToString());
เท่านี้ก็เรียบร้อย .. เราก็ไม่ต้องสนใจกับขนาดของ Integer ของ Database ว่ามันอยู่ที่ขนาดเท่าไหร่แล้วครับ ..
แต่ .. นิดนึง เดี๋ยวจะลืม.. ใน C# นั้นขนาดของตัวแปรก็มีผลเหมือนกัน .. int จะเก็บค่าที่ 32 บิต long จะเก็บค่าที่ 64 บิต
ดังนั้น ถ้าเราจะเก็บค่า BigInt ของ MsSql ไว้ใน int ที่ค่ามันมากๆ บางทีก็จะไม่ได้ ก็ต้องดูตรงนี้ด้วยนิดนึง
หมายเหตุ: SqlDataReader สามารถดึงค่ามาได้หลายวิธี ..
1. Reader.GetInt32(0) หรือ Reader.GetString(3) จะเป็นการใส่หมายเลขของ Fields ที่เรา Query ขึ้นมา แบบนี้ผมไม่ค่อยชอบ เดี๋ยวงง หรือเปลี่ยน query นิดหน่อย นี่ error ได้เลย
2. เป็นการอ้างชื่อ field
2.1 อ้างโดยใช้ Method ชื่อ GetOrdinal มาช่วย คือใส่ชื่อ field ลงไปตรงนี้มันจะ return หมายเลข field จาก query มาให้ เราก็เอาไปใช้อีกรอบ
Reader.GetString(R.GetOrdinal("user_name"));
2.2 อ้างโดยไม่ต้องใช้ GetOrdinal อันนี้ง่ายเลย แต่ต้องมา Parse เอาเองอีกที
username = Reader["user_name"];
หรือ
id = int.Parse(Reader["user_id"].ToString());
โอวเย ....
Create Date : 24 มีนาคม 2549 |
|
24 comments |
Last Update : 24 มีนาคม 2549 10:30:38 น. |
Counter : 5040 Pageviews. |
|
|
|