www.oocities.org/pontipa001

หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer

ActiveX Data Object (ADO)

สำหรับเรื่อง ADO เป็นการเปิดฐานข้อมูลแบบใหม่ของ Microsoft  นำมาใช้เพื่อเปิดฐานข้อมูลได้หลายๆชนิด ที่เรียกว่า Universal Data Access ในการเข้าถึงฐานข้อมูลโดยใช้ ADO นั้น จะใช้ผ่านทาง OLE DB ซึ่งเป็นกลุ่มคำสั่งที่เชื่อไปยัง Data Provider เพื่อเชื่อมต่อไปยังฐานข้อมูลที่ต้องการ สำหรับ Data Provider คือผู้ให้บริการฐานข้อมูล ผมได้แบ่งชนิดของ Data Provider ตามหัวถัดไปไว้แล้ว

เรื่อง ADO นั้นตอนแรกก็ไม่ค่อยได้สนใจเท่าไหร่ แต่เมื่อมาใช้งานแบบ Client/Server จึงรู้ว่า DAO นั้นจะช้ากว่าเยอะ จากการทดสอบค้นหาข้อมูล 1 แสนแบบ Client/Server ถ้าใช้ DAO จะใช้เวลาราว 14 วินาที แต่ถ้าใช้ ADO ใช้เวลาราว 4 วินาทีเอง ดังนั้นต่างกันมาก อีกอย่างนึงก็คือ ADO สร้างมาเน้นไปทางด้าน Client/Server โดยตรง สามารถนำไปใช้กับฐานข้อมูลหลายๆตัวได้ นอกจากนี้ยังใช้ใน ASP และ Internet ดังนั้นถึงเวลาที่ได้เปลี่ยนมาใช้ ADO กันซะที สำหรับ ADO นั้นผมได้รวบรวมจากหลายๆแหล่ง 

  มารู้จักกับ Data Provider กันก่อน
  การเปิดใช้ฐานข้อมูล (Connection)
  การเปิดใช้งานเรคคอร์ด (Recordset)
  การอ้างชื่อฟิลด์ 
  การใช้งาน Method ต่างๆของ Recordset
  การใช้ Execute Method
  ปัญหาการใช้ Recordcount 
  การใช้งาน Command Object
  การใช้งาน Store Procedure
  การใช้งาน Store Procedure ที่มี Parameter

มารู้จักกับ Data Provider กันก่อน (15 ม.ค. 2543)

Data Provider คือผู้ให้บริการฐานข้อมูล ดังนั้นถ้าจะใช้ฐานข้อมูลใด ต้องเลือกให้ถูกต้องตามตารางซึ่งผมรวบรวมเท่าที่ใช้งานบ่อยๆดังนี้

Microsoft.Jet.OLEDB.3.51
Microsoft.Jet.OLEDB.4.0
ใช้เปิดฐานข้อมูล Microsoft Access
MSDASQL ให้บริการฐานข้อมูลสำหรับ  ODBC
MSDAORA ให้บริการฐานข้อมูล Oracle
SQLOLEDB.1 ให้บริการฐานข้อมูล SQL Server
MSDataShape สำหรับข้อมูลที่จะใช้ทำ Hierachical Recordset

การเปิดใช้ฐานข้อมูล (Connection) (15 ม.ค. 2543)

ก่อนเรียนรู้การเปิดฐานข้อมูลเ ต้องรู้จัก Connection Object ซึ่งมี Properties ที่สำคัญดังนี้
ConnectionString Properties
ConnectionString เป็นประโยค(String) ที่ประกอบด้วย หลายๆ Attributes มาต่อกันคั่นด้วย ; (Semicolon) สำหรับ Attribute นั้นมีดังนี้

Provider ชื่อของผู้ให้บริการฐานข้อมูล ตามหัวข้อที่แล้ว
User ID รหัสผู้ใช้
Password รหัสผ่าน
Data Source ชื่อฐานข้อมูล ถ้าใช้ SQL Server ใช้ชื่อ Server
Initial Catalog ระบุชื่อฐานข้อมูลเริ่มต้นของ SQL Server

การเปิดใช้งาน ActiveX Data Object นั้นคุณต้องไปที่เมนู Project->Reference แล้วคลิกที่
   ActiveX Data Object 2.1 Libraly และ
   ActiveX Data Object Recordset 2.1 Library
  (กรณีคุณใช้พวก Addnew, Update)
