亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

動態創建ClientDataSet的表定義

2019-11-18 18:29:54
字體:
來源:轉載
供稿:網友
 

                               前言

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

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

  1. PRoviderName屬性賦值,即有數據源提供者。
  2. Data屬性賦值。即從其它已經打開的數據集中獲得表結構和數據。
  3. FileName賦值,即從本地文件獲取數據和MetaData。

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

那到底該怎么做呢?

                         失敗的嘗試

突然想起TClientDataSet中支持InternalCalc(內部計算)字段。內部計算字段可以在設計期加進去,或者也可以在運行期動態加入。我們為了方便,就在設計期加入。見下圖:

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

記?。篎ieldType一定要是“InternalCalc”。如此反復,你可以選擇添加多個字段。

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

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

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

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

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

                               xml

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

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

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

  TDataPacketFormat = (dfBinary, dfXML, dfXMLUTF8);

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

調用一下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

看這個全部的,比較混亂,先看一下結構:

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

這下比較清楚了:

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

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

字段

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

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

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

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中得到的,類型對應關系。注意到有SubType屬性,來幫助決定類型。其中沒有值的單元格,表示該屬性沒有用到。寬度值中,除了UniqueIdentifier是38外,其余都是采用系統默認寬度。

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

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

                     字段參數

注意到某些字段的定義下有節點:

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

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

看TProviderFlag和TProviderFlags的定義

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

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

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

                                 MetaData屬性

看看

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

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

                            如何使用XML格式?

好了,格式大概都知道了,現在問題是如何轉載到ClientDataSet呢?

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

好了,只要我們創建了這樣的XML流,就可以動態創建ClientDataSet了!

至于如何創建XML流,不在此討論了


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

下一篇:用跨進程子類化技術實現對其它進程消息的攔載

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美一级片| 欧美精品激情视频| 日韩电影免费观看中文字幕| 97视频在线观看视频免费视频| 亚洲精品久久久久久久久久久久| 91在线视频九色| 青青精品视频播放| 欧美日韩中文字幕在线| 欧美高清在线视频观看不卡| 一区二区在线免费视频| 国产成人精品日本亚洲专区61| 亚洲2020天天堂在线观看| 中文字幕自拍vr一区二区三区| 91系列在线播放| 国内精品久久久久影院优| 亚洲成年人在线播放| 97久久精品人人澡人人爽缅北| 日韩欧美国产网站| 国产精品入口日韩视频大尺度| 亚洲午夜小视频| 久久久91精品| 欧美视频13p| 国产91精品青草社区| 国产日本欧美在线观看| 欧美国产极速在线| 欧美多人爱爱视频网站| 亚洲三级av在线| 日韩电影免费观看在线| 国产精品高潮呻吟视频| 亚洲成人网av| 中文字幕日韩高清| 欧美性猛交xxxx黑人| 日韩欧美第一页| 日韩在线观看你懂的| 日韩免费在线免费观看| 日韩有码在线电影| 不卡av在线播放| 欧美视频精品一区| 日韩在线观看高清| 久久久国产精彩视频美女艺术照福利| 欧美精品在线第一页| 国产999精品久久久影片官网| 国产精品第一视频| 久久国产视频网站| 91av在线不卡| 在线成人中文字幕| 亚洲欧美日韩精品久久| 国产日韩在线观看av| 国产精品欧美激情| 亚洲欧美国内爽妇网| 欧美激情精品久久久| 伊人久久久久久久久久久| 日韩免费视频在线观看| 最近2019中文字幕在线高清| 精品综合久久久久久97| 岛国av一区二区在线在线观看| 国产亚洲精品久久久久久777| 国产91精品视频在线观看| 国产suv精品一区二区| 成人在线视频福利| 97超碰国产精品女人人人爽| 国产精品久久久久久中文字| 亚洲国产成人av在线| 亚洲成人av在线播放| 亚洲缚视频在线观看| 亚洲精品欧美日韩| 欧美久久精品午夜青青大伊人| 亚洲国产成人久久综合| 国产欧美婷婷中文| 日韩精品亚洲视频| 日韩精品高清在线观看| 国产一级揄自揄精品视频| 亚洲xxxx视频| 欧美性猛交xxxx富婆弯腰| 亚洲伦理中文字幕| 欧美精品激情在线| 日韩欧美一区二区三区久久| 日本免费一区二区三区视频观看| 成人啪啪免费看| 亚洲a在线播放| 日韩高清av在线| 国产精品自产拍高潮在线观看| 狠狠躁18三区二区一区| 日韩在线中文字幕| 成人网在线观看| 国产精品十八以下禁看| 久久亚洲国产精品成人av秋霞| 69av在线播放| 性欧美在线看片a免费观看| 欧美精品一区二区免费| 久久久久北条麻妃免费看| 国产精品一区二区三区在线播放| 久久亚洲欧美日韩精品专区| 91亚洲va在线va天堂va国| 在线日韩精品视频| 精品久久在线播放| 日韩久久精品电影| 国内精品美女av在线播放| 日韩成人网免费视频| 国产精品一区二区三| 亚洲美女在线视频| 亚洲电影免费在线观看| 中文字幕欧美日韩| 亚洲国产精品成人一区二区| 欧美午夜片欧美片在线观看| 欧美高清在线观看| 欧美日韩国产综合视频在线观看中文| 国产综合福利在线| 欧美精品videos性欧美| 国产精品视频地址| 91香蕉嫩草神马影院在线观看| 高清一区二区三区日本久| 97人人模人人爽人人喊中文字| 亚洲国产高清福利视频| 亚洲美女视频网| 欧美性精品220| 亚洲高清不卡av| www.亚洲天堂| 久久久精品在线观看| 亚洲a级在线观看| 午夜精品久久久久久久久久久久久| 精品久久久久久久久中文字幕| 中文字幕精品—区二区| 亚洲va欧美va国产综合剧情| 欧美大人香蕉在线| 国产精品揄拍500视频| 色综合久综合久久综合久鬼88| 久久久在线观看| 17婷婷久久www| 国产va免费精品高清在线| 91精品国产综合久久香蕉的用户体验| 一色桃子一区二区| 欧美日韩高清区| 欧美在线视频观看免费网站| 久久亚洲精品一区二区| 国产精品偷伦免费视频观看的| 91精品综合视频| 欧美日韩另类视频| 2018中文字幕一区二区三区| 国产精品久久久久久久av大片| 中文字幕日韩欧美精品在线观看| 国产成人一区二区三区小说| 亚洲va欧美va国产综合久久| 亚洲天堂av图片| 国产精品嫩草影院久久久| 亚洲最大av在线| 亚洲伊人一本大道中文字幕| 国模精品系列视频| 久久久久久久久久国产精品| 色偷偷9999www| 亚洲在线www| 午夜精品久久久久久久久久久久| 国产日韩精品一区二区| 亚洲成人网av| 欧美日韩国产综合视频在线观看中文| 成人精品一区二区三区| 亚洲最新av网址| 欧美性猛交xxxx免费看漫画| 亚洲网站在线观看| 成人情趣片在线观看免费| 久久久久久久久久婷婷| 日韩精品在线观看网站| 亚洲视频第一页| 国产亚洲视频在线观看|