這個模組本質上就是乙個tdatamodule,我採用了 ado來作為訪問資料庫的元件。為了隔離其他模組對ado元件的依賴,我在其他實現模組中使用tclientdataset來作為操作的資料集。實現了以下方法:
execsql -執行一條更新sql**,不需要返回結果,如果有異常就自動丟擲。
getdata - 執行一條select sql**,同時返回olevariant型別的資料集,這個資料集可以直接賦值給tclientdataset.data。
getdataset - 執行一條select sql**,並返回乙個tdataset型別的例項(其實質是tclientdataset)。
為了在使用者操作中不一直保持資料庫連線,在以上方法裡需要先連線資料庫,執行完成後再斷開資料庫連線。而為了在同乙個業務操作中不必要的頻繁連線資料庫,以上方法提供乙個keepconnection的引數,讓呼叫者決定呼叫完成後是否斷開資料庫連線,也即將管理連線資料庫的任務交給呼叫者。
實現定義如下:
tdbhelper = class(tdatamodule)
public
//執行一條不需要返回結果的sql。
procedure execsql(sql: string);
function getdata(sql: string): olevariant;
//建立乙個tclientdataset例項,但是以tdataset型別提供給呼叫者,避免呼叫者依賴dbclient。
function getdataset(sql: string): tdataset;
end;
後續思考,因為不同的dbms產品,有一些語法不同的地方,為了避免在呼叫層考慮這些問題,我們可以將tdbhelper作為乙個基礎類,然後針對不同的dbms產品提供特殊的實現。例如自增長欄位的管理,mssql的語法跟mysql以及oracle的語法都不一樣,那麼我們可以在dbhelper裡提供乙個虛方法getnewid,然後在針對不同dbms的實現類中過載getnewid這個方法.
比如針對mysql的實現,可以用mysql的last_insert_id函式來獲取最後的id,tmysqldbhelper.getnewid可以這樣實現:
tmysqldbhelper.getnewid();
vardataset: tdataset;
begin
dataset := self.getdataset('select last_insert_id()');
result := dataset.fields[0].asinteger;
end;
針對mssql的實現,可以是使用mssql的current_identity()函式來獲取最新的id,tmssqldbhelper.getnewid則可以這樣寫:
tmssqldbhelper.getnewid();
vardataset: tdataset;
begin
dataset := self.getdataset('select current_identity('''+tablename+''')');
result := dataset.fields[0].asinteger;
end;
當然上述實現存在大量重複**,我們可以修改tdbhelper的介面,只需要實現類返回一條提取最新id的sql就好了。那麼修改tdbhelper.getnewid實現,然後引入乙個新的function來給實現類返回sql即可。這樣就實現了不同dbms的相容。我們在具體的業務模組就不用考慮不同dbms的問題了。
企業人事資訊管理系統開發與設計
本課題中,本人結合與人事部門的人員的面談內容和收集到的業務表單,經過仔細推敲,逐步抽象出業務主體框架,完成企業人事管理系統的需求分析和業務功能分析 學習使用rationalrose2003作為uml建模工具,以建立系統主要功能模組的靜態模型和動態模型為目標,完成uml建模 以microsoftvis...
資訊管理系統開發平台之許可權管理介紹 二
今天跟大家介紹一款業務系統用到的基礎平台 許可權管理系統。web業務管理軟體需要一套授權管理系統,今天要介紹的是做專案時使用的一套授權管理系統。這套授權管理系統採用microsoft visual studio 2005整合開發環境c 語言開發,資料庫mssql2005,b s結構。該授權管理系統有...
資訊系統開發與管理四 01
總體規劃的目的和步驟 企業系統規劃法 總體規劃是管理資訊系統生命週期中的第乙個階段,也是系統開發過程的第一步,其目的可以用一句話來概括 即明確系統 是什麼 的問題,也就是進行頂層設計,描繪出資訊系統的架構,並對目標系統提出完整 準確 清晰 具體的要求。總體規劃的目的 保證資訊共享 協調子系統間的工作...