ส่วนการเปิดฐานข้อมูล ใช้ Method Open ดังตัวอย่าง
เปิดใช้ฐานข้อมูล Access 
ได้ดังนี้
รูปแบบ 1.1 (ลอกมาจาก Microsoft)
     ใช้ Provider Microsoft.Jet.OLEDB.4.0
    Dim cnn As New ADODB.Connection
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Nwind.mdb;"
    cnn.Close
รูปแบบ 1.2 
    Dim cnn As New ADODB.Connection
    cnn.ConnectionString =  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Nwind.mdb;"
    cnn.Open 
    cnn.Close
รูปแบบ 1.3
    ใช้อ้างจาก Driver
    Dim cnn As New ADODB.Connection
    cnn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Nwind.mdb;" 
    cnn.Open 
    cnn.Close
รูปแบบ 1.4
    ใช้อ้างจาก ODBC คุณต้องสร้างODBC =ชื่อ  MyNwind  ที่ Control Panel ก่อนใช้งาน
    Dim cnn As New ADODB.Connection
    cnn.ConnectionString =  "DSN=MyNwind;"
    cnn.Open 
    cnn.Close
 เปิดใช้ฐานข้อมูล SQL Server สามารถทำ ได้ดังนี้
รูปแบบ 2.1 
     ใช้ Provider SQLOLEDB.1
    Dim cnn As New ADODB.Connection
    cnn.Open "Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa; " & _ 
                      " Password=;Initial Catalog=Pubs "
    cnn.Close
รูปแบบ 2.2
     ใช้ Provider SQLOLEDB.1
    Dim cnn As New ADODB.Connection
     cnn.ConnectionString =  "Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa; "  & _
                                             " Password=;Initial Catalog=Pubs "
    cnn.Open 
    cnn.Close
รูปแบบ 2.3
    ใช้อ้างจาก Driver ต้องสร้าง ODBC ชื่อ MyPubs ที่ Control Panel
    Dim cnn As New ADODB.Connection
    cnn.ConnectionString ="DRIVER={SQL Server};DSN=MyPubs;DATABASE=Pubs; " & _
                                          " SERVER=MYSERVER;UID=Sa;PWD= "
    cnn.Open 
    cnn.Close
รูปแบบ 2.4
    ใช้อ้างจาก ODBC ต้องสร้าง ODBC ชื่อ MyPubs ที่ Control Panel ตัวอย่างนี้จะคล้ายกับ 2.3 แต่เขียนแบบสั้น 
    Dim cnn As New ADODB.Connection
    cnn.ConnectionString ="DSN=MyPubs;UID=Sa;PWD="
    cnn.Open 
    cnn.Close
รูปแบบ 2.5
     ใช้ Provider MSDASQL เพื่อเปิดผ่าน ODBC ต้องสร้าง ODBC ชื่อ MyPubs ก่อน
    Dim cnn As New ADODB.Connection
     cnn.ConnectionString = "Provider=MSDASQL;Data Source=MyPubs;User ID=Sa;Password=; " & _ 
                                           " Initial Catalog=Pubs " 
    cnn.Open 
    cnn.Close
    '//---- ข้อระวัง Data Source ที่เปิดผ่าน Provider MSDASQL จะใช้ชื่อ DSN
    '//---- ซึ่งจะต่างจากที่เปิดโดยใช้ SQLOLEDB ซึ่งใช้ชื่อ Server

นอกจากนี้ยังมี Properties อื่นๆที่น่าสนใจอีกก็คือ
Mode Properties ใช้สำหรับกำหนดสิทธิการอ่านและเขียนฐานข้อมูล เช่น
    cnn.Mode = adModeRead '// คือกำหนดให้อ่านได้อย่างเดียว
    cnn.Mode = adModeWrite '// คือกำหนดให้บันทึกเพิ่มได้อย่างเดียว
    cnn.Mode = adModeReadWrite '// คือกำหนดให้อ่านและบันทึกเพิ่มได้อย่างเดียว
    cnn.Mode = adModeShareDenyRead '// คือ ...
    cnn.Mode = adModeShareDenyWrite '// คือ ...
    cnn.Mode = adModeShareExclusive '// คือ ...

การเปิดใช้งานเรคคอร์ด (Recordset)
(15 ม.ค. 2543)

