1. ดำเนินการเข้าถึงฐานข้อมูลใน DELPHI (สร้างไฟล์ .mdb, บีบอัดฐานข้อมูล)
รหัสต่อไปนี้ผ่านการทดสอบภายใต้ WIN2K, D6, MDAC2.6,
โปรแกรมที่คอมไพล์รันได้สำเร็จในเวอร์ชันที่สองของ WIN98 โดยไม่มีสภาพแวดล้อม ACCESS
//ก่อนใช้ ComObj,ActiveX
//ประกาศสตริงการเชื่อมต่อ
คอนสตรัคชั่น
SConnectionString = 'PRovider=Microsoft.Jet.OLEDB.4.0;แหล่งข้อมูล=%s;'
+'เจ็ท OLEDB:รหัสผ่านฐานข้อมูล=%s;';
//================================================ =============================
// ขั้นตอน: GetTempPathFileName
//ผู้เขียน: ไย
// วันที่: 27-01-2546
// อาร์กิวเมนต์: (ไม่มี)
// ผลลัพธ์: string
//================================================ =============================
ฟังก์ชัน GetTempPathFileName():สตริง;
//รับชื่อไฟล์ชั่วคราว
var
SPAth, SFile: อาร์เรย์ [0..254] ของถ่าน;
เริ่ม
GetTempPath(254,สปาธ);
GetTempFileName(SPath,'~SM',0,SFile);
ผลลัพธ์:=SFile;
DeleteFile(PChar(ผลลัพธ์));
จบ;
//================================================ =============================
// ขั้นตอน: CreateAccessFile
//ผู้เขียน: ไย
// วันที่: 27-01-2546
// อาร์กิวเมนต์: FileName:String;PassWord:string=''
// ผลลัพธ์: บูลีน
//================================================ =============================
ฟังก์ชั่น CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//สร้างไฟล์ Access หากไฟล์นั้นมีอยู่จะล้มเหลว
var
STempFileName: สตริง;
vCatalog:OleVariant;
เริ่ม
STempFileName:=GetTempPathFileName;
พยายาม
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(รูปแบบ(SConnectionString,[STempFileName,รหัสผ่าน]));
ผลลัพธ์:=CopyFile(PChar(STempFileName),PChar(ชื่อไฟล์),True);
DeleteFile(STempFileName);
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
//================================================ =============================
// ขั้นตอน: CompactDatabase
//ผู้เขียน: ไย
// วันที่: 27-01-2546
// อาร์กิวเมนต์: AFileName,APassWord:string
// ผลลัพธ์: บูลีน
//================================================ =============================
ฟังก์ชัน CompactDatabase (AFileName, APassWord: string): บูลีน;
//บีบอัดและซ่อมแซมฐานข้อมูล เขียนทับไฟล์ต้นฉบับ
var
STempFileName: สตริง;
vJE:OleVariant;
เริ่ม
STempFileName:=GetTempPathFileName;
พยายาม
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(รูปแบบ(SConnectionString,[AFileName,APassWord]),
รูปแบบ(SConnectionString,[STempFileName,APassWord]));
ผลลัพธ์:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
//================================================ =============================
// ขั้นตอน: ChangeDatabasePassword
//ผู้เขียน: ไย
// วันที่: 27-01-2546
// อาร์กิวเมนต์: AFileName,AOldPassWord,ANewPassWord:string
// ผลลัพธ์: บูลีน
//================================================ =============================
ฟังก์ชัน ChangeDatabasePassword (AFileName, AOldPassWord, ANewPassWord: string): บูลีน;
//แก้ไขรหัสผ่านฐานข้อมูล ACCESS
var
STempFileName: สตริง;
vJE:OleVariant;
เริ่ม
STempFileName:=GetTempPathFileName;
พยายาม
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(รูปแบบ(SConnectionString,[AFileName,AOldPassWord]),
รูปแบบ(SConnectionString,[STempFileName,ANewPassWord]));
ผลลัพธ์:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
2. สิ่งที่คุณควรใส่ใจและเคล็ดลับบางประการเมื่อใช้คำสั่ง SQL ใน ACCESS
คำสั่ง SQL ต่อไปนี้ผ่านการสอบถามใน ACCESS XP
สร้างตาราง:
สร้างตาราง Tab1 (
เคาน์เตอร์ประจำตัวประชาชน
สตริงชื่อ
จำนวนเต็มอายุ
[วันที่] วันที่และเวลา);
ทักษะ:
ฟิลด์การเพิ่มอัตโนมัติจะถูกประกาศด้วยตัวนับ
ช่องที่มีชื่อช่องเป็นคีย์เวิร์ดจะอยู่ในวงเล็บเหลี่ยม [] และตัวเลขก็สามารถใช้เป็นชื่อช่องได้เช่นกัน
สร้างดัชนี:
คำสั่งต่อไปนี้จะสร้างดัชนีที่ทำซ้ำได้บนคอลัมน์ Date ของ Tab1
สร้างดัชนี iDate บน Tab1 ([วันที่]);
หลังจากเสร็จสิ้น แอ็ตทริบิวต์ดัชนีวันที่ของฟิลด์ใน ACCESS จะแสดงเป็น - ใช่ (ซ้ำกัน)
คำสั่งต่อไปนี้สร้างดัชนีที่ไม่สามารถทำซ้ำได้ในคอลัมน์ชื่อของ Tab1
สร้างดัชนีที่ไม่ซ้ำ iName บน Tab1 (ชื่อ);
หลังจากเสร็จสิ้น คุณลักษณะดัชนีของฟิลด์ชื่อใน ACCESS จะแสดงเป็น - ใช่ (ไม่มีการทำซ้ำ)
คำสั่งต่อไปนี้จะลบดัชนีทั้งสองที่เพิ่งสร้างขึ้น
วางดัชนี iDate บน Tab1;
วางดัชนี iName บน Tab1;
การเปรียบเทียบคำสั่ง ACCESS และ UPDATE ใน SQLSERVER:
คำสั่ง UPDATE เพื่ออัพเดตหลายตารางใน SQLSERVER:
อัปเดตแท็บ 1
SET ก.ชื่อ = ข.ชื่อ
จาก Tab1 a,Tab2 b
โดยที่ a.ID = b.ID;
คำสั่ง SQL ที่มีฟังก์ชันเดียวกันใน ACCESS ควรเป็น
อัปเดต Tab1 a, Tab2 b
SET ก.ชื่อ = ข.ชื่อ
โดยที่ a.ID = b.ID;
นั่นคือ: คำสั่ง UPDATE ใน ACCESS ไม่มีส่วนคำสั่ง FROM และตารางที่อ้างอิงทั้งหมดจะแสดงรายการหลังคีย์เวิร์ด UPDATE
ในตัวอย่างข้างต้น ถ้า Tab2 ไม่ใช่ตาราง แต่เป็นแบบสอบถาม เช่น:
อัปเดต Tab1 a, (เลือก ID, ชื่อจาก Tab2) b
SET ก.ชื่อ = ข.ชื่อ
โดยที่ a.ID = b.ID;
เข้าถึงฐานข้อมูล ACCESS ที่แตกต่างกันหลายแห่ง - ใช้คำสั่ง In ใน SQL:
เลือก a.*,b.* จาก Tab1 a,Tab2 b ใน 'db2.mdb' โดยที่ a.ID=b.ID;
คำสั่ง SQL ข้างต้นสอบถามบันทึกทั้งหมดที่เกี่ยวข้องกับ Tab2 ใน Tab1 และ db2.mdb (ในโฟลเดอร์ปัจจุบัน) ในฐานข้อมูลปัจจุบัน
ข้อเสีย - ฐานข้อมูลภายนอกไม่สามารถมีรหัสผ่านได้
ภาคผนวก: ฉันเห็นคำตอบของ ugvanxk ในโพสต์และสามารถใช้งานได้
เลือก * จาก [c:/aa/a.mdb;pwd=1111].table1;
ผ่านการทดสอบ ACCESS XP
เข้าถึงแหล่งข้อมูล ODBC อื่นๆ ใน ACCESS
ตัวอย่างต่อไปนี้สอบถามข้อมูลใน SQLSERVER ใน ACCESS
เลือก * จาก Tab1 ใน [ODBC]
[ODBC;ไดรเวอร์=เซิร์ฟเวอร์ SQL;UID=sa;PWD=;เซิร์ฟเวอร์=127.0.0.1;DataBase=สาธิต;]
พารามิเตอร์ที่สมบูรณ์ของคุณสมบัติการเชื่อมต่อแหล่งข้อมูลภายนอกคือ:
[ODBC; DRIVER = ไดรเวอร์; เซิร์ฟเวอร์ = เซิร์ฟเวอร์; ฐานข้อมูล = ฐานข้อมูล; UID = ผู้ใช้; PWD = รหัสผ่าน;]
DRIVER=driver สามารถพบได้ในรีจิสทรี
HKEY_LOCAL_MACHINE/ซอฟต์แวร์/ODBC/ODBCINST.INI/
พบใน
สำหรับการนำเข้าข้อมูลระหว่างฐานข้อมูลที่แตกต่างกัน โปรดดูที่ Blue Blood Sword
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESS รองรับแบบสอบถามย่อย
ACCESS รองรับการรวมภายนอก แต่จะไม่รวมการรวมภายนอกที่สมบูรณ์ หากได้รับการสนับสนุน
เข้าร่วมทางซ้ายหรือเข้าร่วมทางขวา
แต่ไม่ได้รับการสนับสนุน
เข้าร่วมภายนอกแบบเต็มหรือเข้าร่วมแบบเต็ม
แบบสอบถามวันที่ใน ACCESS
หมายเหตุ: ตัวคั่นวันที่และเวลาใน ACCESS คือ # แทนที่จะเป็นเครื่องหมายคำพูด
เลือก * จาก Tab1 โดยที่ [วันที่]>#2002-1-1#;
ใน DELPHI ฉันใช้สิ่งนี้
SQL.Add(รูปแบบ(
'เลือก * จาก Tab1 โดยที่ [วันที่]>#%s#;',
[DateToStr(วันที่)]));
สตริงใน ACCESS สามารถคั่นด้วยเครื่องหมายคำพูดคู่ได้ แต่ SQLSERVER ไม่รู้จักสตริงเหล่านั้น ดังนั้นเพื่อความสะดวกในการย้ายและความเข้ากันได้
ขอแนะนำให้ใช้เครื่องหมายคำพูดเดี่ยวเป็นตัวคั่นสตริง