當前位置:首頁 » 操作系統 » delphi資料庫開發實例

delphi資料庫開發實例

發布時間: 2023-06-27 07:52:55

① delphi 7.0中做一個學生信息管理系統 如何製作列印預覽包表呢本人菜鳥求大神指點!!

學校學生管理信息系統的簡介
學校學生管理信息系統是針對學校人事處的大量業務處理工作而開發的管理軟體,是典型的管理信息系統(Management Information System)。它是一個教育單位不可缺少的部分,它的內容對於學校的決策者和管理者來說都至關重要,它能夠為用戶提供充足的信息和快捷的查詢手段。能有效的幫助學校和老師掌握學生的情況,為學生提供成績跟課程方面的查詢。功能基本符合根據張波爾老師的要求。
學生用戶通過輸入學生基本信息、課程基本信息等,由系統自行生成相應的數據以供學生查詢,另外人事處的管理用戶還可以對這些基本信息進行更新和刪除, 學校學生管理信息系統力求給用戶方便快捷的途徑去管理這些繁瑣的數據。
具體系統功能需求描述如下:

(1) 學籍信息管理
每年的大量新生入學,老生畢業都需要處理大量的學生信息。通過這一模塊,可以實現學生基本情況的添加、刪除、更新。還能查詢各個學生的情況,姓名、家庭電話、家庭住址、學號等各個消息

(2) 班級信息管理
實現班級的添加、刪除、更新。查詢班級的所在系別,輔導員等。

(3)課程信息管理
每個學期都會增加一些新的科目,通過本模塊可以輕松的添加以及更新課程。可以根據
學期條件或者班級條件的選擇,也可根據課程名、課程號或者班級的選擇,並對值的輸入,可以看到數據集中顯示符合條件的課程數據信息,而且可以根據教工的修改要求進行數據的添加、刪除、修改的操作。
該項管理對課程的屬性進行了具體化的分類,比如可以分辨是考試科還是考察課,而且根據條件的選擇大大得提高了對各學期課程數據的記錄操作,很大得幫助了教工們工作效率的提高。

(4)成績信息管理
本模塊實現了成績的輸入、刪除、更新。還能查詢到平均成績以及單科最高最低成績以及個人成績。把成績統計這個繁瑣的工作簡單化,為學生成績的管理方面提高工作效率。

(5)系統管理
因為本系統是供多人一起使用的,必須對某一些人進行限制。於是設置了管理員,非管理員只能進行查詢操作,不能進行更改。

三、學校學生管理信息系統的分析和設計
(1)開發環境的簡介
設計平台: DELPHI6.0
Delphi是一個對象導向設計的應用程序語言,是開發資料庫前端的優秀工具,它的編程語言簡潔明快、組件功能強大和編程環境靈活方便。採用Delphi來開發資料庫應用程序具有更大的靈活性和可擴展性。

資料庫: Microsoft Access
Access 是關系資料庫開發工具,資料庫能匯集各種信息以供查詢、存儲和檢索。Access 的優點在於它能使用數據表示圖或自定義窗體收集信息。數據表示圖提供了一種類似於 Excel 的電子表格,可以使資料庫一目瞭然。另外,Access 允許創建自定義報表用於列印或輸出資料庫中的信息。Access也提供了數據存儲庫,可以使用桌面資料庫文件把資料庫文件置於網路文件伺服器,與其他網路用戶共享資料庫。Access 是一種關系資料庫工具,關系資料庫是已開發的最通用的資料庫之一。Access 多用於中小型企業來設計中小型資料庫,一般的學校教務系統的資料庫用Access 來設計完全能達到要求。由於考慮到本系統是應用在單機系統上,只建立起一個資料庫。

資料庫訪問方式:ADO
ADO(Active Data Objects)實際是一種提供訪問各種數據類型 的連接機制。ADO設計為一種極簡單的格式,通過ODBC的方法同資料庫介面。可以使用任何一種ODBC數據源,即不止適合於SQL Server、Oracle、Access 等資料庫應用程序,也適合於Excel表格、文本文件、圖形文件和無格式的數據文件。ADO是基於OLE-DB之上的技術,因此ADO通過其內部的屬性和方法提供統一的數據訪問介面方法。其主要優點是易於使用、高速度、低內存支出和佔用磁碟空間較少。