การเปิดใช้งาน ADO ต้องประการตัวแปร Recordset  แล้วใช้ Method Open ตามรูปแบบ
    rst.Open Source, ActiveConnection, CursorType, LockType, Options

Source เป็น Sting SQL หรือเป็นชื่อ Table  ก็ได้
ActiveConnection ชื่อตัวแปร Connection ที่เปิดไว้
CursorType ชนิดของ Cursor (ตัวชี้ตำแหน่ง Record)
adOpenForwardOnly  เปิดอ่าน เพิ่ม หรือ ,แก้ไข แต่ว่าอ่านแบบเดินหน้าอย่างเดียว จะมีประสิทธิภาพที่สุด 
adOpenKeyset เปิดอ่าน,แก้ไขและเพิ่มได้ แต่ว่าไม่สามารถเห็นรายการใหม่ที่ผู้ใช้คนอื่นเพื่ม แต่ยังคงเห็นรายการที่ผู้อื่นแก้ไข และ รายการถูกลบก็จะข้ามไปเมื่อ Cursor ผ่านรายการนั้น
adOpenDynamic เปิดอ่าน,แก้ไขและเพิ่มได้ สามารถเห็นทุกรายการ ที่ผู้ใช้อื่นเพิ่ม แก้ไข หรือ ลบทิ้ง แต่มีข้อเสียคือ จะช้ากว่าเพื่อนเลยล่ะครับ
adOpenStatic เปิดอ่าน,แก้ไขและเพิ่มได้ ไม่เห็นรายการเปลี่ยนแปลงหลังจากเลือกแล้ว
จะมีประสิทธิภาพรองจาก adOpenForwardOnly แต่ดีกว่าตรงที่ สามารถเลื่อน Cursor ได้ทุกทิศทาง 
LockType ประเภทการ Lock
adLockReadOnly กำหนดให้อ่านอย่างเดียว
adLockPressimistic Lock เมื่อมีการแก้ไขข้อมูล
adLockOptimistic Lock เมื่อใช้ Method Update
adLockBatchOptimistic Lock เมื่อใช้คำสั่ง UpdateBatch
Options เป็นเงื่อนไขการเปิด
adCmdText ประโยคคำสั่ง SQL
adCmdTable เปิดแบบ Table สามารถใช้กับ SQL Server ได้ด้วย
adCmdStoreProc ใช้เรียก StoreProcedure ใน SQL Server หรือเรียกใช้  Query ใน Access นั่นแหละครับ อธิบายหัวข้อถัดไป
adCmdUnknown ไม่รู้จะใช้อะไรดี ก็ใช้ตัวนี้แหละครับ

หมายเหตุ หนังสือไทยบางเล่มอธิบายผิด คืออธิบายว่าเปิดแบบ adOpenForwardOnly หรือ adOpenStaticจะอ่านได้อย่างเดียว จริงๆแล้วสามารถ เพิ่ม ลบ และแก้ไขได้ ดังนั้นถ้าหากว่าท่านจะให้เปิดอ่านได้อย่างเดียว ต้องกำหนด adLockReadOnly เข้าไปด้วยนะครับ
นอกจากนี้ยังมี Properties ที่สำคัญอีกคือ

CursorLocation Properties ใช้กำหนดให้ Cursor( ตัวชี้ไปที่ Record) อยู่ฝั่ง Client หรือ Server
    rst.CursorLocation = adUserNone '//-- ไม่ใช้ Cursor เลย จะเร็วที่สุด เหมาะสำหรับแสดง
    rst.CursorLocation = adUserClient '//-- ใช้ที่ฝั่ง Client
    rst.CursorLocation = adUserServer '//-- ใช้ที่ฝั่ง Server
adUseClient จะเร็วกว่า adUserServer ดังนั้นแนะนำให้ใช้ adUseClient 
adUseServer เหมาะการคุมแบบ Conncurency ยกตัวอย่างเช่น มีผู้ใช้ 2 คน เรียกใช้ข้อมูล Record เดียวกัน แต่ว่าคนแรกบันทึกก่อน คนที่สองจะทราบค่าครั้งหลังสุด ถ้าใช้แบบ adUseServer 
adUseNone นั้นถ้าคุณจะใช้ต้องพิมพ์เข้าไปเองนะขอรับเพราะว่าเรียกจาก List (เมื่อกดแป้นจุด) จะไม่แสดง
ในหนังสือบางเล่มเขียนว่า เปิดแบบ adOpenDynamic ไม่สมารถ Bookmark แต่ถ้าคุณใส่ CursorLocation = adUseClient จะทำ Bookmark ได้ดังนั้นจึงแจ้งให้ทราบทั่วๆกัน แต่ถ้าหากว่าใช้ adUseClient การเปิดแบบ adOpenKeyset และ adOpenDynamic จะไม่สามารถเห็นการเปลี่ยนแปลงจากผู้ใช้อื่นได้
ตัวอย่างการเปิดใช้ Recordset
   rst.Open "Select * from Customers '", cnn, adOpenForwardOnly, adLockReadOnly
