1. ดำเนินการเข้าถึงฐานข้อมูลใน Delphi (สร้างไฟล์ .mdb บีบอัดฐานข้อมูล)
รหัสต่อไปนี้ได้รับการทดสอบภายใต้ win2k, d6 และ mdac2.6
โปรแกรมที่คอมไพล์รันได้สำเร็จใน win98 เวอร์ชันที่สองโดยไม่มีสภาพแวดล้อมการเข้าถึง
//ก่อนใช้ comobj,activex
//ประกาศสตริงการเชื่อมต่อ
ค่าคงที่
สตริงการเชื่อมต่อ = 'ผู้ให้บริการ=microsoft.jet.oledb.4.0;แหล่งข้อมูล=%s;'
+'jet oledb:รหัสผ่านฐานข้อมูล=%s;';
//================================================ =============================
// ขั้นตอน: gettemppathfilename
// ผู้เขียน: ysai
// วันที่ : 27-01-2003
// อาร์กิวเมนต์: (ไม่มี)
// ผลลัพธ์: string
//================================================ =============================
ฟังก์ชัน gettemppathfilename():string;
//รับชื่อไฟล์ชั่วคราว
var
spath,sfile&:array [0..254] ของถ่าน;
เริ่ม
gettemppath(254,สปาย);
gettempfilename(สปาย,'~sm',0,sfile);
ผลลัพธ์:=sfile;
Deletefile(pchar(ผลลัพธ์));
จบ;
//================================================ =============================
// ขั้นตอน: createaccessfile
// ผู้เขียน: ysai
// วันที่ : 27-01-2003
// อาร์กิวเมนต์: ชื่อไฟล์:string;password:string=''
// ผลลัพธ์: บูลีน
//================================================ =============================
ฟังก์ชั่น createaccessfile (ชื่อไฟล์: string; รหัสผ่าน: string = ''): บูลีน;
//สร้างไฟล์เข้าถึง หากไฟล์นั้นมีอยู่จะล้มเหลว
var
ชื่อไฟล์ต้นกำเนิด:สตริง;
vcatalog:olevariant;
เริ่ม
ชื่อไฟล์ต้นกำเนิด:=gettemppathfilename;
พยายาม
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(รูปแบบ(สตริงการเชื่อมต่อ,[ชื่อไฟล์,รหัสผ่าน]));
ผลลัพธ์:=copyfile(pchar(ชื่อไฟล์),pchar(ชื่อไฟล์),true);
ลบไฟล์(ชื่อไฟล์ชื่อไฟล์);
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
//================================================ =============================
// ขั้นตอน: ฐานข้อมูลขนาดกะทัดรัด
// ผู้เขียน: ysai
// วันที่ : 27-01-2003
// อาร์กิวเมนต์: afilename,apasword:string
// ผลลัพธ์: บูลีน
//================================================ =============================
ฟังก์ชั่นฐานข้อมูลขนาดกะทัดรัด (ชื่อไฟล์, รหัสผ่าน: สตริง): บูลีน;
//บีบอัดและซ่อมแซมฐานข้อมูล เขียนทับไฟล์ต้นฉบับ
var
ชื่อไฟล์ต้นกำเนิด:สตริง;
vje:Olevariant;
เริ่ม
ชื่อไฟล์ต้นกำเนิด:=gettemppathfilename;
พยายาม
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(รูปแบบ(การเชื่อมต่อ,[afilename,apassword]),
รูปแบบ(sconnectionstring,[ชื่อไฟล์,รหัสผ่าน]));
ผลลัพธ์:=copyfile(pchar(ชื่อไฟล์),pchar(afilename),false);
ลบไฟล์(ชื่อไฟล์ชื่อไฟล์);
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
//================================================ =============================
// ขั้นตอน: เปลี่ยนรหัสผ่านฐานข้อมูล
// ผู้เขียน: ysai
// วันที่ : 27-01-2003
// อาร์กิวเมนต์: afilename,aoldpassword,anewpassword:string
// ผลลัพธ์: บูลีน
//================================================ =============================
ฟังก์ชั่น เปลี่ยนรหัสผ่านฐานข้อมูล (ชื่อไฟล์, รหัสผ่านเก่า, รหัสผ่านใหม่: สตริง): บูลีน;
//แก้ไขรหัสผ่านฐานข้อมูลการเข้าถึง
var
ชื่อไฟล์ต้นกำเนิด:สตริง;
vje:Olevariant;
เริ่ม
ชื่อไฟล์:=gettemppathfilename;
พยายาม
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(รูปแบบ(การเชื่อมต่อ,[afilename,aoldpassword]),
รูปแบบ(sconnectionstring,[ชื่อไฟล์,รหัสผ่านใหม่]));
ผลลัพธ์:=copyfile(pchar(ชื่อไฟล์),pchar(afilename),false);
ลบไฟล์(ชื่อไฟล์ชื่อไฟล์);
ยกเว้น
ผลลัพธ์:=เท็จ;
จบ;
จบ;
2. สิ่งที่คุณควรใส่ใจและเคล็ดลับบางประการเมื่อใช้คำสั่ง sql ในการเข้าถึง
คำสั่ง sql ต่อไปนี้ผ่านการทดสอบในแบบสอบถาม access xp
สร้างตาราง:
สร้างตาราง tab1 (
เคาน์เตอร์ ID,
สตริงชื่อ,
จำนวนเต็มอายุ
[วันที่] วันที่และเวลา);
ทักษะ:
ฟิลด์การเพิ่มอัตโนมัติจะถูกประกาศพร้อมตัวนับ
ช่องที่มีชื่อช่องเป็นคีย์เวิร์ดจะอยู่ในวงเล็บเหลี่ยม [] และตัวเลขก็สามารถใช้เป็นชื่อช่องได้เช่นกัน
สร้างดัชนี:
คำสั่งต่อไปนี้สร้างดัชนีที่ทำซ้ำได้ในคอลัมน์วันที่ของ tab1
สร้างดัชนี idate บน tab1 ([date]);
หลังจากเสร็จสิ้น แอตทริบิวต์ดัชนีวันที่ของฟิลด์ในการเข้าถึงจะแสดงเป็น - ใช่ (มีรายการที่ซ้ำกัน)
คำสั่งต่อไปนี้สร้างดัชนีที่ไม่สามารถทำซ้ำได้ในคอลัมน์ชื่อของ tab1
สร้างดัชนี iname ที่ไม่ซ้ำบน tab1 (ชื่อ)
หลังจากเสร็จสิ้น แอตทริบิวต์ดัชนีของชื่อฟิลด์ในการเข้าถึงจะแสดงเป็น - ใช่ (ไม่มีการทำซ้ำ)
คำสั่งต่อไปนี้จะลบดัชนีทั้งสองที่เพิ่งสร้างขึ้น
วางดัชนี idate บน tab1;
วางดัชนี iname บน tab1;
การเปรียบเทียบคำสั่งอัพเดตในการเข้าถึงและ sqlserver:
อัปเดตคำสั่งเพื่ออัปเดตหลายตารางใน sqlserver:
อัปเดตแท็บ 1
ตั้งค่า a.name = b.name
จากแท็บ 1 ก แท็บ 2 ข
โดยที่ a.id = b.id;
คำสั่ง sql ที่มีฟังก์ชันเดียวกันในการเข้าถึงควรเป็น
อัปเดต tab1 a, tab2 b
ตั้งค่า a.name = b.name
โดยที่ a.id = b.id;
นั่นคือ: คำสั่ง update ในการเข้าถึงไม่มีคำสั่ง from และตารางที่อ้างอิงทั้งหมดจะแสดงอยู่หลังคีย์เวิร์ด update
ในตัวอย่างข้างต้น ถ้า tab2 ไม่ใช่ตาราง แต่เป็นแบบสอบถาม เช่น:
อัปเดต tab1 a, (เลือก id, ชื่อจาก tab2) b
ตั้งค่า a.name = b.name
โดยที่ a.id = b.id;
เข้าถึงฐานข้อมูลการเข้าถึงที่แตกต่างกันหลายแห่ง - ใช้ in clause ใน 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;
ผ่านการทดสอบการเข้าถึง xp
เข้าถึงแหล่งข้อมูล odbc อื่นๆ ในการเข้าถึง
ตัวอย่างต่อไปนี้สอบถามข้อมูลใน sqlserver ในการเข้าถึง
เลือก * จาก tab1 ใน [odbc]
[odbc;ไดรเวอร์=เซิร์ฟเวอร์ sql;uid=sa;pwd=;เซิร์ฟเวอร์=127.0.0.1;ฐานข้อมูล=สาธิต;]
พารามิเตอร์ที่สมบูรณ์ของคุณสมบัติการเชื่อมต่อแหล่งข้อมูลภายนอกคือ:
[odbc;driver=driver;server=server;database=database;uid=user;pwd=password;]
ไดรเวอร์=ไดรเวอร์สามารถพบได้ในรีจิสทรี
hkey_local_machine/software/odbc/odbcinst.ini/
พบใน
สำหรับการนำเข้าข้อมูลระหว่างฐานข้อมูลที่แตกต่างกัน โปรดดูที่ Blue Blood Sword
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
การเข้าถึงรองรับแบบสอบถามย่อย
การเข้าถึงรองรับการรวมภายนอก แต่จะไม่รวมการรวมภายนอกที่สมบูรณ์ หากได้รับการสนับสนุน
เข้าร่วมทางซ้ายหรือเข้าร่วมทางขวา
แต่ไม่ได้รับการสนับสนุน
การรวมภายนอกแบบเต็มหรือการรวมแบบเต็ม
แบบสอบถามวันที่ในการเข้าถึง
หมายเหตุ: ตัวคั่นวันที่และเวลาในการเข้าถึงคือ # แทนที่จะเป็นเครื่องหมายคำพูด
เลือก * จาก tab1 โดยที่ [date]>#2002-1-1#;
ในเดลฟีฉันใช้สิ่งนี้
sql.add(รูปแบบ(
'เลือก * จาก tab1 โดยที่ [date]>#%s#;',
[datetostr(วันที่)]));
สตริงในการเข้าถึงสามารถคั่นด้วยเครื่องหมายคำพูดคู่ได้ แต่ sqlserver ไม่รู้จักสตริงเหล่านั้น ดังนั้นเพื่อความสะดวกในการโยกย้ายและความเข้ากันได้
ขอแนะนำให้ใช้เครื่องหมายคำพูดเดี่ยวเป็นตัวคั่นสตริง