麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

動態(tài)創(chuàng)建ClientDataSet的表定義

2019-11-18 18:29:54
字體:
供稿:網(wǎng)友
 

                               前言

很多人都在問,ClientDataSet如何才能在不連接數(shù)據(jù)庫得情況下,用程序創(chuàng)建起來,并打開數(shù)據(jù)集。

在研究了一下TClientDataSet數(shù)據(jù)集后,發(fā)現(xiàn)如果要讓ClientDataSet打開的話(Open),必須滿足三個條件中的一個:

  1. PRoviderName屬性賦值,即有數(shù)據(jù)源提供者。
  2. Data屬性賦值。即從其它已經(jīng)打開的數(shù)據(jù)集中獲得表結(jié)構(gòu)和數(shù)據(jù)。
  3. FileName賦值,即從本地文件獲取數(shù)據(jù)和MetaData。

這三個條件是TClientDataSet的Active屬性的幫助中說的。思考一下,第一和第二基本被排除,我如果有了現(xiàn)成的數(shù)據(jù)集,還要創(chuàng)建干嗎?第三個又不是那么容易,你哪知道文件的格式是什么呢?

那到底該怎么做呢?

                         失敗的嘗試

突然想起TClientDataSet中支持InternalCalc(內(nèi)部計算)字段。內(nèi)部計算字段可以在設(shè)計期加進(jìn)去,或者也可以在運行期動態(tài)加入。我們?yōu)榱朔奖悖驮谠O(shè)計期加入。見下圖:

可以通過雙擊控件(TClientDataSet)進(jìn)入字段編輯器,然后右鍵選擇“New Field”命令,得到如圖所示的界面。填寫Name,Type和FieldType。

記住:FieldType一定要是“InternalCalc”。如此反復(fù),你可以選擇添加多個字段。

打開!報錯:“ProviderName”或Data沒有賦值。

這個方法不正確,既然要Data,我嘗試著,從其它ClientDataSet的Data屬性賦值上。得到結(jié)果是:自己新建的字段和數(shù)據(jù)源的字段都顯示。

我又進(jìn)行了進(jìn)一步的嘗試:那就是讓這個有著新建的字段和原有字段的ClientDataSet的Data賦值到另一個新的ClientDataSet上,卻發(fā)現(xiàn)新建的字段沒有進(jìn)入。

總得來說,這次嘗試是失敗的,不過有如下總結(jié):

  1. 光靠新建內(nèi)部計算字段是不可行的。
  2. 新建的計算字段不可以進(jìn)入Data屬性而被傳遞給第二個ClientDataSet。

                               xml

又是XML!ClientDataSet本就是斷開連接的數(shù)據(jù)集控件,應(yīng)此提供了將數(shù)據(jù)緩存到磁盤的功能SaveToFile(),其詳細(xì)聲明如下:

  procedure SaveToFile(const FileName: string = ''; Format: TDataPacketFormat = dfBinary);

注意到其中的TDataPacketFormat。它是個枚舉類型,全部的枚舉值如下:

  TDataPacketFormat = (dfBinary, dfXML, dfXMLUTF8);

大家可能注意到了,dfBinary和dfXMLUTF8都不是我們需要關(guān)心的,關(guān)心一下我們的dfXML格式。這是個讓人興奮的消息。有了XML,我們就可以查看ClientDataSet的MetaData的定義,而且更有了修改的可能!

調(diào)用一下SaveToFile功能,注意保存格式為dfXML。打開文件,如下顯示:

  <?xml version="1.0" standalone="yes" ?> - <DATAPACKET Version="2.0">- <METADATA>- <FIELDS>-  <FIELD attrname="NormInfoID" fieldtype="i4">    <PARAM Name="PROVFLAGS" Value="7" Type="i4" Roundtr

看這個全部的,比較混亂,先看一下結(jié)構(gòu):

  <?xml version="1.0" standalone="yes" ?> - <DATAPACKET Version="2.0">  + <METADATA>    <ROWDATA />   </DATAPACKET>

這下比較清楚了:

整個XML定義為一個DataPacket,DataPacket包括兩個部分:MetaData和RowData。顯然對我們來說,RowData可以忽視,到時候?qū)owData的節(jié)點清空就是。而MetaData呢?

看看全部的XML格式,可以看出:MetaData包括Fields和Params。即字段和數(shù)據(jù)集參數(shù)。

字段

先重點考慮Fields。看一下Field節(jié)點的定義,大概可以看出一些:

  1. attrname是指FieldName
  2. fieldtype是指字段類型
  3. width是需要寬度的字段類型的參數(shù)
  4. 如果需要定義字段的屬性,再加上<Param />節(jié)點

下面我們來研究一下字段類型,我想這也是最主要的!其它屬于高級用法。