1.
ถ้าเขียนแบบเต็มเช่น 
  
Dim cnn As New ADODB.Connection 
   Dim rst As New ADODB.Recordset 
   Dim fld As ADODB.Field 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   rst.Open "Select * from Customers '", cnn, adOpenForwardOnly, adLockReadOnly 
   rst.Close 
   cnn.Close
2.
บางท่านอาจจะเขียนแบบนี้ก็ได้
  
Dim cnn As New ADODB.Connection 
   Dim rst As New ADODB.Recordset 
   Dim fld As ADODB.Field 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   rst.Source = "Select * from Customers '"
   rst.CursorType =  adOpenForwardOnly
   rst.LockType =  adLockReadOnly
   rst.ActiveConnection = cnn
   rst.CursorLocation = adUseClient
   rst.Open 
   rst.Close 
   cnn.Close
3.
หรือใช้ With มาช่วยถ้าไม่อยากป้อนเยอะ
  
Dim cnn As New ADODB.Connection 
   Dim rst As New ADODB.Recordset 
   Dim fld As ADODB.Field 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   With rst
      .Source = "Select * from Customers '"
      .CursorType =  adOpenForwardOnly
      .LockType =  adLockReadOnly
      .ActiveConnection = cnn
      .CursorLocation = adUseClient
      .Open 
   End With
   rst.Close 
   cnn.Close

สำหรับผมแล้วชอบใช้แบบ 1 มากกว่า เพียงแต่ตอนเขียน SQL จะใช้เป็นตัวแปรแทนเช่น
SQLText = "Select * from Customers '"
rst.Open SQLText, cnn, adOpenForwardOnly, adLockReadOnly 

ตอนที่ 2

การอ้างชื่อฟิลด์ (21 ม.ค. 2543)
ยังคงเหมือนกับ DAO
1. MyRs!LastName  
2. MyRs![Last Name]   เหมาะกับคนที่ชอบตั้งชื่อมีช่องว่าง
3. MyRs.Fields("LastName") หรือ  MyRs("LastName") เหมาะกับชื่อที่ต้องใช้วนลูปตัวแปร เช่น M01 ถึง M12
4. MyRs.Fields(n)  n= 0 ถึง FieldCount - 1
กรณีใช้ Ado Data Control เปลี่ยนชื่อจาก MyRs เป็น AdoDc1.Recordset
1. Adodc1.Recordset!LastName
2. Adodc1.Recordset![Last Name]
3. Adodc1.Recordset.Fields("LastName") หรือ  MyRs("LastName")
4. Adodc1.Recordset.Fields(n)  n= 0 ถึง FieldCount - 1

การใช้งาน Method ต่างๆของ Recordset
(21 ม.ค. 2543)
การเลื่อนตำแหน่งเรคคอร์ดเราใช้ Method ดังนี้
    MoveFirst ไปรายการแรก
    MoveNext ไปรายการถัดไป 
    MovePrevious ย้อนไปรายการที่แล้ว
    MoveLast ไปรายการสุดท้าย
    Move n เมื่อ ท เป็นตัวเลข เช่น -1, -2 (ย้อนไป2เรคคอร์ด) ,1, 2 (เดินหน้า2เรคคอร์ด)
    EOF  ตรวจสอบท้ายแฟ้ม
    BOF ตรวจสอบต้นแฟ้ม
เกี่ยวกับเพิ่ม,แก้ไข และลบ
    AddNew
    '//Edit (ใน ADO ไม่มีแล้ว)
    Update
    CancelUpdate
    Delete
    UpdateBatch
    CancelBatch
