วันศุกร์ที่ 25 กรกฎาคม พ.ศ. 2557

เริ่มต้นเขียน ASP.net เรียกใช้ DB2 iSeries

เริ่มต้นเขียน 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 ไป  "ปิด" ไว้)

ผ่าน 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
       กรณี่ที่จะกำหนด Library List (จำกัด Lib ที่จะเห็น) กด [Advance] มุมขวาล่าง แล้วป้อนชื่อ Lib ในช่อง Catalog  Library List เช่น myLib1,myLib2
       ประโยชน์    ใช้เมื่อ 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
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()

GridView1.DataSource = dt
GridView1.DataBind()

ปัญหาที่พบ  ตั้งแต่ VS2010 เปิดตัว Entity Frame Work  VS2010 จะส่วนนี้จะติดต่อกับ iSeries ไม่ได้
(ปัจจุบัน  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