(2)學校學生管理信息系統資料庫設計
由於考慮到本系統是應用在單機系統上,另外根據學校人員規模,我只建立起一個資料庫,在此資料庫基礎上建立起如下八個基本表:

學生:學號,姓名,出生年月,性別,籍貫,聯系地址,聯系電話,班級

班級:系名,班級,主要教室,輔導員,班長

系表:系名,系辦公室,聯系電話

課程表:課程號,課程號,班級,類別,學時,學名

平均成績表:班級,學號,姓名,平均成績

單科成績表:學號,姓名,課程表,課程名,成績

選課表:班級,課程號,學期

用戶名:用戶,密碼

(3)窗體設計:

班級管理(banjigl.dfm)

班級查詢(banjicx.dfm)

學籍管理(xuejigl.dfm)

學籍查詢(xuejicha.dfm)

課程管理(kechenggl.dfm)

課程查詢(kechengcha.dfm)

成績管理(chengjigl.dfm)

成績查詢(chengjicha.dfm)

(4)系統流程圖(Data Flow Diagram):

(5)資料庫概念結構設計


(6)資料庫邏輯結構設計
學生基本情況表:
欄位名 數據類型 是否可空 說明
班級 文本 否 外關鍵字
學號 文本 否 主關鍵字
姓名 文本 否 無
性別 文本 否 無
出生年月 日期 否 無
籍貫 文本 否 無
聯系電話 文本 是 無
聯系地址 文本 是 無
班級情況表:
系名 文本 否 外關鍵字
班級 文本 否 關鍵字
主要教室 文本 是 無
輔導員 文本 是 無
系名 文本 否 外關鍵字
班級 文本 否 關鍵字
系表:
系名 文本 否 關鍵字
系辦公室 文本 是 無
聯系電話 文本 是 無
課程表:
課程號 文本 否 關鍵字
課程名 文本 否 無
班級 文本 是 外關鍵字
類別 文本 是 無
平均成績表:
班級 文本 否 外關鍵字
學號 文本 否 關鍵字
姓名 文本 是 無
平均成績 長整型 是 無
單科成績表:
學號 文本 否 關鍵字
姓名 文本 否 無
課程號 文本 否 外關鍵字
課程名 文本 否 無
成績 長整型 是 無
班級選課表:
班級 文本 否 組合關鍵字
課程號 文本 否 組合關鍵字
課程名 文本 是 無
學期 文本 否 組合關鍵字

(6)課程管理部分的代碼:
選課管理:
begin
ComboBox1.Items.Append(adoquery1.FieldValues['系名']); //ComboBox1連到系表的 系名 欄位
adoquery1.Next;
end; end;
procere TForm11.ComboBox1Select(Sender: TObject);
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select * from class where 系名='+''''+ComboBox1.Text+'''');//查詢系名是否符合
adoquery2.ExecSQL;
adoquery2.Open;
while not adoquery2.Eof do
begin
ComboBox2.Items.Append(adoquery2.FieldValues['班級']);//符合就調用班級表的欄位 班級
adoquery2.Next;
end;
end;

procere TForm11.ComboBox2Select(Sender: TObject);
begin
adoquery4.Close;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select * from kecheng where 班級='+''''+ComboBox2.Text+'''');//查詢課程表中欄位 班級 是否符合,符合就調到
adoquery4.ExecSQL; //DBgiid1
adoquery4.Open;
end;

procere TForm11.ComboBox3Select(Sender: TObject);
begin
adoquery4.Close;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select * from kecheng where 班級='+''''+ComboBox2.Text+''' and 學期='+''''+ComboBox3.Text+''''); //判斷學期是否符合
adoquery4.ExecSQL;
adoquery4.Open;
end;

procere TForm11.SpeedButton1Click(Sender: TObject);
begin
while not adoquery4.Eof do
begin
if (adoquery4.FieldValues['課程號']=adoquery3.FieldValues['課程號']) and (adoquery4.FieldValues['班級']=Combobox2.Text) and (adoquery4.FieldValues['學期']=Combobox3.Text) then
break;
adoquery4.Next;
end;
if adoquery4.Eof then
begin
adoquery4.Insert; //把選課內容添加到選課表中。
adoquery4.FieldValues['課程號']:=adoquery3.FieldValues['課程號'];
adoquery4.FieldValues['班級']:=Combobox2.Text;
adoquery4.FieldValues['課程名']:=adoquery3.FieldValues['課程名'];
adoquery4.FieldValues['學期']:=Combobox3.Text;
adoquery4.Post;
end
else
begin
showmessage('本課程此班級已經選過'); //如果已經選過,彈出對話框「本課程此班級已經選過」
end;
end;
procere TForm11.SpeedButton2Click(Sender: TObject);
begin
if not adoquery4.Eof then
adoquery4.Delete;
end;
end.