การค้นหาเรคคอร์ด
    Find  Criteria, [skipRecords], [serachDirection], [Start]
     สำหรับการ Find นั้นจะได้ Field เดียว (รุ่น 2.1 หรือต่ำกว่า) ลองอ่านรายละเอียดได้ที่ http://support.microsoft.com/support/kb/articles/q195/2/22.asp อนึ่งสาเหตุที่ต้องระบุรุ่นเนื่องจาก รุ่นใหม่ๆอาจแก้ Bug แล้วก็ได้ เช่นผมเคยบอกว่า Val มีปัญหาใน VB4 แต่รุ่นถัดมาก็ใช้ได้เป็นต้น 
     Ex.
    
rst.Find " [CostomerID] = " & iID    '//-- เมื่อ CustomerID เป็นตัวเลข
Method อื่นๆที่หน้าสนใจ
    AbsolutePosition  ตำแหน่งเรคคอร์ดเป็นตัวเลข สามารถระบุแถวที่จะไปได้เลย
    Requery ปรับปรุงยอดใหม่
     Filter
     Index

การใช้ Execute Method
(21 ม.ค. 2543)

ในการเพิ่ม ปรับปรุง หรือ ลบข้อมูล หรือ เลือกเรคคอร์ด โดยใช้คำสั่ง SQL 
มี 2 รูปแบบคือ
   1.   cnn.Exceute command, [records], [Options]
   2.   rsResult = cnn.Execute(command, [records], [Options])
command คือคำสั่ง SQL หรือชื่อ Storeprocedure
records คือ จำนวน records ที่ประมวลผลได้
options คือ ประเภทการเปิดมี
               adCmdText 
               adCmdStoreProcedure 
               adCmdTable
(ADO จะ Execute ประโยค Select * From <Table>  )
แบบ1ใช้กรณีไม่ต้องการผลส่วนใหญ่ใช้กับ Insert, Delete, Update
แบบ2จะใช้เมื่อต้องการผลเรคคอร์ด จะใช้กับ Select 
Ex1. ใช้ Execute โดยไม่ต้องการผล Recordset
   Dim cnn As New ADODB.Connection 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   cnn.Execute  "Delete * from Customer " 
Ex2. ใช้ Execute ต้องการผล Recordset
   Dim cnn As New ADODB.Connection 
   Dim rst As New ADODB.Recordset 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   Set rst = cnn.Execute ( "Select * from Customer " )
   Do While not rst.EOF
         Print rst!FiestName
         rst.MoveNext
    Loop
Ex3. ใช้ Execute เมื่อต้องการทราบจำนวน Record ที่ถูก Execute
   Dim cnn As New ADODB.Connection 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   SQLText = "Update Product Set UnitPrice = 0.05 * UnitPricer "
   cnn.Execute  SQLText , iRecords, adCmdText
   
จะได้จำนวนเรคคอร์ดส่งกลับมาที่ iRecords 
   แต่ถ้าไม่ต้องการทราบจำนวน Records ให้ใส่  
adExecutenoRecords ดังตัวอย่าง
    cnn.Execute  SQLText , iRecords, adCmdText Or adExecutenoRecords
  
ถ้าใส่ แล้วจะเพิ่มประสิทธิภาพขึ้นอีกเพราะว่า ADO ไม่ต้องไปเสียเวลานับ
Ex4. ใช้ Execute ประมวลผล Store Procedure
   Dim cnn As New ADODB.Connection 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   SQLText = "UpdateUnitPrice"
   
cnn.Execute  SQLText , , adCmdStoreProc
   
ชื่อ UpdateUnitPrice คือชื่อQueryใน Access หรือ StoreProcedure ใน SQL Server
ปัญหาการใช้ RecordCount (21 ม.ค. 2543)
 ในการใช้ RecordCount ใน ADO นั้น หลายๆท่านอาจจะเคยประสบปัญหาว่าได้ -1 ตลอด มีข้อพิจารณาดังนี้
1. ถ้าคุณเปิดใช้แบบ adOpenKeySet หรือ adOpenStatic จะไม่มีปัญหา
2. ถ้าคุณเปิดแบบ adOpenForwardOnly หรือ adOpenDynamic จะได้ -1 ตลอด
3. หากเปิดตามข้อสอง ต้องกำหนด adUseClient ด้วยถึงจะไม่มีปัญหา
สรุปว่า ถ้าคุณใช้ adUseClient แล้วจะไม่มีปัญหาเลยล่ะครับ 