MSSQL TypefieldtypeWIDHTSUBTYPEDECIMALSREADONLY
Binarybin.hex50   
Bitboolean    
Charstring10FixedChar  
DateTimedateTime    
Decimalfixed18   
Floatr8    
Imagebin.hex Binary  
Inti4    
Moneyfixed19 4 
nCharstring.uni20   
nTextbin.hex Text  
Numericfixed18   
nVarCharstring.uni100   
SmallDateTimedateTime    
Realr8    
SmallInti2    
SmallMoneyfixed10 4 
Textbin.hex Text  
TimeStampbin.hex8  true
tinyInti2    
UniqueIdentifierstring38Guid  
VarBinarybin.hex50Binary  
VarCharstring50   

見上表,這是我在SQLServer2000中,將所有類型的字段都用上,然后在ClientDataSet中得到的,類型對應(yīng)關(guān)系。注意到有SubType屬性,來幫助決定類型。其中沒有值的單元格,表示該屬性沒有用到。寬度值中,除了UniqueIdentifier是38外,其余都是采用系統(tǒng)默認(rèn)寬度。

分析一下這一張表,可以得到如下一些特點:

  1. 后綴uni表示unicode,沒有后綴,則表示是AnsiCode
  2. 后綴hex表示16進(jìn)制
  3. i后的數(shù)字表示整數(shù)所占用的位數(shù),默認(rèn)為4位
  4. r8表示8位浮點數(shù)

                     字段參數(shù)

注意到某些字段的定義下有節(jié)點:

<PARAM Name="PROVFLAGS" Value="7" Type="i4" Roundtrip="True" /> 

先來解釋一下“PROVFLAGS”,在Delphi的源碼里查找可以發(fā)現(xiàn)其實就是對應(yīng)著TField的屬性ProviderFlags,那么7也就是好理解的了。

看TProviderFlag和TProviderFlags的定義

  TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden);  TProviderFlags = set of TProviderFlag;

既然是集合,那么7很顯然就是一個集合的整數(shù)表示:按順序排的話,7其實就是表示結(jié)合[pfInUpdate, pfInWhere, pfInKey]。

不過不知道為什么,查看TField的屬性,pfInKey不在集合中。

                                 MetaData屬性

看看

  <PARAMS DEFAULT_ORDER="1" PRIMARY_KEY="1" /> 

可以看出DEFAULT_ORDER和PRIMARY_KEY的意思,但是后面的值呢?研究之后,發(fā)現(xiàn),它是主鍵或索引字段的Index。如果同時兩個字段都是索引,那么它的格式是:"1 2",中間采用空格隔開。

                            如何使用XML格式?

好了,格式大概都知道了,現(xiàn)在問題是如何轉(zhuǎn)載到ClientDataSet呢?

文件是可以,但是顯然不滿足我們當(dāng)初的需求,在查看一下接口定義,發(fā)現(xiàn)除了LoadFromFile還有LoadFromStream。查看一下源碼,其實LoadFromFile就是調(diào)用了LoadFromStream。

好了,只要我們創(chuàng)建了這樣的XML流,就可以動態(tài)創(chuàng)建ClientDataSet了!

至于如何創(chuàng)建XML流,不在此討論了


上一篇:如何使程序在運行時自動注冊ActiveX控件

下一篇:用跨進(jìn)程子類化技術(shù)實現(xiàn)對其它進(jìn)程消息的攔載

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 国产69久久精品成人看 | 一级毛片免费大片 | 欧美一区二区三区久久精品视 | 欧美人与牲禽动交精品一区 | 成人黄色短视频在线观看 | 草久影视| 亚洲日色 | 人人看人人舔 | 免费观看一区二区三区 | 一级全毛片 | 黄www片 | 国产精品剧情一区二区三区 | 亚洲一区二区三区高清视频 | 国产精品成年片在线观看, 激情小说另类 | 色婷婷久久久久久 | 久久精品国产亚洲7777 | 看国产一级毛片 | 日本在线免费观看 | 国产一区二区三区黄 | 国产精品久久77777 | 国产成人高清成人av片在线看 | 欧美性生交大片 | 欧美视频在线一区二区三区 | 国产成人高潮免费观看精品 | 91精品国产91久久久 | fc2国产成人免费视频 | 毛片视频网址 | 黄色免费在线电影 | 国产99视频精品免视看9 | 日日操夜夜操视频 | 免费在线观看午夜视频 | 国产精品一区二区三区在线 | 日韩精品久久久久久久电影99爱 | 久久久久久高清 | 蜜桃一本色道久久综合亚洲精品冫 | 羞羞的视频在线 | 视频一区国产精品 | 精品视频 久久久 | 亚洲性生活免费视频 | 国产二区三区视频 | 成人国产精品久久 |