課程管理:
procere TForm9.FormCreate(Sender: TObject);
begin
ADOQuery3.Close; //關閉資料庫
ADOQuery3.SQL.Clear; //清空
ADOQuery3.SQL.Add('select * from kechengbiao');
ADOQuery3.ExecSQL;
ADOQuery3.Open;
dbedit1.DataField:='課程號';
dbedit2.DataField:='課程名';
dbedit3.DataField:='課時';
dbedit4.DataField:='學分';
//DBComboBox1.DataField:='學期';
DBComboBox2.DataField:='類型';

end;

procere TForm9.SpeedButton1Click(Sender: TObject);
begin
if SpeedButton1.Caption='添加' then
begin
adoquery3.Insert; //添加到課程表
SpeedButton1.Caption:='確定';
SpeedButton4.Enabled:=true;
SpeedButton2.Enabled:=false;
SpeedButton3.Enabled:=false;
end
else
if SpeedButton1.Caption='確定' then
begin
if dbedit1.Text='' then
begin
showmessage('請輸入課程號!'); //如果課程號沒輸入,彈出對話框
end
else
begin
adoquery3.Post;
SpeedButton1.Caption:='添加';
SpeedButton4.Enabled:=false;
SpeedButton2.Enabled:=true;
SpeedButton3.Enabled:=true;
end;
end;
end;

procere TForm9.SpeedButton2Click(Sender: TObject);
begin
if adoquery3.Eof then
begin
SpeedButton2.Enabled:=false;
SpeedButton3.Enabled:=false;
end;
if SpeedButton2.Caption='刪除' then
begin
SpeedButton2.Caption:='確定';
SpeedButton4.Enabled:=true;
SpeedButton1.Enabled:=false;
SpeedButton3.Enabled:=false;
end
else
begin
adoquery3.Delete; //從數據表中刪掉所選記錄
SpeedButton2.Caption:='刪除';
SpeedButton4.Enabled:=false;
SpeedButton1.Enabled:=true;
SpeedButton3.Enabled:=true;
end;
end;

procere TForm9.SpeedButton4Click(Sender: TObject);
begin
adoquery3.Cancel;
SpeedButton1.Caption:='添加';
SpeedButton2.Caption:='刪除';
SpeedButton3.Caption:='修改';
SpeedButton4.Enabled:=false;
SpeedButton1.Enabled:=true;
SpeedButton2.Enabled:=true;
SpeedButton3.Enabled:=true;
end;

procere TForm9.SpeedButton3Click(Sender: TObject);
begin
if SpeedButton3.Caption='修改' then
begin
adoquery3.Edit; //修改課程表中的記錄
SpeedButton3.Caption:='確定';
SpeedButton4.Enabled:=true;
SpeedButton2.Enabled:=false;
SpeedButton1.Enabled:=false;
end
else
begin
adoquery3.Post;
SpeedButton3.Caption:='修改';
SpeedButton4.Enabled:=false;
SpeedButton2.Enabled:=true;
SpeedButton1.Enabled:=true;
end;

end;

procere TForm9.Label1DblClick(Sender: TObject);
begin
form11:=tform11.Create(application);
form11.ShowModal;

end;
end.

課程查詢部分:
procere Tform4.ComboBox1Select(Sender: TObject);

begin
edit1.Text:='';
button1.Enabled:=false;
end;