การใช้งาน Command Object (21 ม.ค. 2543)
เรื่อง Command Object นี้ตอนแรกสร้างความสับสนให้มากเมื่อตอนที่ ADO ออกมากับ VB6 ใหม่ๆ กว่าจะเข้าใจได้ใช้เวลาพอสมควร จะว่าไปแล้ว ถ้าคุณไม่ใช้ Store Procedure ไม่จำเป็นต้องใช้ก็ได้
เพราะว่า Command Object นี้โดยส่วนใหญ่แล้วจะใช้ เพื่อประมวลผล query (ใน Access) หรือ Store Procedure (SQL Server หรือ Database อื่น) แต่เรานยังสามารถใช้ประมวลผลแบบ Recordset ก็ได้
   
ในการประมวลผล StoreProcedure นั้น เราสามารถใช้ Execute Method ตามหัวข้อก่อนหน้านี้ได้ แต่ว่าในการประมวลผลแบบนั้นไม่สะดวกในการส่งค่า Parameter เข้าไป และ รับกลับ  ดังนั้นการใช้ Command Object จึงเข้ามาแก้ปัญหาตรงจุดนี้นั่นเอง
    
ดังนั้นถ้าหากคุณต้องการใช้ Query หรือ StoreProcedure ต้องศึกษา Command Object 
สำหรับ Properties ของ Command Object ที่สำคัญมีดังนี้
   ActiveConnection - ใช้ติดต่อกับ Connection ที่เปิดอยู่
   CommandText - เป็น SQL หรือ ชื่อ StoreProcedure
   CommandType - เป็นชนิดการเปิดมี adCmdText, adCmdTable, asCmdStoredProc
   ... ที่เหลือหาอ่านเพิ่มเติม
การใช้ Command Object นั้นมีขั้นตอนดังนี้
1.ต้อง Connection  เช่น

    Dim cnn As New ADODB.Connection
    cnn.ConnectionString =  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Nwind.mdb;"
    cnn.Open 
2. ประกาศ Recordset เช่น
   Dim rst As New ADODB.Recordset 
3. ประกาศ Command Object และ Command Properties ต่างๆ
   Dim cmd As New ADODB.Command
    cmd.CommandText = "Select * From Customer "
    cmd.CommandType = adCmdText
    cmd.ActiveConnection = cnn
 
4. ใช้ Execute Method เพื่อเปิดใช้ Recordset
    
Set rst = cmd.Execute
สำหรับ Exceute Methed ขแง Command Object จะมีรูปแบบดังนี้
Set rst = Command.Execute([Records], [Parameter], [Options])
Records คือ ประโยค SQL  หรือ ชื่อ StoreProcedure
Parameter คือ ค่า Parameter ที่ส่งเข้าไปใน Query หรือ Store Procedure
Options เหมือนกับ Execute Method
Ex1.
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim cmd As New ADODB.Command
    cnn.ConnectionString =  "Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa; "  & _
                                             " Password=;Initial Catalog=Pubs "
    cnn.Open 
    cmd.ActiveConnection = cnn
     cmd.CommandText = "byroyalty"
     cmd.CommandType = adCmdStoredProc
     Set rst = cmd.Execute
     Do While not rst.EOF
          Print rst.Fields(0)
         rst.MoveNext
     Loop
     Set rst = Nothing
     Set cmd = Nothing
     Set cnn = Nothing

ตอนที่ 3

การใช้งาน Store Procedure (28 พ.ค. 2543)

     Store Procedure หลายท่านอาจสงสัยงง ถ้าไม่เคยใช้ Database แบบ Client/Server ผมก็เลยนิดนึงเพื่อให้ท่านได้รู้จักกันก่อน Store Procedure เป็นประโยค SQL ที่เขียนเก็บไว้ใน Database เพื่อสำหรับทำงานเฉพาะกิจที่เราต้องการ เช่น Update ข้อมูล 
     ประโยชน์ที่ใช้ Store Procedure ก็เนื่องมาจากความเร็วนะครับ เพราะ Store Procedure เป็นประโยค SQL ที่ได้รับการ Compile เรียบร้อยแล้ว แถบยังทำงานประมวลผลกับ Database โดยตรง แต่สำหรับผมแล้วแทบไม่ได้ใช้ เนื่องจากกลัวปัญหาเรื่องการเปลี่ยนฐานข้อมูล ใช้บ้างนิดหน่อยเท่านั้นเอง
    สำหรับท่านใดที่ใช้ Access ตรงส่วนที่เขียน Query นั่นแหละครับเขาถือว่าเป็น Store Procedure นึงเหมือนกัน

