var
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的伊犁網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
tmpSql: string;
begin
tmpSql := 'select odrbno,delno,pdctno,units,qtyu,delchar,indate From ppcchxxb ' +
' where (delno like ''T%'' or qtyu0) and indate=''2010-10-01''' +
' and indate=''2010-11-02'' and pdctno like ''%jm1%''';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.Sql.Add(tmpSql)
ADOQuery1.Open;
end;
如果你里邊的條件是動態(tài)的話,比如時間,則只需將里邊的日期換成你選擇的比如:
tmpSql := 'select odrbno,delno,pdctno,units,qtyu,delchar,indate From ppcchxxb ' +
' where (delno like ''T%'' or qtyu0) and indate=''' +
formatdatetime('yyyy-mm-dd', datetimepicker1.datetime) + '''' +
' and indate=''2010-11-02'' and pdctno like ''%jm1%''';
實際上TADODataSet 是一個通用的數(shù)據(jù)集組件可以代替其他三個數(shù)據(jù)集,只要分別將其CommandType 屬性設(shè)置為cmdTable、comdText 或cmdStoreProc, 對應(yīng)的并分別在其CommandText 屬性中設(shè)置一個基表(即adotable)、一個SQL 命令(adoquery)或一個存儲過程(adocommand)即可。就是說其他三個組件可以用這一個來代替。當(dāng)然,這個組件還可以打開別的文件。你可以看一下上兩個屬性的選項。
DBGrid組件是用來顯示數(shù)據(jù)表的。
Delphi數(shù)據(jù)庫處理
第一節(jié) BDE、ADO、InterBase和dbExpress
Delphi中處理數(shù)據(jù)庫主要有兩種方法,也就是BDE、ADO,從Delphi
6.0開始還加入了一種dbExpress方法。 另外,Delphi還提供了專門處
理Borland 公司自己的數(shù)據(jù)庫產(chǎn)品InterBase 數(shù)據(jù)庫的專門的方法。
BDE(Borland Databas Engine), 是Delphi中最古老的技術(shù),從
delphi 2.0加入BDE 技術(shù)以后,一直是Delphi處理數(shù)據(jù)庫的事實上的標
準。BDE 是一個基于驅(qū)動程序的體系結(jié)構(gòu),每一種數(shù)據(jù)格式或數(shù)據(jù)源都
有一種驅(qū)動程序來驅(qū)動相近的數(shù)據(jù)源。BDE 可以很好的支持現(xiàn)在最流行
的ODBC API方法,
ODBC是一種C/C++ 應(yīng)用程序編程接口(API ),無論是對任何一種
客戶/ 服務(wù)器關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS ),還是最流行索引順序
訪問方法(ISAM)數(shù)據(jù)庫(Jet、Foxpro), 都能很好的訪問。
同時,由于BDE 的驅(qū)動程序主要直接來自于第三方開發(fā)商,所以,
對于像Oracle這些非微軟的數(shù)據(jù)庫,執(zhí)行效率上比較高。正是這些特點,
使BDE 技術(shù)還是得到了很多數(shù)據(jù)庫開發(fā)程序員的歡迎。
ADO 技術(shù)是微軟提出來的處理關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的新
技術(shù),它基于微軟被稱為OLE DB的數(shù)據(jù)訪問模式,它是專門為了給大范
圍商業(yè)數(shù)據(jù)源提供訪問而設(shè)計的,包括傳統(tǒng)的關(guān)系型數(shù)據(jù)表、電子郵件
系統(tǒng)、圖形格式、Internet資源等。ADO 所需內(nèi)存更少,更適合大流量
和大事務(wù)量的網(wǎng)絡(luò)計算機系統(tǒng)。
ADO 頂層有三個對象:Connection、Command、Recordset。
Connection用以指定數(shù)據(jù)源,建立和數(shù)據(jù)源的連接。
Command 對象用以對數(shù)劇源執(zhí)行指定的命令,可以接受SQL 語句,
表和存儲過程的名稱,執(zhí)行SQL 查詢,更新數(shù)據(jù),插入紀錄等。
Recordset 對象表示的是來自表或命令執(zhí)行結(jié)果的記錄全集,操縱
來自提供者的幾乎所有數(shù)據(jù)。
由于ADO 技術(shù)的迅速普及,從Delphi 5.0 開始,加入了ADO 技術(shù)
的模塊,并逐步成為Delphi數(shù)據(jù)庫設(shè)計的主流。但是,和VB的ADODC 相
比,它還是有所不同的,在數(shù)據(jù)綁定上,它更多的吸收了BDE 的特點,
以做到和原來的程序兼容,同時,它又可以接受標準ADO 技術(shù)的各種屬
性和方法,在接受這些屬性和方法時,它是和數(shù)據(jù)綁定控件脫離的,當(dāng)
然從某種意義上來說,這種方案提高了執(zhí)行效率,給設(shè)計人員以更多的
選擇。
dbExpress 是Delphi 6.0加入的最新的數(shù)據(jù)庫模塊,它不使用緩存,
可以快速瀏覽大量的數(shù)據(jù),但是,不使用緩存就不能更改,所以它的標
準方式是只讀的。它一個重要的特點是交叉平臺,可以和Linux 數(shù)據(jù)庫
連接,速度相當(dāng)快。
下面的討論,將以ADO 技術(shù)為主線,最后再說明BDE 和dbExpress
的應(yīng)用方式。
第二節(jié) ADO 面板的主要組件
ADO 面板一共有7 個組件:
ADOConnection: 主要用于建立數(shù)據(jù)庫的連接;
ADOdataSet:ADO 提取和操作數(shù)據(jù)庫的主要數(shù)據(jù)集,可以直接連接
到數(shù)據(jù)庫,也可以通過 ADOConnection連接到數(shù)據(jù)庫。
ADOtable:主要用以操作和提取單個基表的數(shù)據(jù),可以直接連接到
數(shù)據(jù)庫,也可以通過 ADOConnection連接到數(shù)據(jù)庫。
ADOquery:通過SQL 語言提取數(shù)據(jù),其連接數(shù)據(jù)庫的方式和前兩種
一樣。
ADOStoredProc: 這個組件專門用于運行數(shù)據(jù)庫中的存儲過程。
ADOCommand:該組件用于運行一些SQL 命令,這個組件可以和支持
數(shù)據(jù)集的組件一起使用,也可以直接從一個基表中提取一個數(shù)據(jù)集。
RDSConnection: 一個進程或一臺計算機傳遞到另一個進程或計算
機的數(shù)據(jù)集合。
為了連接數(shù)據(jù)綁定控件,上述組件往往要和處于Data Access 中的
Datasource配合使用。
可以看出,和VB的ADODC 不同的,Delphi中解決同一個問題提供了
多種方案,看起來似乎增加了麻煩,但是卻可以給程序員更大的自由空
間,便于設(shè)計出高效率的數(shù)據(jù)庫程序來。
下面通過幾個例子來說明ADO 控件的用法。
第三節(jié) ADOtable組件
ADOtable、ADOdataSet、ADOquery和ADOStoredProc都繼承了同一
個父類TCustomADODataSet,所以,在屬性事件和方法上有很多相似的
地方,但它主要是針對數(shù)據(jù)庫中的表進行操作。
ADO -〉A(chǔ)DOtable
屬性:
Name='控件名'
ConnectionString='連接字符串'
可以通過點擊右邊的按鈕,通過向?qū)Ы?shù)據(jù)源。有時候需要
知道相對路徑,可以用下面的方法找到程序當(dāng)前的路徑:
tpath:=ExtractFilepath(Application.Exename);
文件名:=Tpath+'..\data\Test.mdb'
表明數(shù)據(jù)庫在當(dāng)前程序上一層的Data文件夾下。
TableName='表名'
Active=true
這就激活了數(shù)據(jù)源,為了和綁定控件聯(lián)系,要增加一個DadaSource
控件。事實上,所有的綁定控件都是和DadaSource聯(lián)系。
Data Access-〉DadaSource
屬性:
Dataset=ADOtable.Name
加入綁定控件:
Data Controls-〉
DBgrid(表格)
屬性
DadaSource='DadaSource.Name'
DBNavigator(導(dǎo)航條)
屬性
DadaSource='DadaSource.Name'
運行一下可以看出關(guān)系
下面介紹一下ADOtable的一些重要的方法,這些方法大部分和Table
是兼容的。
為了便于敘述,ADOtable控件的Name定為 ADOtable1
1)移動指針
第一個: ADotable1.First;
最后一個: ADotable1.Last;
下一個: ADotable1.Next;
前一個: ADotable1.Prior;
2)從字段中取出數(shù)據(jù)
通過如下方法可以訪問字段的值
ADOtable1.FieldValues['字段名']
ADOtable1.Field[索引值]
在讀寫字段的時候,又是根據(jù)需要可以加上強制類型轉(zhuǎn)換
例如:
Edit1.text:=ADOtable1.Field[0].AsString;
用下面的方法可以去除字段的性質(zhì):
ADOtable1.fielddefs[索引值].name; 字段名
ADOtable1.fielddefs[索引值].Size; 字段大小
ADOtable1.fielddefs[索引值].Datatype; 字段屬性
3)修改數(shù)據(jù):
修改數(shù)據(jù)的時候,需要先建立EDIT方法,然后用Post方法才能真
正的寫入。
ADOtable1.edit;
ADOtable1.FieldValues['姓名']:='王秀琴';
ADOtable1.post;
4)增加一條空紀錄: ADOtable1.append;
新增紀錄也可以用如下方法,在新增紀錄的同時輸入數(shù)據(jù)
ADOtable1.appendRecord(xxx,xxx,xxx,....);
5)刪除當(dāng)前紀錄:ADOtable1.delete;
如果在ADOtable1的OnBeforeDelete方法中寫下:
if messagedlg('確實要刪除嗎?',mtinformation,[mbyes,mbno],
0)=mrno then abort();
可以實現(xiàn)刪除前的提示。
6)過濾
可以用如下的方法實現(xiàn)數(shù)據(jù)的過濾
在ADOtable1的OnFilterRecord方法中寫下:
Accept:=(條件);
然后
ADOtable1.filtered:=true; 為實現(xiàn)過濾。
ADOtable1.filtered:=false; 為解除過濾。
7)指針在文件的頭尾
指針在最后一條記錄之后 ADOtable1.Eof
指針在第一條記錄之前 ADOtable1.Bof
如此可以實現(xiàn)對數(shù)據(jù)庫的遍歷
form1.ADOtable1.first;
while not form1.ADOtable1.eof do
Begin
.......
form1.ADOtable1.next;
End;
8)此外, ADOtable組件還繼承了ADO 中的RecordSet對象幾乎
全部屬性和方法,簡述如下:
with adoTable1.Recordset do
begin
//屬性
PageSize 一頁所包含的記錄數(shù)
PageCount 數(shù)據(jù)的頁數(shù)
AbsolutePage; 當(dāng)前記錄所在頁
AbsolutePosition; 當(dāng)前記錄的序號位置
BOF; 指針在第一個記錄之前
EOF; 指針在最后一個記錄之后
//方法
AddNew fieldList,Values; 創(chuàng)建新記錄,其中fieldList為用數(shù)
組表示的字段名集,Values為用數(shù)組表
示的數(shù)據(jù)集。
Cancel; 取消上一步所作的修改
Update Fields,Values; 保存對當(dāng)前記錄所作的修改
Delete; 刪除當(dāng)前記錄
Move(n); 移動n 條記錄
MoveFirst; 移動到第一條紀錄
MoveLast; 移動到最后一條紀錄
MoveNext 移動到下一條紀錄
MovePrevious 移動到上一條紀錄
Requery; 通過從新執(zhí)行對象所基于的查詢,以
更新RecordSet 對象中的數(shù)據(jù)。
end;
使用Recordset 對象來處理數(shù)據(jù)集的數(shù)據(jù),會發(fā)現(xiàn)數(shù)據(jù)幫定控件的指
針一般不會跟著移動,這實際上給設(shè)計者提供了另一個在后臺快速處理數(shù)
據(jù)的方法。
附錄:關(guān)于TActionList控件的使用
在Standard面板,提供了一個TActionList 控件,它集中了大部分按
鈕的使用方法,可以簡化按鈕的設(shè)計。
方法:
調(diào)入TActionList,雙擊,可以看到一個面板,右鍵 -〉New Standard
Action 選擇 Datasat下的適當(dāng)?shù)目刂?,可以選擇多個。
以后加入的開關(guān),只要在屬性Action 中選擇適當(dāng)?shù)捻椖烤涂梢粤?,?/p>
需要專門編程,實例見“ActionList應(yīng)用”。
第四節(jié) ADOQuery組件
和ADOtable組件一樣,ADOquery繼承了同一個父類TCustomADODataSet,
所以,上面說到的ADOtable屬性事件和方法基本上是通用的,但它主要是
針對數(shù)據(jù)庫中的SQL 命令進行操作。
下面主要說一下ADOquery特殊的地方。
1)SQL 屬性
SQL 是TStrings類型的屬性,包含了ADOquery組件要執(zhí)行的SQL 命令,
是ADOquery最為重要的屬性之一。
在應(yīng)用程序中,需要調(diào)用Open方法或者ExecSQL 方法來執(zhí)行在SQL 中
的命令。在設(shè)計階段,可以利用屬性編輯起來編寫。
例如:
Width ADOquery do
Begin
//重新寫入時,要關(guān)閉原來的查詢
Close;
width SQL do
Begin
//因為Add是在原來的基礎(chǔ)上加入,所以先清除原來的SQL命令
Clear;
Add('selsct 編號,姓名,獎金')
Add('From 獎金表')
End;
//執(zhí)行SQL 命令
Open;
End;
查詢命令也可以這樣來寫:
s1:='編號';
s2:='姓名';
s3:='金額';
with ADOquery1 do
begin
sql.Clear;
SQL.Add('select ');
SQL.Add(s1+','+s2+','+s3);
SQL.Add(' From 獎金 ');
execsql;
active:=true;
end;
效果是一樣的。
第五節(jié) ADOConnection 和 ADODataSet
雖然ADOTable和ADOQuery組件可以非常簡單的連接數(shù)據(jù)庫,但是當(dāng)需
要更加精細的控制數(shù)據(jù)庫的時候,往往需要應(yīng)用ADO 更多的方法,我們知
道,支撐ADO 的主要由Connection,Command,Recordsrt三個對象組成,
對應(yīng)的就有ADOConnection和ADOCommand控件,而Recordsrt對象屬性和方
法,封裝在ADODataSet中,同時ADODataSet本身,也具備和ADOtable組件
相同的對數(shù)據(jù)綁定控件控值的屬性和方法。
這就大大提高了對數(shù)據(jù)庫的控制能力。
在ADO 頂層有三個對象中Connection處在最頂層,用以指定數(shù)據(jù)源,
建立和數(shù)據(jù)源的連接。所以,ADOConnection必須和其它的數(shù)據(jù)控件連接
才有效,最常用的就是和ADODataSet配合。
下面首先介紹連接方法,然后再討論其它的問題
1)ADOConnection的加入和連接
加入ADOConnection
屬性:ConnectionString='連接字符串'
加入ADODataSat
屬性:Connection='ADOConnection1' ..... (ADOConnection,Name)
CommandType=cmdtable ...使用表連接
CommandText 根據(jù)上面的選擇,或選擇表,或出現(xiàn)SQL 編輯框。
Active=True 激活。
加入DataSource
屬性:Dataset=ADODataSat 完成連接,再連接數(shù)據(jù)綁定控件。
2)ADOConnection的重要屬性和方法
屬性:
a).Attributes
設(shè)置連接的數(shù)據(jù)庫自動處理事務(wù)的能力
xCommitRetaining:提交一個事務(wù)后自動開始一個新事務(wù)
xAbortRetaining :回退一個事務(wù)的同時開始一個新事務(wù)
b).Connected
標識和數(shù)據(jù)庫的連接受否處于激活(True)
方法:
c).Open(UserID,PassWord)
打開一個連接(可以提供用戶名和密碼)
d).Cancel
關(guān)閉數(shù)據(jù)庫的連接
e).Close
釋放所有的系統(tǒng)關(guān)聯(lián)資源
f).Execute 執(zhí)行一個SQL 命令。
完整的表述是
Execute(SQL命令,該命令設(shè)計的記錄數(shù)目,Option)
其中,Option的值如下
eoAsyncExecute 異步執(zhí)行指定的命令
eoAsyncFetch 給定Cache屬性的值后,再異步的取得數(shù)據(jù)
eoAsyncFetchNonBlocking 非阻塞式線程執(zhí)行
eoExecuteNoRecords 沒有返回紀錄
g).GetProcedureNames(List:Tstring);
獲取數(shù)據(jù)庫服務(wù)器上的存儲過程名稱,過程名保留在List參
數(shù)中。
f).GetTableNames(List:Tstring;SystemTables:Boolean=False)
獲取數(shù)據(jù)庫的數(shù)據(jù)表,表名存放在List參數(shù)中,SystemTables
指示是否獲取數(shù)據(jù)庫系統(tǒng)表的名稱,系統(tǒng)表是關(guān)于數(shù)據(jù)庫類型定義
和用戶信息的數(shù)據(jù)表,是數(shù)據(jù)庫本身自動產(chǎn)生的。在特殊的設(shè)計中,
這個表格可能會有用。
3)ADODataSet的屬性和方法
我們在ADOTable中討論的屬性和方法,幾乎都可以在ADODataSet中得
到應(yīng)用,但還有幾個特殊的屬性:
CommandType
主要用于控制CommandText屬性的狀態(tài),其中:
cmdtable ...CommandText使用“表名”連接
(內(nèi)部是做了SQL 對各列的查詢);
cmdTableDirect ...CommandText使用“表名”連接
(內(nèi)部不做SQL ,而是真正的表名連接);
cmdtext ....使用SQL命令文本;
cmdfile ....CommandType屬性值作為持久的文件名;
cmdStoredProc...CommandType屬性值作為存儲過程名稱
來計算;
cmdUnKnown ....不知道(默認為SQL)
CommandText
根據(jù)CommandType的設(shè)置,向提供者發(fā)出“表名”或SQL 命令。
1. 新建一個FORM。在控件欄找到ADO一欄,把里面的ADOConnection和ADOQuery兩個各建立一個放在FORM里。這兩個控件運行后是不可見的,所以你可以隨便放在FORM的任何位置。然后再找到DATA ACCESS一欄,把它下屬的DataSource控件拖一個放到FORM里。用這三個控件就可以建立連接了。
2.設(shè)置相關(guān)屬性,首先我們設(shè)置ADOConnection,這個控件就是與數(shù)據(jù)連接的控件。雙擊它彈出配置窗口,單擊BUILD..按鈕,出現(xiàn)數(shù)據(jù)庫鏈接屬性窗口,ACCESS數(shù)據(jù)庫就選擇有個JET4.0什么的那個數(shù)據(jù)庫,如果是本地的數(shù)據(jù)庫可以在下拉列表選擇服務(wù)器名稱或者自己直接輸入服務(wù)器名稱(遠程的直接輸入IP即可),然后輸入登錄密碼和選擇數(shù)據(jù)庫。設(shè)置完成點擊測試連接,顯示成功說明鏈接正常,單擊完成退出設(shè)置。
3 ADOQuery這個控件是用SQL操作數(shù)據(jù)庫的,在它的屬性欄有個connection屬性,點擊它的下拉菜單選擇剛剛建立好的ADOConnection1,DataSource控件則是存放結(jié)果的地方,把它的DataSet屬性設(shè)置成ADOQuery1。這樣我們就可以通過調(diào)用ADOQuery來對數(shù)據(jù)庫進行操作了。
4 鏈接好數(shù)據(jù)庫以后就可以對數(shù)據(jù)庫進行操作了。最常見的用法是建立一個DBGRID,然后把他的connection屬性選成我們的Datasource1。如果你想預(yù)先設(shè)置好SQL語句的話,在ADOQUERY的左邊屬性欄里的SQL欄,點那個三個點的省略號輸入你想查詢的SQL語句。然后ACTIVE屬性設(shè)置成TRUE,這樣一運行,在DBGRID里就會顯示你的SQL查詢結(jié)果了。
你這樣找很難找的,本身sql放在程序里就是一堆字符串,不容易辨認,再加上字符串都是相加最后到一起的,就難上加難了。
解決方法其實很簡單,你可以用事件探查器跟蹤一下數(shù)據(jù)庫腳本,把腳本放到查詢分析器里一執(zhí)行,錯在哪就看的清楚了。
也可以在程序里輸出出來看。
名稱欄目:包含nosqldelphi的詞條
網(wǎng)站地址:http://jinyejixie.com/article46/dssoceg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站設(shè)計公司、全網(wǎng)營銷推廣、App開發(fā)、云服務(wù)器、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)