procere Tform4.Button1Click(Sender: TObject);
begin
if CheckBox1.Checked=true then
begin
ADOQuery1.Close; //先將資料庫關閉
ADOQuery1.SQL.Clear; //清空ADOQuery1內的SQL值清空
ADOQuery1.SQL.Add('select * from kecheng where '+ComboBox1.text+' = '+''''+edit1.Text+''' and 學期 = '+''''+ComboBox2.Text+''''); //合並查詢,符合的話在DBGrid中顯示出來
ADOQuery1.ExecSQL;
ADOQuery1.Open;
end
else
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from kecheng where '+ComboBox1.text+' = '+''''+edit1.Text+'''');//單個條件查詢
ADOQuery1.ExecSQL;
ADOQuery1.Open;
end;
end;

procere Tform4.N2Click(Sender: TObject);
begin //開啟其他管理界面
form2.show;
form4.Close;
end;

procere Tform4.N3Click(Sender: TObject);
begin
form3.show;
form4.Close;
end;

procere Tform4.N4Click(Sender: TObject);
begin
form5.show;
form4.Close;
end;

procere Tform4.N6Click(Sender: TObject);
begin
form1.show;
form4.Close;
end;

procere Tform4.N7Click(Sender: TObject);
begin

form4.Close;
end;

procere Tform4.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
button1.Enabled:=true; //當輸入條件後,「確定」按鈕為有效狀態
end;

procere Tform4.CheckBox1Click(Sender: TObject);
begin
ComboBox2.Enabled:=CheckBox1.Checked;//把查詢到的數據放在DBGrid上顯示出來
end;

end.

四、學校學生管理信息系統的使用說明
本系統分為學生用戶和管理用戶,如果你不是管理員,那隻能進行查詢,對數據沒有修改權力。只能進行查詢,裡面有各個方面的,如成績查詢,課程查詢,班級查詢,學籍查詢。各個界面都簡單明了,只要輸入你所需要的條件,系統自動調出數據。
管理員登陸點系統,點系統,輸入管理員用戶及密碼,跟資料庫的用戶表比較。如果通過
則能進行課程,學籍,成績,班級的管理。

五、結束語
學生信息管理系統有利於學校對學生資料的查詢,具有可使用性和可維護性,利於學校在需要之時快速了解學生的情況。並可以讓具有最高許可權的管理員更新、修改信息,已經具備了一定的功能。但由於時間關系和其它原因,本系統還有些不足之處, 如本系統沒有實現報表列印的功能等等, 還有待於完善。
在張波爾老師的指導下,經過一段時間的討論和上機的不斷調試,我順利的完成了開發任務。在開發過程中,我不僅增強了自學的能力和開發軟體的能力。對一些軟體開發模式有了更加深刻的認識,對應用軟體的熟練程度有所提高,已經能運用這項開發過程,學會了如何進行小組式的開發一個綜合系統。還從張老師身上學到了很多東西。張老師認真負責的態度嚴謹治治學精神都使我收益非淺。在此我特向給了很多指導和提供我們開發小組寶貴意見的張波爾老師表示感謝!因為本系統所涉及的內容非常廣泛並且比較復雜,加上時間的倉促,盡管我竭盡全力來保證系統的可靠性,但是肯定還有不足之處,懇請用戶批評指正。謝謝!

參考文獻:(1)Delphi6資料庫系統開發實例子導航 人民郵電出版社
(2)程序設計從入門到精通 科學出版社
(3)Delphi6.0程序設計教程 冶金工業出版社
(4)Delphi資料庫開發自學教程 人民郵電出版社

各模塊主要代碼
1、成績管理模塊
⑴ 成績管理
procere TForm8.Button1Click(Sender: TObject);
var
i:boolean;
begin
i:=false;
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select * from pjcj where '+edit2.Text+'');
ADOQuery2.ExecSQL;
ADOQuery2.Open;
if not ADOQuery2.Eof then ( 判斷是否資料庫最後一項)
i:=true;
if i then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from dkcj where 學號 ='+''''+ADOQuery2.FieldValues['學號']+''''); (使用SQL進行查詢)
ADOQuery1.ExecSQL;
ADOQuery1.Open;
button1.Enabled:=false;
end
else
begin
showmessage('沒有符合查詢條件的記錄!!'); (如果沒有符合條ComboBox1.Text:='';
ComboBox2.Text:=''; 件的,顯示該語句)
ComboBox3.Text:='';
edit1.Text:='';
edit2.Text:='';
adoquery1.Close;
adoquery2.Close;
ComboBox1.Enabled:=true;
end;
dbedit6.DataField:='學號';
dbedit7.DataField:='姓名';
dbedit8.DataField:='班級';
dbedit1.DataField:='學號';
dbedit2.DataField:='姓名';
dbedit3.DataField:='課程號';
dbedit4.DataField:='課程名';
dbedit5.DataField:='成績';
end;
(2)成績查詢
procere Tform3.Button1Click(Sender: TObject);
var
i:boolean;
begin
i:=false;
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select * from pjcj where '+edit2.Text+'');
ADOQuery2.ExecSQL; (根據SQL進查詢)
ADOQuery2.Open;
if not ADOQuery2.Eof then
i:=true;
if i then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from dkcj where 學號 ='+''''+ADOQuery2.FieldValues['學號']+'''');
ADOQuery1.ExecSQL;
ADOQuery1.Open;
button1.Enabled:=false;
end
else
begin
showmessage('沒有符合查詢條件的記錄!!');
ComboBox1.Text:=''; (當沒有符合條件的記錄,自動
ComboBox2.Text:=''; 清空選擇框里的查詢條件)
ComboBox3.Text:='';
edit1.Text:='';
edit2.Text:='';
adoquery1.Close;
adoquery2.Close;
ComboBox1.Enabled:=true;

end;
end;

procere Tform3.DBGrid2CellClick(Column: TColumn);
var
str:string;
begin
str:=ADOQuery2.FieldValues['學號'];
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from dkcj where 學號 ='+''''+str+'''');
ADOQuery1.ExecSQL;
ADOQuery1.Open;
end;

procere Tform3.N4Click(Sender: TObject); (管理界面的切換)
begin
form5.show;
form3.Close;
end;

procere Tform3.N6Click(Sender: TObject);
begin
form1.show;
form3.Close;
end;
procere Tform3.Edit1Exit(Sender: TObject);
begin
if ComboBox1.Text='平均成績' then (根據平均成績查詢)
begin
edit2.Text:=edit2.Text+edit1.Text;
end
else
begin
edit2.Text:=edit2.Text+#39;
edit2.Text:=edit2.Text+edit1.Text;
edit2.Text:=edit2.Text+#39;
end;
end;

procere Tform3.Button2Click(Sender: TObject);
begin (本段為對查詢條件的刷新,進
ComboBox1.Text:=''; 行不同條件的輸入)
ComboBox2.Text:='';
ComboBox3.Text:='';
edit1.Text:='';
edit2.Text:='';
adoquery1.Close;
adoquery2.Close;
button1.Enabled:=false;
ComboBox1.Enabled:=true;
end;

2、 班級管理模塊
(1)班級管理
procere TForm9.ComboBox1Select(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from class where 系名 = '+''''+ComboBox1.Text+'''');
ADOQuery1.ExecSQL;
ADOQuery1.Open; (根據系別顯示班級信息)
dbedit1.DataField:='系名'; (這五項為表的數據項名)
dbedit2.DataField:='班級';
dbedit3.DataField:='輔導員';
dbedit4.DataField:='班長';
dbedit5.DataField:='專業';
button1.Enabled:=true;
button2.Enabled:=true;
button3.Enabled:=true;
button4.Enabled:=true;
end;
procere TForm9.Button2Click(Sender: TObject); (記錄的刪除操作)《修改與添加操作與這類似》
begin
if button2.Caption='刪除' then
begin
button2.Caption:='確定';
button1.Enabled:=false;
button3.Enabled:=false;
button4.Enabled:=true;

② Delphi深度探索之使用Bold開發資料庫應用(1)

介紹

下面我要介紹的Bold for Delphi就是是一套優秀的基於UML模型驅動的面向對象的資料庫開發框架 包括了幾十個組件組件 以及 個以上的類 可以用來輕松地實現信息模型設計及基於信息模型的的應用程序

基礎概念介紹

為了使大家對Bold for Delphi整個框架的使用有一個大概的了解 下面將演示如何用UML設計一個簡單的模型並用Bold來完成 並包括如何用Bold快速實現一個簡單的操作界面

自打我和我老婆認識以後 就染上了她的臭毛病 比較喜歡亂花錢 沒有節制 結果搞的自己常常是掙的不如花的多 老要借外債 後來痛定思痛 決定要對每月收支情況做預算 嚴格控制費用支出 為此寫了還寫了好多的財務小程序 下面要講的這個例子程序就是一個常見的家庭小賬本程序 它可以用來統計家庭中的收支情況 軟體的功能要求如下

可以定義家庭中的各個人員的信息 可以輸入收支情況 並同消費的人員關聯起來 給出一定時期內消費的情況統計 作為未來家庭預算的依據

建立信息模型

在產品的需求分析階段 我們首先要建立資料庫程序的信息模型 一般來說信息模型主要是指基於ER圖的實體關系模型 這是因為我們使用的資料庫大部分都是關系型資料庫 雖然有些資料庫 比如Oracle有面向對象的特性 但不是很完善 一般很少使用 而關系型資料庫有一個很大的問題就是無法直觀的體現面向對象的思想 關系型的ER模型能夠清晰地描述業務域的靜態的數據視圖 但你無法從模型獲取實體的操作及其相互之間的交互 同時 也很難在關系型資料庫中簡單地實現繼承 重載 多態等等面向對象的技術 因此現代資料庫開發方法所提倡的面向對象的編程思想無法簡單 清晰 平滑地映射為關系型資料庫中的表結構

統一建模語言(UML)是一種以可視化的方式建立軟體系統框架 並進行文檔化的語言 UML語言是對當今軟體工程領域成熟設計實踐的一個總結 並且已經被實踐證明是可以成功地描述大型的復雜系統的 目前國內很多的大型公司已經開始在軟體開發過程中使用UML作為一種標準的信肆春息模型設計語言了 Bold for Delphi就是基於UML的 它內置了一套自己的UML建模工具 當然我們也可以使用Rose或者ModelMaker來進行UML設計

面向對象的UML類圖則可以說是對ER模型的一個擴展 它對實體之間的關系以及相互之間的作用也進行了描述 ER模型只是對要進行保存的數據進行的模型化 而類圖則包括了全部的類實體的屬性以及它們的操作和相互作用 它可以使我們對業務域問題有一個更精確的視圖 通過使用各種類圖技術可以更容易地 也更快速地建立正確的軟體系統

基於Bold for Delphi的資料庫開發革命性的一點就是允許我們直接把基於UML的類圖映射為關系型資料庫的存儲 而無須手工的通過代碼進行轉換 要注意一點的是 Bold同其它建模工具如Together ModelMaker不同 它生成框架代碼時只使用了UML中的類圖 而Together等可以利用UML圖中的類圖 協作圖等其它UML元素來生成代碼框架 但是Together不負責生成對象模型對應的關系資料庫模型

類模型

下面的這個類圖就是我們的賬本程序的一個簡單類圖

圖中顯示了兩個類 人員信息類 Person 以及賬目信息類AcctItem 人員類和賬目類之間的連線描述了兩個類之間的關系 關系包括一個標題PayAssoc揭示了兩者之間的關系是支付的關系 每個屬性 PayPerson 和 Pay 以及關系多重度因子 和 n 表明每個人可以完成多個賬目的收支 而每個賬目至少要有一個關聯的人員 同時或雹拿類圖還描述了下面一些業務規則衫搭

一個人的信息要有名稱 賬目信息中包含收支金額大小 以及發生日期

上面的類圖如果使用關系型資料庫來實現的話 需要建立主從表 並將人員和賬目之間的關聯約束通過應用程序代碼強制一些運行邏輯來完成 這時通常要通過補充詳細的文檔來描述需要強制的業務邏輯 如果沒有詳細的設計文檔 實現代碼時就很容易遺漏某些重要的商業規則 同時這些文檔在整個的資料庫開發的生命周期裡面都需要人來手工地維護 難免會出現文檔和模型不匹配的錯誤 而且文檔的工作量比較大 而程序員數量又相對不足的話 程序員會覺得既要寫代碼又要寫文檔 無形中增加了很多工作量 難免會有抵觸情緒 這些都會影響工作的效率

對於這樣的問題 Bold則通過精確描述信息模型 無須詳細規則描述文檔可以將模型自動的轉變為實現代碼 商業規則在整個資料庫開發生命周期內由Bold的類來維護 減少了文檔的工作量和出錯的可能

建立示常式序

首先 我們要安裝Bold for Delphi Bold的一個月評估版可以從 boldsoft 獲取 同時D 的架構版內置了Bold 這里我就不詳細介紹申請和安裝的過程了 安裝好後Bold會在IDE的組件面板中添加很多組件 接下來我們就開始建立使用Bold的Delphi程序了

在Delphi中選File|New Application創建一個新的應用程序

保存窗體文件為MainForm pas保存工程文件為CMoney dpr

添加一個數據模塊 設定數據模塊的名字為DmMoney

將數據模塊保存為CDataMole pas

為了使用Bold來建立系統的信息模型 要進行下列操作

從Bold Handles 組件頁上選擇BoldModal(命名為bmMoney) BoldSystemTypeInfoHandle(命名為bsthMoney)和BoldSystemHandle(命名為bshMoney)到數據模塊中

設定bsthMoney的BoldModal屬性為bmMoney

設定bshMoney的BoldSystemTypeInfoHandle 屬性為bsthMoney

其中BoldModel組件將被用來保存模型 即類 類的關系 約束以及類型等 這些信息將在設計時作為字元串保存到Delphi的窗體和數據模塊文件中 在運行時Bold將執行一些模型的中間轉換過程 將模型轉化為BoldSystemTypeInfoHandle控制項所使用的格式 並選擇實現可持續性的機制

在設計時儲存在BoldModel組件中的信息模型可以被看做元數據 就象資料庫的庫表和欄位結構一樣的信息 而BoldSystemTypeInfoHandle組件則保存BoldSystemHandle所需要的運行時信息 這些信息是對UML模型的一種運行時的表達 這個組件是其他Bold組件的信息源 BoldSystemHandle組件則被用來表達整個系統的業務域元素 可以理解為對象空間 通過對象空間我們可以在運行時獲得設計時元數據表達的對象的運行實例 目前用到的三個控制項已經可以很好的應用在不需要保存數據的環境中了 但賬目記錄這類資料庫程序必須要保存用戶輸入的信息 因此還需要添加支持數據可持久性的控制項 這里為了快速演示的需要 我們使用XML文件作為存儲介質 接下來要添加XML可持續控制項到數據模塊中

從Bold Persistence組件頁上選擇BoldPersistenceHandleFileXML控制項(命名為bphxMoeny)添加到數據模塊中

設定組件的BoldModel屬性為bmMoney控制項

設定bshMoney組件的PersistenceHandle屬性為bphxMoeny組件

現在組件關系示意圖如下

BoldPersistenceHandleFileXML組件將使我們的程序可以使用XML文件來保存和讀取對象 這是一個使用很方便的控制項 特別是在快速原型設計期間 因為在原型設計期間 模型經常會被改動 而重新生成資料庫表是很費時間的 而XML文件可以使我們非常快的變更我們的模型設計 當模型基本穩定後 可以去掉這個控制項 轉而切換為其他使用關系型資料庫進行存儲的可持續性控制項 這樣的開發方式可以使我們不需要改動整個程序就能很容易地改變數據持續層的存儲策略 也就是前面所說的 資料庫平台無關設計

除了前面的一些基本的屬性設置外 我們還要設定下列控制項屬性

組件 屬性 值 說明 bsthMoney UseGeneratedCode false 是否使用bold生成類代碼 這里暫時先不使用 稍後我們會進一步介紹 bphxMoeny FileName Data xml 指定保存數據的xml文件名 bshMoney AutoActivate true 告訴Bold控制項在程序運行後馬上打開xml文件用於數據存儲

建立模型 下面的步驟是建立我們的模型 Bold for Delphi內置了一個樹形的UML建模工具(應該說Bold美中不足的一點就是沒有提供象Visio和Rose那樣基於拖放的模型設計界面) 我們可以雙擊BoldModel(bmMoney)組件調出模型設計工具 bold UML模型編輯器(見下圖)包含了應用程序模型信息 數據類型信息和關系資料庫映射信息

模型編輯器支持下列實體類型

Model: 模型 全部業務域實體集合

Package: 包 整個模型的一個子集所包含的實體 可以將大模型分解為小模型來減少系統復雜度

Class:類 類似於Delphi的類的概念(Delphi的類可以從UML的類來生成) 但包含Object Pascal無法直接描述的類的信息和相互關系 Bold框架通過關聯類和特殊的列表類封裝了一些額外的功能使得我們可以很容易的處理復雜的類關系

Attribute: 屬性 類似於Delphi中的property概念 然而在Bold中 這些屬性可以在模型中直接保存而無需我們編寫屬性的Get Set方法

Operation: 操作 等價於Delphi中的類的過程和函數

Association: 關聯 代表了類之間的關系 關聯可以使用類來表達 關聯也可以有操作和屬性 在Bold中建立關聯的復雜工作同樣可以由框架來實現 我們無須編寫代碼來完成

Role: 角色 代表關聯同類的連接

Data Type: 表示模型所支持的不同數據類型 它可以被擴展以支持用戶自定義的數據類型

下圖是不同實體類型在模型編輯器中是如何標識的

所有的實體類型都可以通過編輯器的右鍵菜單來創建和修改屬性 同時我們選中實體節點後 實體和全局的選項會顯示在右側的編輯器中 其中重要的有

Name: 模型的名稱

lishixin/Article/program/Delphi/201311/24785

③ Delphi開發工具中如何訪問資料庫結構[2]

獲取數據域和索引信息

在取得了數據表信息後 應使用TTable對象訪問該數據表的具體信息 對應函數如下

以下是引用片段 procereTDataSet GetFieldNames(List:TStrings); procere慧銷TTable GetIndexNames(List:TStrings);

GetFieldNames用來取得數據表中的各個域名 GetIndexNames用來取得數據表中的各個索引名

另外 可以進一步使用TDataset和TTable中的兩個屬性TDataSet FieldDefs Items[] 和 TTable IndexDefs Items[]來訪問具體的數據域信息和索引信息 它們分別是由TFieldDef和TIndexDef組成的數組

TFieldDef描述如下

TIndexDef描述如下

TFieldType定義如下

以下是引用片段 TFieldType=(ftUnknown ftString ftSmallint ftInteger ftWord ftBoolean ftFloat ftCurrency ftBCD ftDate ftTime ftDateTime ftBytes ftVarBytes ftAutoInc ftBlob ftMemo ftGraphic ftFmtMemo ftParadoxOle ftDBaseOle ftTypedBinary ftCursor);

TIndexOptions定義如下

以下是引用片段 TIndexOptions=setof(ixPrimary ixUnique ixDescending ixExpression ixCaseInsensitive);

它們的具體意義可以參見Delphi幫助

應用實例

使用下面的程序片段即可獲得指定資料庫中指定表的域定義和索引定義 ListBox ListBox 和 ListBox 為Form 中定義的三個列表框 用於顯示結果

以下是引用片段 Var Alias TableName:String Table :TTable Begin Alias:= fjs TableName:= d* //初始化 Session GetTableNames(Alias {別名} TableName {過濾器} True {是否顯示文件擴展名(對DBF) } False {是否顯示系統表} ListBox Items) If ListBox Items Count= then Begin MessageDlg( 資料庫 +Alias+ 中沒有數據表 +TableName mtError [mbOK] ) Exit End Table :=TTable Create(nil) Table DatabaseName :=Alias Table TableName := ListBox Items Strings[ ] {取得表中欄位名及索引名} Table Open if Table Active then begin Table GetFieldNames(ListBox Items) Table GetIndexNames(ListBox Items) end //… 此時結果在ListBox 和ListBox 中 // Table Destroy end

小結

通過上面討論和實例證明 利用Delphi語言開發資料庫軟體管理系統 關鍵技術都已得到解決

參考文獻

[ ] (李維 編著) 《DELPHI 高效資料庫程序設計》機械工業出版社

[ ] 郭旭等 著 《Delphi 應用開發指南》清華大學出版社

[ ] 大富翁 // delphibbs /

收稿日期 月 日 修改日期 月 日

作者簡介 於海生 男 年生於遼寧省丹東市 黑龍江大慶人 年畢業於遼寧化工大仿蘆學計算機科學與技術專業備碧帶 助理工程師 研究方向為鑽井計算機軟體開發與應用

lishixin/Article/program/Delphi/201311/8543

④ 如何學習delphi資料庫編程

以我的經驗一本語言教程 + 一本實例效果最佳:

劉瑞新、張志綱、張兵義等編著,Delphi資料庫程序設計教程,機械工業出版社,2004.2

李文立 劉強 梁冰編著,Delphi資料庫系統開發案例精選,人民郵電出版社2006-5

祝你很快上手.

熱點內容
編程里的等於 發布:2025-03-20 16:22:02 瀏覽:916
ise綜合與編譯 發布:2025-03-20 16:13:22 瀏覽:880
linux文件句柄 發布:2025-03-20 16:11:55 瀏覽:637
如來神掌原始登錄密碼多少 發布:2025-03-20 16:06:32 瀏覽:320
保電訪問 發布:2025-03-20 16:06:23 瀏覽:144
08年雅閣都有什麼配置 發布:2025-03-20 15:55:48 瀏覽:909
塗鴉解壓法 發布:2025-03-20 15:54:54 瀏覽:678
三國伺服器什麼時候開放 發布:2025-03-20 15:50:43 瀏覽:657
英詩派2022款大改款選哪個配置好 發布:2025-03-20 15:36:50 瀏覽:909
廈門如何找回中招報名的密碼 發布:2025-03-20 15:30:56 瀏覽:959