การสร้าง Store Procedure
1. สร้างโดยตรงที่ฐานข้อมูล
   อันนี้ก็ไม่ยากถ้าคุณใช้ Access คุณไปสร้าง Query ขึ้นมา
   ถ้าใช้ SQL Server หรือ อื่นๆ ก็ไปสร้างที่ฐานข้อมูลส่วนที่เก็บ Store Procedure 
2. สร้างจาก VB เลย ลองตัวอย่างการสร้าง
  สำหรับตัวอย่างนี้เป็นการสร้าง Store Procedure ที่ชื่อ GetServerDate เพื่อใช้สำหรับ
  รับค่าวันที่จาก Server โดยสร้างไว้ที่ Database ชื่อ Pubs ซึ่งติดมากับ SQL Server
  และ Server ชื่อ MyServer ดังนั้นถ้าท่านจะนำไปใช้ต้องเปลี่ยนชื่อ Server ด้วย
Dim MyString As String
Set Conn = New ADODB.Connection
Set Cmd = New ADODB.Command
Conn.Open " Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa;Password=;Initial Catalog=Pubs "
'//---- ควรตรวจสอบว่ามี Procedure ถ้ามีก็ให้ Drop ทิ้งไป
MyString = " IF EXISTS (SELECT name FROM sysobjects "
MyString = MyString & " WHERE name = 'GetServerDate') "
MyString = MyString & " DROP PROCEDURE GetServerDate "
'//---
Set Cmd = New ADODB.Command
Cmd.CommandType = adCmdText
Cmd.CommandText = MyString
Cmd.ActiveConnection = Conn
Cmd.Execute
Set Cmd = Nothing
'//----สร้าง Store Procedure ผมสร้างชื่อ GetServerDate
MyString = " CREATE PROCEDURE GetServerDate "
MyString = MyString & " @ServerDate DateTime OUTPUT AS " & vbCrLf
MyString = MyString & " SELECT @ServerDate = GETDATE() " & vbCrLf
Set Cmd = New ADODB.Command
Cmd.CommandText = MyString
Cmd.CommandType = adCmdText
Cmd.ActiveConnection = Conn
Cmd.Execute
Set Cmd = Nothing

*** ข้อสำคัญ ***
 ในการสร้าง Store Procedure จะต้องกำหนด CommandType เป็น adCmdText
 การใช้ Store Procedure จะต้องกำหนด CommandType เป็น adCmdStoredProc

การเรียกใช้งาน Store Procedure
1. เรียกใช้งานกับ Access 
   Dim cnn As New ADODB.Connection 
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   SQLText = "UpdateUnitPrice"
   cnn.Execute  SQLText , , adCmdStoreProc

2
. เรียกใช้งานกับ Access รับค่าเข้าRecordset
   Dim cnn As New ADODB.Connection 
   Dim rst As New ADODB.Recordset
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\nwind.mdb;" 
   SQLText = "SelectName"
   Set rst = cnn.Execute (SQLText , , adCmdStoreProc)

3
. เรียกใช้งานกับ SQL Server 
   Dim cnn As New ADODB.Connection 
   cnn.Open "Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa; "  & _
                                             " Password=;Initial Catalog=Pubs "
   SQLText = "UpdateUnitPrice"
   cnn.Execute  SQLText , , adCmdStoreProc

4
. เรียกใช้งานกับ SQL Server รับค่าเข้า Recordset
   Dim cnn As New ADODB.Connection 
   Dim rst As New ADODB.Recordset
   cnn.Open "Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa; "  & _
                                             " Password=;Initial Catalog=Pubs "
   SQLText = "SelectName"
   Set rst = cnn.Execute (SQLText , , adCmdStoreProc)

การใช้งาน Store Procedure ที่มี Parameter สำหรับส่งและรับค่า (28 พ.ค. 2543)
     การใช้ Store Procedure นั้นบางที่เราต้องมีการส่งค่าไปมาระหว่างโปรแกรม กับ Store Procedure การส่งค่านั้นจะส่งผ่าน Parameter ในหัวข้อนี้เลยต้องกล่าวถึงการสร้างและใช้ Parameter

