ในฐานะผู้ชื่นชอบ ASP ฉันมักจะใช้ออบเจ็กต์ ADO ในหน้า ASP เพื่อดำเนินการฐานข้อมูล ODBC ฉันรู้สึกว่าการใช้ ASP เพื่อสร้างระบบแอปพลิเคชันเว็บนั้นสะดวกมาก แม้ว่าในอาชีพการเขียนโปรแกรมของฉัน ผู้เขียนชอบผลิตภัณฑ์ซีรีส์ Borland และค่อนข้างน่ารังเกียจสำหรับผลิตภัณฑ์ของ Microsoft แต่มีข้อยกเว้นคือ ASP วันหนึ่ง ฉันมีความคิดขึ้นมาว่า ADO object เป็น OLE object มาตรฐาน คงจะดีไม่น้อยหากสามารถใช้ ADO เพื่อดำเนินการฐานข้อมูลในแอปพลิเคชัน DELPHI โดยเฉพาะอย่างยิ่งเมื่อใช้ DELPHI เป็นแอปพลิเคชันฐานข้อมูลเครือข่าย หากไซต์ WEB เป็นไซต์ WINNT และรองรับเพจ ASP คุณสามารถใช้ออบเจ็กต์ ADO เพื่อเข้าถึงฐานข้อมูล ODBC โดยไม่ต้องอัปโหลด BDE ขนาดใหญ่ดังกล่าวไปยังไซต์ เพื่อให้คุณสามารถใช้ออบเจ็กต์ ADO ได้อย่างเต็มที่ ข้อดีของการเขียนโปรแกรมของ DELPHI และ ASP เพื่อทำให้ ISAPI/NSAPI/CGI ดีขึ้น
----หลังจากการเขียนโปรแกรมและการทดสอบ คุณสามารถใช้ออบเจ็กต์ ADO เพื่อเข้าถึงฐานข้อมูล ODBC ใน DELPHI ได้สำเร็จ ตอนนี้ฉันจะเขียนประสบการณ์และแบ่งปันกับคุณ ให้เรามีวิธีอื่นในการเข้าถึงฐานข้อมูล ODBC
---- ใน DELPHI 32 บิต คุณสามารถประกาศตัวแปรตัวแปร (เช่น AVariant) จากนั้นสร้างอ็อบเจ็กต์ OLE ผ่าน CreateOleObject เช่น AVariant:=CreateOleObject('ADODB.Connection') เพื่อรับอินสแตนซ์ของ วัตถุการเชื่อมต่อฐานข้อมูล จากนั้นคุณสามารถใช้วิธีการและคุณสมบัติของวัตถุเพื่อดำเนินการฐานข้อมูล ODBC
----ต่อไปนี้เป็นการแนะนำโดยย่อเกี่ยวกับวัตถุ ADO ที่ใช้ในการเข้าถึงฐานข้อมูล ODBC และวิธีการและคุณสมบัติ
---- 1. วัตถุการเชื่อมต่อฐานข้อมูล (ADODB.Connection)
---- ออบเจ็กต์นี้ใช้เพื่อสร้างการเชื่อมต่อกับฐานข้อมูล ODBC และการดำเนินการทั้งหมดในฐานข้อมูลจะดำเนินการผ่านการเชื่อมต่อนี้
---- วัตถุการเชื่อมต่อฐานข้อมูล ADODB.Connection ทำหน้าที่เหมือนกับวัตถุ TDatabase ใน Delphi
---- วิธีการสร้างวัตถุการเชื่อมต่อคือ (AConnection เป็นตัวแปรประเภท Variant):
---- AConnection:=CreateOleObject('ADODB.Connection')
---- วิธีการที่ใช้ในการสร้างการเชื่อมต่อคือ เปิด และไวยากรณ์การใช้งานคือ (ใช้วัตถุ AConnection เป็นตัวอย่าง):
---- AConnection.Open (สตริงการเชื่อมต่อ, รหัสผู้ใช้, รหัสผ่าน)
----พารามิเตอร์ทั้งสามนี้เป็นประเภทสตริงทั้งหมด โดยที่ UserId และรหัสผ่านคือชื่อผู้ใช้และรหัสผ่านที่ใช้ในการเข้าถึง
---- ใช้ในฐานข้อมูลสามารถละเว้นได้เนื่องจากสามารถระบุชื่อผู้ใช้และรหัสผ่านผู้ใช้ใน ConnectionString ได้เช่นกัน ConnectionString เป็นสตริงที่ใช้อธิบายข้อมูลแหล่งข้อมูล ODBC รูปแบบคือ:
'PRovider=ProviderName;DSN=DSNName;DRIVER=ไดรเวอร์; SERVER=เซิร์ฟเวอร์; DATABASE=ฐานข้อมูล; PWD=รหัสผ่าน'
---- ใน:
---- ผู้ให้บริการ: ผู้ให้บริการข้อมูล ค่าเริ่มต้นคือ MSDASQL คือ Microsoft OLEDB ซึ่งมักจะละไว้
---- DSN: แหล่งข้อมูลระบบ OBDC (DSN) ที่สอดคล้องกับฐานข้อมูลที่จะเปิด ซึ่งเป็นพารามิเตอร์ทางเลือก
---- DRIVER: ชื่อไดรเวอร์ที่ใช้สำหรับฐานข้อมูลที่จะเปิด เช่น การเข้าถึงที่เกี่ยวข้อง
----Microsoft Access Driver(*.mdb) เป็นพารามิเตอร์ทางเลือก
---- เซิร์ฟเวอร์: ชื่อของเซิร์ฟเวอร์ที่ฐานข้อมูลที่จะเปิดตั้งอยู่ มีอยู่ในเครื่องนี้ (ในตัวเครื่อง) และเป็นพารามิเตอร์ทางเลือก
---- DATABASE: ชื่อของฐานข้อมูลที่จะเปิด ซึ่งเป็นพารามิเตอร์ทางเลือก
---- UID: ชื่อผู้ใช้ที่ใช้ในการเข้าถึงฐานข้อมูลเป็นพารามิเตอร์ทางเลือก
----PWD: รหัสผ่านผู้ใช้ที่ใช้ในการเข้าถึงฐานข้อมูลเป็นพารามิเตอร์ทางเลือก
---- พารามิเตอร์ข้างต้นเป็นพารามิเตอร์ทางเลือกทั้งหมด แต่ต้องมีข้อมูลที่เพียงพอเพื่ออธิบายแหล่งข้อมูลของระบบ
---- หากมีการกำหนด DSN ของระบบ ODBC ชื่อ MyDsn คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างการเชื่อมต่อฐานข้อมูล:
-
AConnection.Open('DSN=MyDsn');
---- เพื่อป้องกันข้อผิดพลาดในการทำงานเมื่อไม่มี DSN หรือมีการแก้ไขการตั้งค่าโดยผู้อื่น คุณสามารถใช้ ADODB.Connection เพื่อสร้างแหล่งข้อมูล ODBC ชั่วคราวได้ ซึ่งจะช่วยให้มั่นใจได้ว่าการตั้งค่าพารามิเตอร์ของ DSN ของระบบ เราใช้ถูกต้อง คำสั่งต่อไปนี้สามารถสร้าง DSN ระบบ ODBC ชั่วคราวซึ่งสอดคล้องกับฐานข้อมูล ACCESS ซึ่งเป็นเส้นทาง
C:Inetpubwwwrootest.mdb AConnection.open('ไดรเวอร์={ไดรเวอร์ Microsoft Access (*.mdb)};DBQ=C:inetpubwwwrootest.mdb')
---- หลังจากสร้าง ADODB.Connection แล้ว หากคุณไม่ต้องการส่งคืนผลการดำเนินการ (เช่น การลบ การแก้ไข การอัปเดต ฯลฯ) คุณสามารถดำเนินการ SQL ปกติบนฐานข้อมูลได้ ในขณะนี้ ให้ใช้อย่างอื่น วิธีดำเนินการ ADODB.Connection ไวยากรณ์การใช้งานคือ:
AConnection.Execute( strSQL );
---- ในหมู่พวกเขา strSQL คือคำสั่ง SQL เพื่อดำเนินการ ตัวอย่างเช่น การดำเนินการลบสามารถ: ลบจาก wfjcommu ใช้ AConnection.Close เพื่อปิดการเชื่อมต่อฐานข้อมูล
---- 2. ออบเจ็กต์ชุดข้อมูล (ADODB.RecordSet)
---- หากคุณต้องการดำเนินการสืบค้นและส่งกลับผลลัพธ์การสืบค้น หรือหากคุณต้องการใช้งานตารางข้อมูลได้สะดวกยิ่งขึ้น คุณต้องใช้อ็อบเจ็กต์ชุดข้อมูล
---- วัตถุชุดข้อมูล ADODB.RecordSet ทำหน้าที่เหมือนกับวัตถุ TTable หรือ TQuery ใน Delphi
---- วิธีการสร้างวัตถุชุดข้อมูลคือ (ARecordSet เป็นตัวแปรประเภทตัวแปร):
-
ARecordSet:=CreateOleObject('ADODB.RecordSet')
---- วิธีการรับข้อมูลจากตารางข้อมูลคือวิธี Open โดยมีวิธีการใช้งานเฉพาะดังนี้
ARecordSet.Open( strCommand,ActiveConnection,intCursorType,intLockType,intCommandType);
---- ในหมู่พวกเขา: strCommand: string ซึ่งเป็นพารามิเตอร์คำสั่ง อาจเป็นชื่อตาราง คำสั่ง SQL หรือชื่อขั้นตอนที่เก็บไว้ (StoredProc) บนเซิร์ฟเวอร์ จำเป็นต้องระบุพารามิเตอร์เฉพาะ intCommandType
---- ActiveConnection: การเชื่อมต่อฐานข้อมูลที่จะใช้คือวัตถุ ADODB.Connection
---- intCursorType: จำนวนเต็มยาว, ประเภทเคอร์เซอร์ของชุดข้อมูล, พารามิเตอร์เสริม โปรดดูความคิดเห็นในโปรแกรม
---- intLockType: จำนวนเต็มยาว, ประเภทการล็อคของตารางข้อมูล, พารามิเตอร์เสริม โปรดดูความคิดเห็นในโปรแกรม
---- intCommandType: จำนวนเต็มยาว ประเภทของพารามิเตอร์คำสั่ง ใช้เพื่อระบุบทบาทของ strCommand คุณสามารถระบุ strCommand เป็นคำสั่ง (เช่น คำสั่ง SQL) หรือตารางข้อมูล (TTable) หรือขั้นตอนการจัดเก็บ (StoredProc) สำหรับพารามิเตอร์เสริม โปรดดูความคิดเห็นในโปรแกรม
---- หากคุณดำเนินการสืบค้น SQL คุณสามารถใช้คำสั่งต่อไปนี้:
ARecordSet.Open('เลือก * จาก wfjcommu',adOpenStatic,adLockOptimistic,adCmdText);
---- คุณสมบัติและวิธีการทั่วไปอื่น ๆ เมื่อเทียบกับ TTable และ TQuery มีดังนี้ (ดูรายละเอียดในไฟล์วิธีใช้ ASP):
อีฟ,โบฟ: อีฟ,บอฟ. MoveFirst, MoveLast: ก่อน, LastMovePrevious, MoveNext: ก่อน, NextMove: MoveByAddNew: ผนวกอัปเดต: PostClose: ปิด
---- Delete plus Update : ลบ การแก้ไขตารางข้อมูลทั้งหมดต้องใช้ Update เพื่อให้การดำเนินการมีประสิทธิภาพ แตกต่างจาก Delphi
ฟิลด์[FieldNo]:ฟิลด์[FieldNo]ฟิลด์['FieldName']:FieldByName('FieldName')
---- 3. วัตถุทั่วไปอื่น ๆ (วัตถุที่สอดคล้องกับ Delphi):
-
ADODB.ฟิลด์: TFieldADODB.พารามิเตอร์: TParaADODB.ข้อผิดพลาด: EDBengineErrorADODB.Command: ไม่มี ADODB.คุณสมบัติ: ไม่มี
---- เรามาดูตัวอย่างการใช้งานกันดีกว่า การฟังสิ่งที่คนอื่นพูดมากกว่าการเห็นตัวอย่างจริงด้วยตัวคุณเอง ในตัวอย่างนี้ เราจะสาธิตวิธีการใช้วัตถุ ADO เพื่อสอบถาม เพิ่มระเบียน แก้ไขระเบียน และลบระเบียนในตารางข้อมูล โปรดดูความคิดเห็นในโปรแกรมสำหรับการใช้งานเฉพาะ หากคุณมีประสบการณ์ในการเขียนโปรแกรมฐานข้อมูล Delphi ฉันเชื่อว่าเข้าใจได้ไม่ยาก
---- ในตัวอย่างของเรา ฐานข้อมูลที่ใช้คือ Test.MDB มีตารางข้อมูลที่เรียกว่า wfjcommu ซึ่งมีห้าฟิลด์: AName, Portable, Tel, BP และ PostAddress ซึ่งแสดงชื่อ หมายเลขโทรศัพท์มือถือ หมายเลขโทรศัพท์ และหมายเลขเพจเจอร์ตามลำดับและที่อยู่ทางจดหมาย
-
ขั้นตอน TForm1.Button1Click(Sender: TObject);{*************************************** *** ****************
---- ใช้ ADO เพื่อดำเนินการฐานข้อมูล ODBC ในโปรแกรมนี้ แหล่งข้อมูลระบบ ODBC ชั่วคราวจะถูกสร้างขึ้น โดยชี้ไปที่ฐานข้อมูล MsAccess จากนั้นตารางข้อมูลในนั้นจะแสดง เพิ่ม แก้ไข ลบ และสอบถาม หมายเหตุ: โปรดคลิกที่ใช้คำสั่งประกอบด้วยหน่วย ComObj
************************************************** * ***}const{ การประกาศคงที่บางส่วน โปรดดูรายละเอียดที่ adovbs.inc }{ ---- คำอธิบายคงที่ของ CommandType---- } adCmdUnknown = 0008;//ไม่ทราบ จำเป็นต้องได้รับการตัดสินจากระบบ ช้า , ค่าเริ่มต้น adCmdText = 0001;//คำสั่ง Command เช่น คำสั่ง SQL adCmdTable = 0002;//ชื่อตารางข้อมูล adCmdStoredProc = 0004;//ชื่อขั้นตอนที่เก็บไว้ {---- คำอธิบายคงที่ของ CursorType---- } adOpenForwardOnly = 0;//สามารถเข้าถึงได้ในทิศทางเดียวเท่านั้นจากด้านหน้าไปด้านหลัง ซึ่งก็คือ ค่าเริ่มต้น adOpenKeyset = 1; // การแก้ไขข้อมูลโดยผู้ใช้รายอื่นจะมองเห็นได้ แต่การเพิ่มและการลบโดยผู้ใช้รายอื่นจะไม่สามารถมองเห็นได้ adOpenDynamic = 2;//การเพิ่ม การแก้ไข และการลบข้อมูลโดยผู้ใช้รายอื่นจะมองเห็นได้ adOpenStatic = 3;//การเพิ่ม การแก้ไข และการลบข้อมูลโดยผู้ใช้รายอื่นจะไม่สามารถมองเห็นได้ {---- คำอธิบายคงที่ของ LockType---} adLockReadOnly = 1; // อ่านอย่างเดียว ค่าเริ่มต้น adLockPessimistic = 2; // เมื่อแก้ไข ให้ล็อคตามบันทึกเดียว adLockOptimistic = 3;//ล็อคโดยบันทึกเดียวเมื่ออัปเดตหลังจากแก้ไข adLockBatchOptimistic = 4;//ล็อคบันทึกเมื่ออัปเดตเป็นชุด var AConnection, ARecordSet: variety; longintTemp: integer; intIndex: integer;begin {Create a Temporary แหล่งข้อมูล ODBC ชี้ไปที่ฐานข้อมูล MsAccess และใช้ DSN นี้เพื่อสร้างการเชื่อมต่อฐานข้อมูล} AConnection := CreateOleObject('ADODB.Connection'); AConnection.Open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwrootest'); {สร้างวัตถุชุดข้อมูลและแยกข้อมูลจากตารางข้อมูล} ARecordSet := CreateOleObject('ADODB.RecordSet'); ARecordSet.open( 'wfjcommu',AConnection, adOpenStatic,adLockOptimistic,adCmdTable ); memo1.lines.clear; memo1.lines.add('********เนื้อหาต้นฉบับของตารางข้อมูลมีดังนี้********'); แสดงชื่อโดเมนแต่ละฟิลด์} strTemp := ' สำหรับ intIndex := 0 ถึง ARecordSet.Fields.count - 1 do strTemp := strTemp + ARecordSet.Fields[intIndex].name+';'; memo1.lines.add( strTemp ); {แสดงเนื้อหาของแต่ละฟิลด์} ในขณะที่ไม่ใช่ ARecordSet.eof จะเริ่มต้น strTemp := '; . นับ - 1 ทำ strTemp := strTemp + ARecordSet.Fields [intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext;//ย้ายไปที่บรรทัดถัดไป, ถัดไป; {Add a record} ARecordSet.AddNew;//เพิ่ม, ผนวก ARecordSet.Fields [ 'AName'] := '1'; //เข้าถึง ARecordSet.Fields['Portable'] โดยใช้ FieldByName := '2'; ARecordSet.Fields(2) := '3'; //Access ARecordSet.Fields(3) := '4'; ARecordSet.Fields(4) := '5' ในรูปแบบของฟิลด์ ; ARecordSet.Update;//Update, โพสต์ ARecordSet.MoveFirst;//ย้ายไปที่รายการแรกก่อน memo1.lines.add('********เนื้อหาของตารางข้อมูลหลังจากเพิ่มบันทึกจะเป็นดังนี้********'); {แสดงเนื้อหาของแต่ละฟิลด์} ในขณะที่ไม่ใช่ ARecordSet .eof เริ่ม strTemp := ';สำหรับ intIndex := 0 ถึง ARecordSet Fields.count - 1 ทำ strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext; // ย้ายไปยังบันทึกถัดไป สิ้นสุดถัดไป; 'พกพา'] := '22'; ARecordSet.Fields(2) := '33'; //เข้าถึง ARecordSet.Fields(3) เป็นฟิลด์ [ดัชนี] := '44'; ARecordSet.Fields(4) := '55'; ARecordSet.Update;// อัปเดต, โพสต์ ARecordSet.MoveFirst;// ย้ายไปที่ รายการแรก First memo1.lines.add('********เนื้อหาของตารางข้อมูลหลังจากแก้ไขบันทึกล่าสุดมีดังนี้************'); {Display เนื้อหาของแต่ละฟิลด์ } ในขณะที่ไม่ใช่ ARecordSet.eof จะเริ่มต้น strTemp := ';สำหรับ intIndex := 0 ถึง ARecordSet.Fields.count - 1 ถึง strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext;//ย้ายไปยังระเบียนถัดไป สิ้นสุดถัดไป; ARecordSet.MoveLast;//ย้ายไปที่บรรทัดสุดท้าย Last ARecordSet.delete;//ลบ, ลบ ARecordSet.Update;//อัปเดต, ไม่จำเป็นใน Delphi ARecordSet.MoveFirst;//ย้ายไปที่บรรทัดแรก, First memo1.lines .add ('*********เนื้อหาของตารางข้อมูลหลังจากลบบันทึกล่าสุดมีดังนี้********'); {แสดงเนื้อหาของแต่ละฟิลด์} ในขณะที่ไม่ใช่ ARecordSet.eof เริ่มต้นเลย strTemp := '; สำหรับ intIndex := 0 ถึง ARecordSet.Fields.count - 1 ทำ strTemp := strTemp + ARecordSet. Fields[intIndex].value+';';memo1.lines.add( strTemp ); /ย้ายไปที่แถบถัดไป ถัดไปสุด ARecordSet.Close;{ปิดชุดข้อมูล} {ใช้คำสั่ง SQL เพื่อสอบถาม บันทึกการสืบค้นชื่อ "Zhang San"} {โปรดทราบว่าในคำสั่ง SQL สตริงควรอยู่ในเครื่องหมายคำพูดเดี่ยว} ARecordSet.open( 'select * from wfjcommu โดยที่ AName = 'Zhang San' ', AConnection,adOpenStatic,adLockOptimistic, adCmdText ); memo1.lines.add('********เนื้อหาของจางซานมีดังต่อไปนี้********'); + IntToStr ( ARecordSet.RecordCount ) + 'matching records' ); {แสดงเนื้อหาของแต่ละฟิลด์} ในขณะที่ไม่ใช่ ARecordSet.eof จะเริ่มต้น strTemp := '; = strTemp + ARecordSet.Fields [intIndex].value+';';memo1.lines.add( strTemp ); ARecordSet.MoveNext;// ย้ายไปที่แถบถัดไป สิ้นสุดถัดไป; {ปิดชุดข้อมูลและการเชื่อมต่อฐานข้อมูล} AConnection.close; end;