เริ่มต้นเขียน ASP.net เรียกใช้ DB2 iSeries
หลายท่านที่เรียนจบใหม่ อยากใช้ Tool ของภาษาใหม่ (เช่น Visual Studio)
ติดต่อ DB2 iSeries เพื่อสร้างงานที่ง่ายขึ้น วันนี้ลองมาใช้ VS2010 ติดต่อกับ DB2 iSeries ดูครับ
สามารถทำได้อย่างน้อย 2 วิธี
1. ผ่าน IBM.Data.DB2.iSeries.dll
2. ผ่าน OLEDB
ก่อนทำ
ตรวจสอบว่า Install (ติดตั้ง) iSeries Client Access โดยต้องเลือก .Net Data Provider ด้วย
(ปรกติจะ *default ให้ แต่บางบริษัทขณะ Setup ไป "ปิด" ไว้)
(ปรกติจะ *default ให้ แต่บางบริษัทขณะ Setup ไป "ปิด" ไว้)
ผ่าน OLEDB
วิธีนี้ ทำงานได้ง่ายที่สุด แต่มีข้อจำกัดพอสมควร
หลักการ - มองว่า เป็น DB ชนิดหนึ่ง ก็ติดต่อได้แล้ว (ทำได้ดีตั้งแต่ VS-2010)
ทบทวน
.Net การสร้าง GridView (เขียนย่อเป็น Gv) เพื่อแสดงข้อมูล
- การติดต่อ Server เรียก connection (เขียนย่อเป็น Conn)
- การเลือก Table, Field เรียกผ่น Sql Statement (กับ Server ระบุใน Conn)
.Net ตั้งชื่อ DataSource (เขียนย่อเป็น ds) เพื่อใช้เก็บ Conn และ Sql
(ทำให้เราเปลี่ยน ระหว่าง Server ทดสอบกับทำงานจริง ได้สะดวก)
- การแสดงผล จะเลือก Field จาก Sql Staatement
Gv เพียงแค่ระบุ ds จากนั้นก็เสียเวลาปรับแต่งการแสดงผล
ตย. เช่น ขณะสร้าง SqlDataSource กด New (Add Connection)
Data Source กด [Change] เปลี่ยนจาก Micorsoft SQL Server
ไปเป็น <other> แล้วเลือก
Data Provider ให้เป็น .NET Framework Data Provider for OLEDB
OLE DB Provider เลือกเป็น IBM DB2 for i5.OS IBMDA400 OLE DB Provider
Q: IBM DB2 for ... ไม่แสดง
A: อาจจะเกิดจาก (VS 2010) มี .Net FrameWork 4.5.1 ติดตั้งอยู่ (ดูจาก Start > Ctrl Panel > Program & Feature)
ให้ Un-Install แล้วติดตั้ง VS2010 ใหม่
ระบุ Server (หรือ IP address), User และ Password
A: อาจจะเกิดจาก (VS 2010) มี .Net FrameWork 4.5.1 ติดตั้งอยู่ (ดูจาก Start > Ctrl Panel > Program & Feature)
ให้ Un-Install แล้วติดตั้ง VS2010 ใหม่
ระบุ Server (หรือ IP address), User และ Password
กรณี่ที่จะกำหนด Library List (จำกัด Lib ที่จะเห็น) กด [Advance] มุมขวาล่าง แล้วป้อนชื่อ Lib ในช่อง Catalog Library List เช่น myLib1,myLib2
ประโยชน์ ใช้เมื่อ Sql Statement ไม่ระบุ Lib (ให้เลือกตามลำดับใน Lib List)
...ถ้าระบุ Lib ใน Sql ไม่จำเป็นต้องประกาศ
เมื่อใช้วิธีที่ 2 (ด้านล่าง) รายชื่อ File จะแสดงตาม Lib list
...ถ้าไม่เลือก Field ผ่านตัวช่วยสร้าง Sql (ช้า) ไม่จำเป็นต้องประกาศ
ประโยชน์ ใช้เมื่อ Sql Statement ไม่ระบุ Lib (ให้เลือกตามลำดับใน Lib List)
...ถ้าระบุ Lib ใน Sql ไม่จำเป็นต้องประกาศ
เมื่อใช้วิธีที่ 2 (ด้านล่าง) รายชื่อ File จะแสดงตาม Lib list
...ถ้าไม่เลือก Field ผ่านตัวช่วยสร้าง Sql (ช้า) ไม่จำเป็นต้องประกาศ
ข้อจำกัด ขณะทำ DataSource ในช่วงของการสร้าง SQL จะมองไม่เห็น file/field (ตัวเลือกไม่ทำงาน)
แต่อนุญาตให้ป้อน SQL ได้ (ตัวเลือกด้านบน)
ข้อแนะนำ ให้ไปทดสอบ SQL ภายนอกจนถูกต้อง (บน iSeries Navigater) แล้ว copy มาวางจะเร็วกว่า
ผ่าน IBM.Data.DB2.iSeries.dll
เป็นวิธีที่สามารถทำได้หลากหลาย (โดนใจ กลุ่ม coding)
คำแนะนำ ให้ใช้ผสมทั้ง 2 วิธี
หลักการ - เพิ่ม .dll ให้ VS รู้จัก (ทำงานแบบ native)
ต้อง Add Reference > เลือก tab=Browse > ค้น IBM.Data.DB2.iSeries.dll
ใน Folder = ..\IBM\ClientAccess\
ขณะสร้าง DataSource จะเห็น File/Field (แก้ปัญหาข้อจำกัด ของวิธีแรก)
Code : ด้านบนต้องเพิ่ม Imports IBM.Data.DB2.iSeries
การ Code จะทำเหมือนเรียกใช้ SqlConnection, SqlCommand, …
แต่เปลี่ยนเป็น iDB2Connection, iDB2Command, iDB2DataAdapter, iDB2DataReader
คนที่เขียนสไตล์ ติดต่อ MS SQL เห็นแบบนี้แล้วไปต่อง่ายเลยใช่มั๊ยครับ
ตย. Code
ตย. Code
Dim conn As New iDB2Connection("DataSource=A39BP;UserID=PCLINK;Password=PCLINK;
ConnectionTimeOut=0")
Dim cmd = New iDB2Command("Select field1,field2 From lib.file ", conn)
cmd.CommandTimeout = 0
Dim da As New iDB2DataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
da.Dispose()
cmd.Dispose()
conn.Close()
Dim cmd = New iDB2Command("Select field1,field2 From lib.file ", conn)
cmd.CommandTimeout = 0
Dim da As New iDB2DataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
da.Dispose()
cmd.Dispose()
conn.Close()
GridView1.DataSource = dt
GridView1.DataBind()
GridView1.DataBind()
(ปัจจุบัน Web ของ IBM ได้เขียนแนะนำว่า ทำได้แล้ว)
Q: วิธีนี้ดีจริง ?
A: เมื่อดูภาพกว้างๆ การทำงานไม่ช้า
เขียนโดยใช้ SqlConnection สามารถใช้ได้ทั้ง MS Sql Server และ DB2
ในขณะที่ เขียนโดยระบุ iDB2Connection ใช้ได้กับ DB2 เท่านั้น
>> การเขียนโดยใช้ SqlConnection น่าจะ "ยืดหยุ่น" กว่า
แต่ถ้า "เน้น" ความเร็ว, ตัวเลือก ที่มีเฉพาะใน DB2
>> การเรียกใช้ ชุดการเชื่อมต่อ"เฉพาะ" ต้องเหมาะสมกว่า
อ้างอิง
http://gugiaji.wordpress.com/2011/12/29/connect-asp-net-to-db2-udb-for-iseries/
http://www.codeproject.com/Articles/157953/Connecting-DB-iSeries-From-net-Application