1. การสร้าง Store Procedure
1.1 การสร้าง Parameterใน Access
   ในการสร้าง Query ใน Access จะมีเมนู Query->Parameters ท่านสามารถใส่ Parameters ได้
1.2 การสร้าง Parameter ใน SQL Server
  ให้สร้างที่ Database->Store Procedure คลิกเมาส์ปุ่มขวา เลือกเมนู New Procedure
  ตัวอย่างนี้คือการรับวันที่จาก Server 

  CREATE PROCEDURE GetServerDate
 @ServerDate DateTime OUTPUT AS
  SELECT @ServerDate = GETDATE()


  อธิบายความหมายหน่อย การตั้งตัวแปร @ServerDate แบบ DateTime เป็น Output Parameter  ใช้
   @ServerDate DateTime OUTPUT
  ถ้าเป็นแบบ INPUT หรือ INPUT-OUTPUT ให้ใช้ดังนี้
   @ServerDate DateTime INPUT
   @ServerDate DateTime INPUT-OUTPUT
  ส่วนการเก็บค่าเข้าในตัวแปรใช้ดังตัวอย่าง
    SELECT @ServerDate = GETDATE()

2. การเรียกใช้งาน Store Procedure ที่มี Parameter
  ต้องใช้ Command Object และใช้ Parameter ร่วมด้วย
  ในตัวอย่างเป็นการเรียกใช้ Store Procedure ที่สร้างจากข้อ 1.2

Set Conn = New ADODB.Connection
Set Cmd = New ADODB.Command
Set Param = New ADODB.Parameter
Conn.Open " Provider=SQLOLEDB;Data Source=MyServer;User ID=Sa;Password=;Initial Catalog=Pubs "
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdStoredProc
Cmd.CommandText = "GetServerDate"
Set Param = Cmd.CreateParameter("MyServerDate", adDate, adParamOutput)
Cmd.Parameters.Append Param
Cmd.Execute
MsgBox Format(Cmd.Parameters(0), "dd mmm yyyy")
MsgBox Format(Cmd.Parameters("MyServerDate").Value, "dd mmm yyyy")


อธิบายโปรแกรมส่วนที่สำคัญ
ต้องกำหนด CommandType ให้เป็น adCmdStoreProc ดังตัวอย่าง
     Cmd.CommandType = adCmdStoredProc
ต้องกำหนดชื่อ Stored Procedure ที่เรียกใช้ตรง CommandText
     Cmd.CommandText = "GetServerDate"
ต้อง Set Parameter และ Append ไปที่ Command.Parameters
     Set Param = Cmd.CreateParameter("MyServerDate", adDate, adParamOutput)
    Cmd.Parameters.Append Param
    '//------------------- Parameter ที่ส่ง -------------------
    MyServerDate คือชื่อตัวแปรที่เราตั้งเอง ไม่จำเป็นต้องตรงกับใน StoreProcedure
    adDate เป็นตัวแปรแบบ Date ต้องตรงกับใน StroeProcedure
    adParamOutput เป็นการกำหนดแบบ Output Parameter
    สำหรับการใช้ Input Parameter ให้กำหนดดังนี้
    Set Param = Cmd.CreateParameter("MyChar", adVarChar, adParamInput,50,"ค่าที่ส่ง")
    Cmd.Parameters.Append Param

    '//------------------- Parameter ที่ส่ง -------------------
    MyChar คือชื่อตัวแปรที่เราตั้งเอง ไม่จำเป็นต้องตรงกับใน StoreProcedure
    adVarChar เป็นตัวแปรแบบ Date ต้องตรงกับใน StroeProcedure
    adParamInput เป็นการกำหนดแบบ Input Parameter
      50 เป็นความยาวตัวอักษร
      "ค่าที่ส่ง" เป็นค่าที่ส่งไป หรือ เป็นชื่อตัวแปรก็ได้

เมื่อ Execute แล้วจะได้ค่า Parameter ส่งมาที่ Cmd.Parameters(0) ดังอย่าง
    MsgBox Format(Cmd.Parameters(0), "dd mmm yyyy")
หรือ
    MsgBox Format(Cmd.Parameters("MyServerDate").Value, "dd mmm yyyy")
 

หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ HTML วิธีทำสร้าง Shortcut บน Desktop ปัญหาใหญ่ของ Data transfer