Group Blog
 
<<
มีนาคม 2549
 
 1234
567891011
12131415161718
19202122232425
262728293031 
 
24 มีนาคม 2549
 
All Blogs
 

การรับค่า Integer จาก MsSql ด้วย C# .. "Size Does Matter"

บันทึกความจำครับ นานๆ ไปเผื่อกลับมาใช้แล้วเดี๋ยวลืม เปิด blog ดูจะได้นึกออก อิอิ ..

Microsoft SQL Server จะมีการเก็บค่าตัวเลข (Interger) หลายแบบด้วยกัน ดังนี้..







Bitเก็บแค่ 0 กับ 1 (เก็บ Bit เดียว)
TinyInt0-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.

 

Good morning Friday ka..

 

โดย: เสียงซึง 24 มีนาคม 2549 10:43:17 น.  

 

int id = int.Parse(Reader["my_id"].ToString());
เป็นวิธีแบบกองโจรมากเลย เพ่

 

โดย: bana IP: 203.151.4.252 24 มีนาคม 2549 11:12:25 น.  

 

เห็นของพวกนี้แล้วขนลุก แต่สอบได้ B+ เหอๆๆๆ

 

โดย: HTK IP: 203.113.16.241 24 มีนาคม 2549 19:00:26 น.  

 

แต่ที่หนูเรียนมะเห็นยากขนาดนี้เลยอ่ะค่ะ

ยากจัง

 

โดย: HTK IP: 203.113.16.241 24 มีนาคม 2549 19:01:49 น.  

 

ตอนเรียนมันก็ยากแหละ พอทำๆ ไป มันก็ไม่ยากแล้ว อาศัยความเข้าใจอ่ะนะ

 

โดย: ลุงกึ่ง IP: 124.120.151.238 25 มีนาคม 2549 10:50:24 น.  

 

ไม่รู้เรื่อง
ไม่ไหว
ไม่ทัน

 

โดย: vodca IP: 124.121.137.252 25 มีนาคม 2549 19:38:07 น.  

 

อ้าว อัพได้แล้ว
หายแล้วสินะคับ

 

โดย: แ ม ง ป อ 25 มีนาคม 2549 23:25:21 น.  

 

งง สุดชีวิต

 

โดย: จิ๊กกู่หรี IP: 84.230.128.124 7 เมษายน 2549 2:12:59 น.  

 

 

โดย: i111 IP: 202.28.21.4 24 เมษายน 2549 12:27:33 น.  

 

มาหาความรู้ในนี้พร้อมกับแอดชื่อเจ้าของบลอกไปเป็นกูรูที่บลอกตัวเองด้วยค่ะ

 

โดย: แม่มดจิ๋ว 27 กันยายน 2549 9:16:43 น.  

 

ปวดหัวค่ะ....

เรียนจบ วิท-คอม มาไม่ได้อะไรเลยค่ะ

อ. เค้าให้ศึกษาด้วยตัวเองแล้วไปสอบกะเค้า
โธ่.... อ. เค้าไม่รู้มั้ง ว่าเด็กมัน แค่ไหน
เลยจบมาแบบถู ๆ ไถ ไม่มีความรู้อะไรเลย

 

โดย: ชุด..ชู IP: 60.48.243.149 30 ตุลาคม 2549 22:08:59 น.  

 

ก็เคยเรียนจบมาเหมือนกันค่ะ แต่ไมไม่เป็นเลยล่ะคะเนี่ย

 

โดย: jail 2 พฤศจิกายน 2549 11:37:59 น.  

 

เรา รัก ในหลวง

 

โดย: ออมสิน IP: 203.118.113.85 9 กันยายน 2550 12:23:16 น.  

 

it a best

 

โดย: sheng IP: 203.172.199.254 11 มกราคม 2551 10:38:49 น.  

 

long love the king

 

โดย: sheng IP: 203.172.199.254 11 มกราคม 2551 10:40:12 น.  

 

หนูอยากเล่นลูบิกเก่งสอนหน่อยนะคะ

 

