ใช้วัตถุ ADO เพื่อเข้าถึงข้อมูล ODBC ในโปรแกรม DELPHI
-------------------------------------------------- -------------------------------------------------- ----------------------------------
ในฐานะผู้ที่ชื่นชอบ ASP ฉันมักจะใช้ออบเจ็กต์ ADO ในหน้า ASP เพื่อดำเนินการฐานข้อมูล ODBC ฉันรู้สึกว่าการใช้ ASP เพื่อสร้างระบบแอปพลิเคชันเว็บนั้นสะดวกมาก แม้ว่าในอาชีพการเขียนโปรแกรมของฉัน ผู้เขียนชอบผลิตภัณฑ์ซีรีส์ Borland และค่อนข้างน่ารังเกียจสำหรับผลิตภัณฑ์ของ Microsoft แต่ฉันก็เป็นข้อยกเว้นสำหรับ ASP วันหนึ่ง จู่ๆ ก็เกิดขึ้นกับฉันว่าวัตถุ ADO เป็นวัตถุ OLE มาตรฐาน จะดีมากหากสามารถใช้ ADO เพื่อดำเนินการฐานข้อมูลในแอปพลิเคชัน Delphi โดยเฉพาะอย่างยิ่งเมื่อใช้ DELPHI เป็นแอปพลิเคชันฐานข้อมูลเครือข่าย หากเว็บไซต์เป็นไซต์ WINNT และรองรับเพจ ASP คุณสามารถใช้ออบเจ็กต์ ADO เพื่อเข้าถึงฐานข้อมูล ODBC โดยไม่ต้องอัปโหลด BDE ขนาดใหญ่ดังกล่าวไปยังไซต์ ด้วยวิธีนี้ คุณสามารถใช้ประโยชน์จากข้อได้เปรียบด้านการเขียนโปรแกรมของ 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 การเชื่อมต่อทำหน้าที่เหมือนกับวัตถุ TDatabase ใน Delphi
วิธีสร้างวัตถุการเชื่อมต่อคือ (AConnection เป็นตัวแปรประเภท Variant):
AConnection:=CreateOleObject('A DODB.การเชื่อมต่อ')
วิธีการที่ใช้ในการสร้างการเชื่อมต่อคือ เปิด และไวยากรณ์การใช้งานคือ (นำออบเจ็กต์ AConnection เป็นตัวอย่าง):
AConnection.Open( สตริงการเชื่อมต่อ, รหัสผู้ใช้, รหัสผ่าน )
พารามิเตอร์ทั้งสามตัวเป็นประเภทสตริงทั้งหมด โดยที่ UserId และรหัสผ่านคือชื่อผู้ใช้และรหัสผ่านผู้ใช้ ซึ่งสามารถละเว้นได้เมื่อใช้ในการเข้าถึงฐานข้อมูล เนื่องจากสามารถระบุชื่อผู้ใช้และรหัสผ่านผู้ใช้ใน ConnectionString ได้เช่นกัน ConnectionString เป็นสตริงที่ใช้อธิบายข้อมูลแหล่งข้อมูล ODBC รูปแบบคือ:
'PRovider=ชื่อผู้ให้บริการ; DSN=DSNName; เซิร์ฟเวอร์=เซิร์ฟเวอร์; ฐานข้อมูล=; UID=รหัสผ่าน'
ใน:
ผู้ให้บริการ: ผู้ให้บริการข้อมูล, MSDASQL ตามค่าเริ่มต้น, Microsoft OLEDB มักจะละเว้น
DSN: แหล่งข้อมูลระบบ OBDC (DSN) ที่สอดคล้องกับฐานข้อมูลที่จะเปิดเป็นพารามิเตอร์ทางเลือก
ไดรเวอร์: ชื่อของไดรเวอร์ที่ใช้ในฐานข้อมูลที่จะเปิด เช่น การเข้าถึงที่สอดคล้องกับ Microsoft Access Driver (*.mdb) ซึ่งเป็นพารามิเตอร์ทางเลือก
เซิร์ฟเวอร์: ชื่อของเซิร์ฟเวอร์ที่ฐานข้อมูลที่จะเปิดตั้งอยู่ มีอยู่ในเครื่องนี้ (ในเครื่อง) และเป็นพารามิเตอร์ทางเลือก
DATABASE: ชื่อของฐานข้อมูลที่จะเปิด ซึ่งเป็นพารามิเตอร์ทางเลือก
UID: ชื่อผู้ใช้ที่ใช้ในการเข้าถึงฐานข้อมูลเป็นพารามิเตอร์ทางเลือก
PWD: รหัสผ่านผู้ใช้ที่ใช้ในการเข้าถึงฐานข้อมูลเป็นพารามิเตอร์ทางเลือก
พารามิเตอร์ข้างต้นเป็นทางเลือก แต่ต้องมีข้อมูลที่เพียงพอเพื่ออธิบายแหล่งข้อมูลของระบบ
หากมีการกำหนด DSN ของระบบ ODBC และชื่อ MyDsn คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างการเชื่อมต่อฐานข้อมูล:
AConnection.Open('DSN=MyDsn');
เพื่อป้องกันข้อผิดพลาดในการทำงานเมื่อไม่มี DSN หรือมีการแก้ไขการตั้งค่าโดยผู้อื่น คุณสามารถใช้ ADODB.Connection เพื่อสร้างแหล่งข้อมูล ODBC ชั่วคราวได้ ซึ่งจะช่วยให้มั่นใจได้ว่าการตั้งค่าพารามิเตอร์ของระบบ DSN ที่เราใช้นั้นถูกต้อง . คำสั่งต่อไปนี้สามารถสร้าง DSN ระบบ ODBC ชั่วคราว ซึ่งสอดคล้องกับฐานข้อมูล ACCESS เส้นทางคือ C:Inetpub wwwroot test.mdb:
AConnection.open('ไดรเวอร์= {ไดรเวอร์ Microsoft Access (*.mdb)};DBQ=C:inetpub wwwroot est.mdb')
หลังจากสร้าง ADODB.Connection แล้ว หากไม่จำเป็นต้องส่งคืนผลการดำเนินการ (เช่น การลบ การแก้ไข การอัปเดต ฯลฯ) คุณสามารถดำเนินการ SQL ปกติบนฐานข้อมูลได้ ในขณะนี้ ADODB.Connection เป็นอีกวิธีหนึ่ง , Execute ถูกใช้
AConnection.Execute( strSQL );
ในหมู่พวกเขา strSQL คือคำสั่ง SQL เพื่อดำเนินการ ตัวอย่างเช่น การดำเนินการลบอาจเป็น: ลบออกจาก wfjcommu ใช้ AConnection.Close เพื่อปิดการเชื่อมต่อฐานข้อมูล
2. วัตถุชุดข้อมูล (ADODB. RecordSet)
หากคุณต้องการดำเนินการคิวรีและส่งกลับผลลัพธ์คิวรี หรือหากคุณต้องการใช้งานตารางข้อมูลได้สะดวกยิ่งขึ้น คุณต้องใช้ออบเจ็กต์ชุดข้อมูล
วัตถุชุดข้อมูล ADODB.RecordSet ทำหน้าที่เหมือนกับวัตถุ TTable หรือ TQuery ใน Delphi
วิธีการสร้างวัตถุชุดข้อมูลคือ (ARecordSet เป็นตัวแปรชนิดตัวแปร):
ARecordSet:=CreateOleObject ('ADODB.RecordSet')
วิธีการรับข้อมูลจากตารางข้อมูลคือวิธีเปิด
ARecordSet.Open( strCommand,ActiveConnection,int CursorType,intLockType, intCommandType);
ใน:
strCommand: สตริง ซึ่งเป็นพารามิเตอร์คำสั่ง อาจเป็นชื่อตาราง คำสั่ง SQL หรือชื่อกระบวนงานที่เก็บไว้ (StoredProc) บนเซิร์ฟเวอร์ จำเป็นต้องระบุพารามิเตอร์เฉพาะโดยพารามิเตอร์ต่อไปนี้ intCommandType
ActiveConnection: การเชื่อมต่อฐานข้อมูลที่จะใช้คือวัตถุการเชื่อมต่อ ADODB
intCursorType: จำนวนเต็มยาว, ประเภทเคอร์เซอร์ของชุดข้อมูล, พารามิเตอร์เสริม โปรดดูความคิดเห็นในโปรแกรม
intLockType: จำนวนเต็มยาว, ประเภทการล็อคของตารางข้อมูล, พารามิเตอร์เสริม โปรดดูความคิดเห็นในโปรแกรม
intCommandType: จำนวนเต็มแบบยาว ประเภทของพารามิเตอร์คำสั่ง ใช้เพื่อระบุบทบาทของ strCommand คุณสามารถระบุ strCommand เป็นคำสั่ง (เช่น คำสั่ง SQL) หรือตารางข้อมูล (TTable) หรือขั้นตอนการจัดเก็บ (StoredProc) สำหรับทางเลือก พารามิเตอร์โปรดดูความคิดเห็นในโปรแกรม
ในการดำเนินการสืบค้น SQL คุณสามารถใช้คำสั่งต่อไปนี้:
ARecordSet.Open('เลือก * จาก wfjcommu',adOpenStatic,ad LockOptimistic,adCmdText);
คุณสมบัติและวิธีการทั่วไปอื่นๆ เมื่อเปรียบเทียบกับ TTable และ TQuery มีดังนี้ (ดูรายละเอียดในไฟล์วิธีใช้ ASP):
อีฟ,โบฟ: อีฟ,บอฟ. MoveFirst, MoveLast: ก่อน, LastMovePrevious, MoveNext: ก่อน, NextMove: MoveByAddNew: ผนวกอัปเดต: PostClose: ปิด
Delete plus Update: ลบ การแก้ไขตารางข้อมูลทั้งหมดต้องใช้ Update เพื่อให้การดำเนินการมีประสิทธิภาพ ซึ่งแตกต่างจาก Delphi
ฟิลด์[หมายเลขฟิลด์]: ฟิลด์[หมายเลขฟิลด์]
ฟิลด์['ชื่อฟิลด์']: FieldByName('ชื่อฟิลด์')
3. วัตถุทั่วไปอื่น ๆ (วัตถุที่สอดคล้องกับ Delphi):
ADODB.ฟิลด์: TField ADODB.พารามิเตอร์: TPara ADODB.ข้อผิดพลาด: EDBEngineError
ADODB.Command: ไม่มี ADODB.Property: ไม่มี
ลองดูตัวอย่างการใช้งาน:
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
{*************************************************** **** ****
ใช้ ADO เพื่อดำเนินการฐานข้อมูล ODBC
ในโปรแกรมนี้ แหล่งข้อมูลระบบ ODBC ชั่วคราวจะถูกสร้างขึ้น โดยชี้ไปที่ฐานข้อมูล MsAccess จากนั้นตารางข้อมูลในนั้นจะแสดง เพิ่ม แก้ไข ลบ และสอบถาม
หมายเหตุ: โปรดรวมหน่วย ComObj ในคำสั่ง Uses
************************************************** * ***}
const{การประกาศคงที่บางประการ โปรดดูรายละเอียดที่ adovbs.inc}
{----คำอธิบายคงที่ของ CommandType----}
adCmdUnknown = 0008;//ไม่ทราบ ต้องได้รับการตัดสินจากระบบ ช้า ค่าเริ่มต้น
adCmdText = 0001;//คำสั่งคำสั่ง เช่น คำสั่ง 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 : ตัวแปร;
longintTemp : จำนวนเต็ม;
strTemp: สตริง;
intIndex : จำนวนเต็ม;
เริ่ม
{สร้างแหล่งข้อมูล ODBC ชั่วคราว ชี้ไปที่ฐานข้อมูล MsAccess และใช้ DSN นี้เพื่อสร้างการเชื่อมต่อฐานข้อมูล}
AConnection := CreateOleObject('ADODB.Connection');
AConnection.Open('Driver={ไดรเวอร์ Microsoft Access (*.mdb)};DBQ=C:inetpubwwwroot est');
{สร้างวัตถุชุดข้อมูลและดึงข้อมูลจากตารางข้อมูล}
ARecordSet := CreateOleObject('ADODB.RecordSet');
ARecordSet.open( 'wfjcommu',AConnection,adOpenStatic,adLockOptimistic,adCmdTable );
memo1.lines.ชัดเจน;
memo1.lines.add('เนื้อหาต้นฉบับของตารางข้อมูล ******** มีดังต่อไปนี้*********');
{แสดงชื่อโดเมนของแต่ละโดเมน}
strTemp := '';
สำหรับ intIndex := 0 ถึง ARecordSet.Fields.count - 1 ทำ
strTemp := strTemp + ARecordSet.Fields[intIndex].ชื่อ+';';
memo1.lines.add( strTemp );
{แสดงเนื้อหาของแต่ละโดเมน}
ในขณะที่ไม่ใช่ ARecordSet.eof ทำ
เริ่ม
strTemp := '';
สำหรับ intIndex := 0 ถึง ARecordSet.Fields.count - 1 ทำ
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//ย้ายไปที่แถบถัดไป ถัดไป
จบ;
{เพิ่มบันทึก}
ARecordSet.AddNew;//เพิ่ม,ผนวก
ARecordSet.Fields['AName'] := '1';//เข้าถึงโดย FieldByName
ARecordSet.Fields['พกพา'] := '2';
ARecordSet.Fields(2) := '3';//เข้าถึงในรูปแบบของ Fields[index]
ARecordSet.Fields(3) := '4';
ARecordSet.Fields(4) := '5';
ARecordSet.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;//ย้ายไปที่แถบถัดไป ถัดไป
จบ;
{แก้ไขบันทึกล่าสุด}
ARecordSet.MoveLast;
ARecordSet.Fields['AName'] := '11';//เข้าถึงโดยใช้ FieldByName
ARecordSet.Fields['พกพา'] := '22';
ARecordSet.Fields(2) := '33';//เข้าถึงในรูปแบบของ Fields[index]
ARecordSet.Fields(3) := '44';
ARecordSet.Fields(4) := '55';
ARecordSet.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;//ย้ายไปที่แถบถัดไป ถัดไป
จบ;
{ลบบันทึกล่าสุด}
ARecordSet.MoveLast;//ย้ายไปที่แถบสุดท้าย Last
ARecordSet.delete;//ลบ ลบ
ARecordSet.Update;//อัปเดต ไม่จำเป็นใน Delphi
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;//ย้ายไปที่แถบถัดไป ถัดไป
จบ;
ARecordSet.Close;{ปิดชุดข้อมูล}
{ใช้คำสั่ง SQL เพื่อสอบถามบันทึกชื่อ "Zhang San"}
{โปรดทราบว่าในคำสั่ง SQL สตริงควรอยู่ในเครื่องหมายคำพูดเดี่ยว}
ARecordSet.open( 'select * from wfjcommu โดยที่ AName = ''Zhang San''',
AConnection,adOpenStatic,adLockOptimistic,adCmdText );
memo1.lines.add('********เนื้อหาของจางซานมีดังต่อไปนี้********');
memo1.lines.add( 'Total' + IntToStr( ARecordSet.RecordCount ) + 'บันทึกที่ตรงกัน' );
{แสดงเนื้อหาของแต่ละโดเมน}
ในขณะที่ไม่ใช่ ARecordSet.eof ทำ
เริ่ม
strTemp := '';
สำหรับ intIndex := 0 ถึง ARecordSet.Fields.count - 1 ทำ
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//ย้ายไปที่แถบถัดไป ถัดไป
จบ;
{ปิดชุดข้อมูลและการเชื่อมต่อฐานข้อมูล}
ARecordSet.ปิด;
AConnection.ปิด;
จบ;
การฟังคนอื่นบอกว่าการได้สัมผัสด้วยตนเองด้วยการดูตัวอย่างจริงจะดีกว่า ในตัวอย่างนี้ เราจะสาธิตวิธีการใช้วัตถุ ADO เพื่อสอบถาม เพิ่มระเบียน แก้ไขระเบียน และลบระเบียนในตารางข้อมูล โปรดดูความคิดเห็นในโปรแกรมสำหรับการใช้งานเฉพาะ หากคุณมีประสบการณ์ในการเขียนโปรแกรมฐานข้อมูล Delphi ฉันเชื่อว่าเข้าใจได้ไม่ยาก
ฐานข้อมูลที่ใช้ในตัวอย่างของเราคือ Test.MDB ซึ่งมีตารางข้อมูลที่เรียกว่า wfjcommu โดยมีห้าฟิลด์ AName, Portable, Tel, BP และ PostAddress ซึ่งแสดงถึงชื่อ หมายเลขโทรศัพท์มือถือ หมายเลขโทรศัพท์ หมายเลขเพจเจอร์ และที่อยู่ทางไปรษณีย์ ตามลำดับ
โปรแกรมข้างต้นได้รับการแก้ไขและส่งต่อภายใต้ PWIN98+ Delphi 3.0+PWS (Personal Web Server) 4.0