1. ภาพรวม
เมื่อเขียนโปรแกรมฐานข้อมูลใน Delphi การดำเนินการนำเข้าและส่งออกข้อมูลมักจะเกี่ยวข้อง เช่น การจัดเก็บข้อมูลในฐานข้อมูลขนาดใหญ่เป็นไฟล์พกพาเพื่อให้อ่านได้ง่ายจากภายนอก การนำเข้าข้อมูลที่เก็บอยู่ในไฟล์ไปยังฐานข้อมูลอื่น นอกจากนี้ โดยการจัดเก็บข้อมูลใน ฐานข้อมูลเป็นไฟล์ข้อมูล ง่ายต่อการแลกเปลี่ยนข้อมูลภายในและระหว่างโปรแกรม และหลีกเลี่ยงขั้นตอนที่ยุ่งยากในการแลกเปลี่ยนข้อมูลผ่านหน่วยความจำ ตัวอย่างเช่น ในโปรแกรมรายงานทั่วไปที่เขียนโดยผู้เขียน การควบคุมนี้จะใช้เป็นตัวพาข้อมูลของ จัดส่ง.
2. แนวคิดพื้นฐาน
ในฐานะที่เป็นตัวควบคุมการจัดเก็บข้อมูลดาตาแกรม ควรจะสามารถจัดเก็บและอ่านข้อมูลพื้นฐานของชุดข้อมูลได้ (เช่น ชื่อฟิลด์ ชื่อที่แสดงฟิลด์ ประเภทข้อมูลฟิลด์ จำนวนบันทึก จำนวนฟิลด์ ค่าปัจจุบันของฟิลด์ที่ระบุ ในบันทึกที่ระบุ เป็นต้น) และควรให้ลักษณะบรรจุภัณฑ์ที่ดีขึ้นเพื่อความสะดวกในการใช้งาน
จากข้อมูลนี้ ผู้เขียนได้ใช้คุณลักษณะเชิงวัตถุของ Delphi5.0 เพื่อออกแบบและพัฒนาการควบคุมการจัดเก็บข้อมูลดาตาแกรม
3. วิธีการนำไปปฏิบัติ
เขียนหน่วยรหัสต่อไปนี้:
หน่วย IbDbFile;
อินเตอร์เฟซ
ใช้ Windows, SysUtils, คลาส, ฟอร์ม, Db, DbTables, ไดอะล็อก;
คอนสตรัคชั่น
ธง = 'สตูดิโอซอฟต์แวร์ Datagram-Jixing';
พิมพ์
TDsException = คลาส (ข้อยกเว้น);
TIbStorage = คลาส (TComponent)
ส่วนตัว
FRptTitle: string; //คำอธิบายดาตาแกรมที่เก็บข้อมูล
FpageHead: string; // คำอธิบายส่วนหัวของหน้า
FpageFoot: string; // คำอธิบายของฟุต
FFieldNames: TStrings; //ตารางชื่อฟิลด์
FStreamIndex: TStrings; //ดัชนีฟิลด์
FStream: TStream; // สตรีมที่เก็บเนื้อหาฟิลด์
FFieldCount: จำนวนเต็ม; //จำนวนฟิลด์
FRecordCount: จำนวนเต็ม; // จำนวนระเบียน
FOpenFlag: Boolean; // มีการสร้างแฟล็กหรือไม่
ได้รับการคุ้มครอง
ขั้นตอนการรีเซ็ต; // รีเซ็ต --- ล้างเนื้อหาของสตรีม
ขั้นตอน SaveHead (ADataSet: TDataSet; Fp: TStream); // ข้อมูลส่วนหัวของรายงานการจัดเก็บ
ขั้นตอน LoadTableToStream (ADataSet: TDataSet); // ข้อมูลบันทึกการจัดเก็บข้อมูล
ขั้นตอน IndexFields(ADataSet: TDataSet); //บันทึกชื่อฟิลด์ของชุดข้อมูลลงในรายการ
ขั้นตอน GetHead (Fp: TFileStream); // บันทึกข้อมูลส่วนหัวของรายงาน
ขั้นตอน GetIndex (Fp: TFileStream); // สร้างดัชนีสตรีมบันทึก
ขั้นตอน GetFieldNames (Fp: TFileStream); // อ่านตารางชื่อฟิลด์จากสตรีม
ฟังก์ชั่น GetFieldName (AIndex: Integer): string; // รับชื่อฟิลด์
ฟังก์ชัน GetFieldDataType (AIndex: จำนวนเต็ม): TFieldType;
ฟังก์ชั่น GetDisplayLabel (AIndex: Integer): string; // รับชื่อที่แสดงฟิลด์
ขั้นตอน SaveFieldToStream (AStream: TStream; AField: TField); // บันทึกฟิลด์ลงในสตรีม
ฟังก์ชั่น GetFieldValue (ARecordNo, FieldNo: Integer): string; //Field content
สาธารณะ
ตัวสร้างสร้าง (AOwner: TComponent);
ทำลายล้าง;
ขั้นตอน Open; //สร้าง stream เพื่อเตรียมการเก็บข้อมูล
ขั้นตอน SaveToFile (ADataSet: TDataSet; AFileName: string); // วิธีการจัดเก็บ
ขั้นตอน LoadFromFile(AFileName: string); //โหลดข้อมูล
ขั้นตอน FieldStream (ARecordNo, FieldNo: Integer; var AStream: TStream);
คุณสมบัติ FieldNames [ดัชนี: จำนวนเต็ม]: สตริงอ่าน GetFieldName; // ชื่อฟิลด์
คุณสมบัติ FieldDataTypes [ดัชนี: จำนวนเต็ม]: TFieldType อ่าน GetFieldDataType;
คุณสมบัติ FieldDisplayLabels [ดัชนี: จำนวนเต็ม]: สตริงอ่าน GetDisplayLabel;
คุณสมบัติ Fields[RecNo, FieldIndex: Integer]: สตริงอ่าน GetFieldValue;
// คุณสมบัติ FieldStreams [RecNo, FieldIndex: Integer]: TStream อ่าน GetFieldStream;
คุณสมบัติ RecordCount: จำนวนเต็มอ่าน FRecordCount เขียน FRecordCount;
คุณสมบัติ FieldCount: จำนวนเต็มอ่าน FFieldCount เขียน FFieldCount;
ที่ตีพิมพ์
คุณสมบัติ RptTitle: สตริงอ่าน FRptTitle เขียน FRptTitle;
คุณสมบัติ PageHead: สตริงอ่าน FPageHead เขียน FPageHead;
คุณสมบัติ PageFoot: สตริงอ่าน FPageFoot เขียน FPageFoot;
จบ;
ฟังก์ชั่น ReadAChar (AStream: TStream): Char;
ฟังก์ชั่น ReadAStr (AStream: TStream): สตริง;
ฟังก์ชั่น ReadBStr (AStream: TStream; ขนาด: จำนวนเต็ม): สตริง;
ฟังก์ชั่น ReadAInteger (AStream: TStream): จำนวนเต็ม;
ขั้นตอน WriteAStr (AStream: TStream; AStr: string);
ขั้นตอน WriteBStr (AStream: TStream; AStr: string);
ขั้นตอน WriteAInteger (AStream: TStream; AInteger: Integer);
ขั้นตอนการลงทะเบียน;
การดำเนินการ
ขั้นตอนการลงทะเบียน;
เริ่ม
RegisterComponents('การเข้าถึงข้อมูล', [TIbStorage]);
จบ;
ฟังก์ชั่น ReadAChar (AStream: TStream): Char;
วาร์
อาชาร์: ชาร์;
เริ่ม
AStream.Read(AChar, 1);
ผลลัพธ์ := AChar;
จบ;
ฟังก์ชั่น ReadAStr (AStream: TStream): สตริง;
var
Str: สตริง;
ค:ชาร์;
เริ่ม
Str := '';
C := ReadAChar(AStream);
ในขณะที่ C <> #0 ทำ
เริ่ม
Str := Str + C;
C := ReadAChar(AStream);
จบ;
ผลลัพธ์ := Str;
จบ;
ฟังก์ชั่น ReadBStr (AStream: TStream; ขนาด: จำนวนเต็ม): สตริง;
var
Str: สตริง;
ค:ชาร์;
ฉัน : จำนวนเต็ม;
เริ่ม
Str := '';
สำหรับฉัน := 1 ถึงขนาดทำ
เริ่ม
C := ReadAChar(AStream);
Str := Str + C;
จบ;
ผลลัพธ์ := Str;
จบ;
ฟังก์ชั่น ReadAInteger (AStream: TStream): จำนวนเต็ม;
var
Str: สตริง;
ค:ชาร์;
เริ่ม
ผลลัพธ์ := MaxInt;
Str := '';
C := ReadAChar(AStream);
ในขณะที่ C <> #0 ทำ
เริ่ม
Str := Str + C;
C := ReadAChar(AStream);
จบ;
พยายาม
ผลลัพธ์ := StrToInt(Str);
ยกเว้น
application.MessageBox('สตริงปัจจุบันไม่สามารถแปลงเป็นจำนวนเต็มได้!', 'ข้อผิดพลาด',
Mb_Ok + Mb_IconError);
จบ;
จบ;
ขั้นตอน WriteAStr (AStream: TStream; AStr: string);
เริ่ม
AStream.Write (ตัวชี้ (AStr) ^ ความยาว (AStr) + 1);
จบ;
ขั้นตอน WriteBStr (AStream: TStream; AStr: string);
เริ่ม
AStream.Write (ตัวชี้ (AStr) ^ ความยาว (AStr));
จบ;
ขั้นตอน WriteAInteger (AStream: TStream; AInteger: Integer);
var
ส: สตริง;
เริ่ม
S := IntToStr(AInteger);
WriteAstr(AStream, S);
จบ;
ตัวสร้าง TIbStorage.Create (AOwner: TComponent);
เริ่ม
สืบทอดสร้าง (AOwner);
FOpenFlag := False; //ตั้งค่าสถานะเพื่อตรวจสอบว่ากระแสข้อมูลถูกสร้างขึ้นหรือไม่
จบ;
ตัวทำลาย TIbStorage ทำลาย;
เริ่ม
ถ้า FOpenFlag แล้ว
เริ่ม
FStream.ฟรี;
FStreamIndex.ฟรี;
FfieldNames ฟรี;
จบ;
สืบทอดมาทำลาย;
จบ;
ขั้นตอน TIbStorage.Open;
เริ่ม
FOpenFlag := จริง;
FStream := TMemoryStream.Create;
FStreamIndex := TStringList.Create;
FFieldNames := TStringList.Create;
รีเซ็ต;
จบ;
ขั้นตอน TIbStorage.Reset; //รีเซ็ต
เริ่ม
ถ้า FOpenFlag แล้ว
เริ่ม
FfieldNames.เคลียร์;
FStreamIndex.ล้าง;
FStream.Size := 0;
FRptTitle := '';
FpageHead := '';
FpageFoot := '';
FFieldCount := 0;
FRecordCount := 0;
จบ;
จบ;
//-------บันทึกข้อมูลส่วนหนึ่ง
ขั้นตอน TIbStorage.SaveToFile (ADataSet: TDataSet; AFileName: string);
var
Fp: TFileStream;
ฉัน : จำนวนเต็ม;
Ch: ถ่าน;
T1, T2: TDateTime;
Str: สตริง;
เริ่ม
ถ้าไม่ใช่ FOpenFlag แล้ว
เริ่ม
showmessage('วัตถุไม่เปิด');
ออก;
จบ;
พยายาม
ถ้า FileExists (AFileName) แล้ว DeleteFile (AFileName);
Fp := TFileStream.Create(AFileName, fmCreate);
รีเซ็ต;
SaveHead(ADataSet, Fp); //บันทึกข้อมูลส่วนหัว---คำแนะนำเพิ่มเติม
IndexFields(ADataSet); //บันทึกข้อมูลฟิลด์ของชุดข้อมูลเป็น FFieldName
LoadTableToStream(ADataSet); //บันทึกข้อมูลของชุดข้อมูล
WriteAStr(Fp, FFieldNames.Text); //ข้อมูลชื่อช่องเก็บข้อมูล
ช := '@';
Fp.เขียน(Ch, 1);
WriteAStr(Fp, FStreamIndex.Text); //รายการดัชนีช่องเก็บข้อมูล
ช := '@';
Fp.เขียน(Ch, 1);
Fp.CopyFrom(FStream, 0);
ในที่สุด
Fp ฟรี;
จบ;
จบ;
ขั้นตอน TIbStorage.SaveHead (ADataSet: TDataSet; Fp: TStream);
วาร์
ฉัน : จำนวนเต็ม;
Ch: ถ่าน;
เริ่ม
ถ้าไม่ใช่ ADataSet.Active ดังนั้น ADataSet.Active := True;
WriteAStr(Fp, ธง);
WriteAStr(Fp, FRptTitle);
WriteAStr(Fp, FPageHead);
WriteAStr(Fp, FPageFoot);
FFieldCount := ADataSet.Fields.Count;
FRecordCount := ADataSet.RecordCount;
WriteAStr(Fp, IntToStr(ADataSet.Fields.Count));
WriteAStr(Fp, IntToStr(ADataSet.RecordCount));
ช := '@';
Fp.เขียน(Ch, 1);
จบ;
ขั้นตอน TIbStorage.IndexFields (ADataSet: TDataSet);
var
ฉัน : จำนวนเต็ม;
สนาม: ทีฟิลด์;
เริ่ม
สำหรับฉัน := 0 ถึง ADataSet.Fields.Count - 1 ทำ
เริ่ม
AFfield := ADataSet.Fields[I];
//ไม่ได้ใช้ FFieldNames.Values[AField.FieldName] := AField.DisplayLabel; คือการพิจารณาประสิทธิภาพ
FFieldNames.Add(AField.FieldName + '=' + AField.DisplayLabel);
FFieldNames.Add(AField.FieldName + 'DataType=' + IntToStr(Ord(AField.DataType)));
จบ;
จบ;
ขั้นตอน TIbStorage.LoadTableToStream (ADataSet: TDataSet);
var
ไม่: จำนวนเต็ม;
I, J, ขนาด: จำนวนเต็ม;
Tmp, Id, Str : string; //id=string(RecNO) + string(FieldNo)
เลน: จำนวนเต็ม;
Ch: ถ่าน;
BlobStream: TBlobStream;
เริ่ม
ถ้าไม่ใช่ FOpenFlag แล้ว
เริ่ม
showmessage('วัตถุไม่เปิด');
ออก;
จบ;
พยายาม
ADataSet.DisableControls;
ADataSet.First;
ไม่ := 0;
FStreamIndex.ล้าง;
FStream.Size := 0;
ในขณะที่ไม่ใช่ ADataSet.Eof ทำ
เริ่ม
ไม่ := ไม่ + 1;
สำหรับ J := 0 ถึง ADataSet.Fields.Count - 1 ทำ
เริ่ม
Id := Inttostr(NO) + '_' + IntToStr(J);
//สร้างดัชนีตำแหน่งของสตรีม โดยดัชนีจะชี้ไปที่: Size#0Content
FStreamIndex.Add(Id + '=' + IntToStr(FStream.Position));
//เก็บข้อมูลฟิลด์ลงในสตรีม
SaveFieldToStream (FStream, ADataSet.Fields [J]);
จบ;
ADataSet ถัดไป;
จบ;
ในที่สุด
ADataSet.EnableControls;
จบ;
จบ;
//หากเนื้อหาปัจจุบันของฟิลด์ว่างเปล่าหรือ BlobSize<=0 เฉพาะขนาดฟิลด์เท่านั้นที่เป็น 0 และไม่มีการเขียนเนื้อหา
ขั้นตอน TIbStorage.SaveFieldToStream (AStream: TStream; AField: TField);
var
ขนาด: จำนวนเต็ม;
Ch: ถ่าน;
XF: ทีสตรีม;
Str: สตริง;
เริ่ม
ถ้า AField.IsBlob แล้ว
เริ่ม
//วิธีจัดเก็บเนื้อหาของฟิลด์ TBlobField เป็นสตรีม
Xf := TBlobStream.Create(TBlobField(AField), bmread);
พยายาม
ถ้า Xf.Size > 0 แล้ว
เริ่ม
ขนาด := Xf.Size;
WriteAInteger(AStream, ขนาด);
AStream.CopyFrom(Xf, Xf.Size);
จบ
อื่น
เขียน AInteger(AStream, 0);
ในที่สุด
XF.ฟรี;
จบ;
จบ
อื่น
เริ่ม
Str := AField.AsString;
ขนาด := ความยาว(Str);
WriteAInteger(AStream, ขนาด);
ถ้าขนาด <> 0 แล้ว
AStream.Write (ตัวชี้ (Str) ^, ขนาด);
//WriteAstr(AStream, Str);
จบ;
ช := '@';
AStream.เขียน(Ch, 1);
จบ;
//------------โหลดข้อมูล
ขั้นตอน TIbStorage.LoadFromFile (AFileName: string);
var
Fp: TFileStream;
ตรวจสอบ: สตริง;
เริ่ม
รีเซ็ต;
พยายาม
ถ้าไม่ใช่ FileExists (AFileName) แล้ว
เริ่ม
showmessage('ไม่มีไฟล์:' + AFileName);
ออก;
จบ;
Fp := TFileStream.Create(AFileName, fmOpenRead);
ตรวจสอบ := ReadAStr(Fp);
ถ้ากาเครื่องหมาย <> ตั้งค่าสถานะแล้ว
เริ่ม
Application.MessageBox('รูปแบบไฟล์ไม่ถูกต้อง', 'ข้อผิดพลาด', Mb_Ok + Mb_IconError);
ออก;
จบ;
GetHead(FP);
GetFieldNames(Fp);
GetIndex(FP);
FStream.CopyFrom(Fp, Fp.Size-Fp.Position);
ในที่สุด
Fp ฟรี;
จบ;
จบ;
ขั้นตอน TIbStorage.GetHead (Fp: TFileStream);
เริ่ม
FRptTitle := ReadAStr(Fp);
FPageHead := ReadAstr(Fp);
FPageFoot := ReadAstr(Fp);
FFieldCount := ReadAInteger(Fp);
FRecordCount := ReadAInteger(Fp);
ถ้า ReadAChar(Fp) <> '@' แล้วแสดงข้อความ ('GetHead File Error');
จบ;
ขั้นตอน TIbStorage.GetFieldNames (Fp: TFileStream);
var
Ch: ถ่าน;
Str: สตริง;
เริ่ม
Str := '';
Str := ReadAStr(Fp);
FFieldNames.CommaText := Str;
Ch := ReadAChar(Fp);
ถ้า Ch <> '@' ดังนั้น Showmessage ('เมื่อได้รับชื่อฟิลด์ผิดพลาด');
จบ;
ขั้นตอน TIbStorage.GetIndex (Fp: TFileStream);
var
Ch: ถ่าน;
Str: สตริง;
เริ่ม
Str := '';
Str := ReadAStr(Fp);
FStreamIndex.CommaText := Str;
Ch := ReadAChar(Fp);
ถ้า Ch <> '@' แล้ว Showmessage ('เมื่อได้รับข้อผิดพลาดดัชนีตำแหน่งฟิลด์');
จบ;
//---------อ่านส่วนค่าของฟิลด์
ฟังก์ชัน TIbStorage.GetFieldValue (ARecordNo, FieldNo: จำนวนเต็ม): สตริง;
var
รหัส T : string;
ตำแหน่ง: จำนวนเต็ม;
เลน ฉัน : จำนวนเต็ม;
เอ้อ: บูลีน;
เริ่ม
ผลลัพธ์ := '';
เอ้อ := เท็จ;
ถ้า ARecordNo > FRecordCount แล้ว
เอ้อ := จริง; // ARecordNo := FRecordCount;
ถ้า ARecordNo < 1 แล้ว
เอ้อ := จริง; // ARecordNo := 1;
ถ้า FieldNo >= FFieldCount แล้ว
เอ้อ := True; // FieldNo := FFieldCount - 1;
ifFieldNo < 0 แล้ว
เอ้อ := จริง; //ไม่มีฟิลด์ := 0;
ถ้าเออร์แล้ว
เริ่ม
Showmessage('หมายเลขบันทึกหรือป้ายกำกับฟิลด์อยู่นอกขอบเขต');
ออก;
จบ;
ถ้า FFieldCount = 0 ให้ออก;
Id := Inttostr(ARecordNO) + '_' + IntToStr (FieldNo);
ตำแหน่ง := StrToInt(FStreamIndex.Values[Id]);
FStream.Position := ตำแหน่ง;
//รับความยาวของเนื้อหาฟิลด์
เลน := ReadAInteger(FStream);
ถ้า Len > 0 แล้ว
ผลลัพธ์ := ReadBStr(FStream, Len);
ถ้า ReadAChar(FStream) <> '@' แล้ว
Showmessage('เมื่ออ่านฟิลด์, ค้นหาข้อผิดพลาดของรูปแบบการบันทึก');
จบ;
ขั้นตอน TIbStorage.FieldStream (ARecordNo, FieldNo: Integer; var AStream: TStream);
var
รหัส T : string;
ตำแหน่ง: จำนวนเต็ม;
เลน ฉัน : จำนวนเต็ม;
เอ้อ: บูลีน;
เริ่ม
เอ้อ := เท็จ;
ถ้า ARecordNo > FRecordCount แล้ว
เอ้อ := จริง; // ARecordNo := FRecordCount;
ถ้า ARecordNo < 1 แล้ว
เอ้อ := จริง; // ARecordNo := 1;
ถ้า FieldNo >= FFieldCount แล้ว
เอ้อ := True; // FieldNo := FFieldCount - 1;
ifFieldNo < 0 แล้ว
เอ้อ := จริง; //ไม่มีฟิลด์ := 0;
ถ้าเออร์แล้ว
เริ่ม
TDsException.Create('ตัวห้อยดัชนีฟังก์ชัน GetFieldValue อยู่นอกขอบเขต');
ออก;
จบ;
ถ้า FFieldCount = 0 ให้ออก;
Id := Inttostr(ARecordNO) + IntToStr (FieldNo);
ตำแหน่ง := StrToInt(FStreamIndex.Values[Id]);
FStream.Position := ตำแหน่ง;
เลน := ReadAInteger(FStream);
AStream.CopyFrom(FStream, Len);
จบ;
ฟังก์ชั่น TIbStorage.GetFieldName(AIndex: Integer): string; // รับชื่อฟิลด์
เริ่ม
//ฟิลด์และประเภทข้อมูลที่เก็บไว้คิดเป็นครึ่งหนึ่งของแต่ละรายการ
ถ้า ((AIndex < 0) หรือ (AIndex >= FFieldNames.Count div 2)) แล้ว
Application.MessageBox('ดัชนีชื่อฟิลด์อยู่นอกขอบเขต', 'ข้อผิดพลาดของโปรแกรม',
Mb_Ok + Mb_IconError)
อื่น
ผลลัพธ์ := FFieldNames.Names[AIndex*2];
จบ;
ฟังก์ชั่น TIbStorage.GetFieldDataType(AIndex: Integer): TFieldType; // รับชื่อฟิลด์
เริ่ม
//ฟิลด์และประเภทข้อมูลที่เก็บไว้คิดเป็นครึ่งหนึ่งของแต่ละรายการ
ถ้า ((AIndex < 0) หรือ (AIndex >= FFieldNames.Count div 2)) แล้ว
Application.MessageBox('ดัชนีประเภทข้อมูลฟิลด์อยู่นอกขอบเขต', 'ข้อผิดพลาดของโปรแกรม',
Mb_Ok + Mb_IconError)
อื่น
ผลลัพธ์ := TFieldType(StrToInt(FFieldNames.Values[FFieldNames.Names[AIndex*2+1]]));
จบ;
ฟังก์ชั่น TIbStorage.GetDisplayLabel (AIndex: Integer): string; // รับชื่อที่แสดงของฟิลด์
เริ่ม
ถ้า ((AIndex < 0) หรือ (AIndex >= FFieldNames.Count)) แล้ว
Application.MessageBox('ดัชนีชื่อฟิลด์อยู่นอกขอบเขต', 'ข้อผิดพลาดของโปรแกรม',
Mb_Ok + Mb_IconError)
อื่น
ผลลัพธ์ := FFieldNames.Values[GetFieldName(AIndex)];
จบ;
จบ.
ผ่านการทดสอบ การควบคุมนี้รองรับการควบคุมชุดข้อมูลที่ใช้กันทั่วไปได้ดี เช่น Ttable, Tquery, TaodTable, TadoQuery, TibTable, TibQuery ฯลฯ และมีประสิทธิภาพที่ดี (การทดสอบ: บันทึกบุคลากร 1,100 รายการ, 23 ฟิลด์ที่จัดเก็บเป็นไฟล์ใช้เวลาประมาณ 2 วินาที)
4. การใช้การควบคุมขั้นพื้นฐาน
1. จัดเก็บข้อมูลจากชุดข้อมูลไปยังไฟล์
IbStorage1.Open; //สร้างสตรีมการจัดเก็บข้อมูล
IbStorage1.SaveToFile(AdataSet, Afilename);
2. อ่านข้อมูลจากไฟล์
IbStorage1.เปิด;
IbStorage1.LoadFromFile(AfileName);
3. การเข้าถึงข้อมูลในการควบคุมการจัดเก็บข้อมูลดาตาแกรม
ค่า := IbStorage1.Fields[ArecNo, AfieldNo]; //ประเภทสตริง
ส่วนอื่นๆ จะถูกละไว้
5. บทสรุป
ด้วยการเขียนการควบคุมการจัดเก็บข้อมูลดาตาแกรมนี้ ปัญหาของการจัดเก็บข้อมูลและการแลกเปลี่ยนในโปรแกรมฐานข้อมูลจะได้รับการแก้ไขได้ดีขึ้น และมีการควบคุมที่เป็นประโยชน์สำหรับการพัฒนาโปรแกรมฐานข้อมูล
การควบคุมผ่านการดีบักภายใต้สภาพแวดล้อมการพัฒนา Windows98 และ Delphi5