โดย: คนมีความรัก IP: 125.26.171.128 22 สิงหาคม 2551 20:25:59 น.  

 

ไม่รู้จะได้รับคำตอบแต่ถามไว้้ละกัน

คือผมอยากรู้ว่า ควรจะใช้ Connect หรือ Disconnect ในการ ทำการติดต่อฐานข้อมูลเพราะมันจะใช้ Dataset กับ Datareader ซึี่งมันเขีัยนต่างกันใช้ต่างกัน แบบไหนจะง่ายกว่าครับ รบกวนตอบที ขอบคุณ มือใหม่หัดเขียน C# MsSql

janepop_070145@hotmail.com

 

โดย: ao IP: 125.24.55.32 23 ตุลาคม 2551 17:56:44 น.  

 

เจี๊ยว

 

โดย: joe IP: 203.146.51.129 3 พฤศจิกายน 2551 15:46:41 น.  

 

มีปัญหาเกี่ยวกับไฟล์แฟลช ใส่ในบล๊อกค่ะ

align=center src=//www.geocities.com/xcrack2004/17.swf? width=1024 px height=768px
type=application/octet-stream wmode="transparent" quality="high";;>


ใส่เข้าไปแล้วมันแสดงผลแต่ทำให้หัวบล๊อกไม่สามารถเข้ามาแก้ไชบล๊อกตัวเองได้ค่ะ

 

โดย: โอ้ยโอ้ยโอ้ย 29 พฤศจิกายน 2551 15:16:18 น.  

 




หัวห้ายอย่างนี้ค่ะ

 

โดย: โอ้ยโอ้ยโอ้ย 29 พฤศจิกายน 2551 15:17:09 น.  

 

//www.pantown.com/board.php?id=18207&area=4&name=board16&topic=6&action=view


ดูจากที่นี้ก็ได้กะท้ล่างๆค่ะ

 

โดย: โอ้ยโอ้ยโอ้ย 29 พฤศจิกายน 2551 15:18:16 น.  

 

ไม่ขุดพ่อตายครับ
ขุดขุดขุดขุดขุดขุดขุดขุดขุดขุดขุด

 

โดย: drimkomray IP: 203.172.248.170 16 กุมภาพันธ์ 2552 10:30:02 น.  

 

บะบะบะกวนเกินไปเลยบะครับ

 

โดย: drimkomray IP: 203.172.248.170 16 กุมภาพันธ์ 2552 10:32:04 น.  

 

 

โดย: lalular (lalular ) 29 ตุลาคม 2554 8:17:43 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 


กึ่งยิงกึ่งผ่าน
Location :
กรุงเทพ Thailand

[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed

ผู้ติดตามบล็อก : 4 คน [?]




มีคนถามมาเยอะ ว่าชื่อผมแปลว่าอะไร บอกง่ายๆ ว่ามาจากฟุตบอลครับ "กึ่งยิงกึ่งผ่าน" เป็นการส่งลูกไปที่

หน้าประตูฝ่ายตรงข้าม โดยผู้เล่นที่เลี้ยงลูกมาจากทางด้านข้างของสนาม พอถึงจังหวะ ก็ผ่านลูกมาให้เพื่อนที่วิ่งมารออยู่หน้าประตู .... ต่าแว่!!

... แต่ว่า!!! ... ลูกมันเลยเพื่อนไป แต่ก็ไม่ถึงประตู เหมือนจะเป็นการยิงประตูก็ไม่ใช่ จะส่งให้เพื่อนก็ไม่ใช่


นี่จึงเป็นที่มาของคำว่า "กึ่งยิงกึ่งผ่าน" ครับ

ผมไม่ได้คิดเองแต่อย่างใด แต่เอามาจากการดูฟุตบอลครับ

ปล. ชื่อผมนี่บ่งบอกเลยว่า "ฟุตบอล" แต่ผมไม่ได้เล่นห้องศุภฯ นะครับ .. แหะ แหะ แหะ
Friends' blogs
[Add กึ่งยิงกึ่งผ่าน's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.