หน้าแรก อุปกรณ์ที่ประกอบเป็นเครื่องคอมพิวเตอร์ เกาเหลาเทคนิคการใช้ 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 กันก่อน (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)
|
||||||||
LockType | ประเภทการ
Lock
|
||||||||
Options | เป็นเงื่อนไขการเปิด
|
หมายเหตุ หนังสือไทยบางเล่มอธิบายผิด คืออธิบายว่าเปิดแบบ 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