首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> Discuz!专栏
动态创建clientdataset的表定义_delphi教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
 

                               前言

很多人都在问,ClientDataSet如何才能在不连接数据库得情况下,用程序创建起来,并打开数据集。

在研究了一下TClientDataSet数据集后,发现如果要让ClientDataSet打开的话(Open),必须满足三个条件中的一个:

  1. ProviderName属性赋值,即有数据源提供者。
  2. Data属性赋值。即从其它已经打开的数据集中获得表结构和数据。
  3. FileName赋值,即从本地文件获取数据和MetaData。

这三个条件是TClientDataSet的Active属性的帮助中说的。思考一下,第一和第二基本被排除,我如果有了现成的数据集,还要创建干吗?第三个又不是那么容易,你哪知道文件的格式是什么呢?

那到底该怎么做呢?

                         失败的尝试

突然想起TClientDataSet中支持InternalCalc(内部计算)字段。内部计算字段可以在设计期加进去,或者也可以在运行期动态加入。我们为了方便,就在设计期加入。见下图:

可以通过双击控件(TClientDataSet)进入字段编辑器,然后右键选择“New Field”命令,得到如图所示的界面。填写Name,Type和FieldType。

记住:FieldType一定要是“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" Roundtrip="True" /> 
   </FIELD>
   <FIELD attrname="Description" fieldtype="string.uni" WIDTH="160" /> 
   <FIELD attrname="NormInfoVal" fieldtype="string.uni" WIDTH="510" /> 
   <FIELD attrname="NewField" fieldtype="i4" /> 
   <FIELD attrname="Boolean" fieldtype="Boolean" /> 
   <FIELD attrname="Date" fieldtype="date" /> 
   <FIELD attrname="Time" fieldtype="time" /> 
  </FIELDS>
  <PARAMS DEFAULT_ORDER="1" PRIMARY_KEY="1" /> 
  </METADATA>
  <ROWDATA /> 
  </DATAPACKET>

看这个全部的,比较混乱,先看一下结构:

  <?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 Type fieldtype WIDHT SUBTYPE DECIMALS READONLY
Binary bin.hex 50      
Bit boolean        
Char string 10 FixedChar    
DateTime dateTime        
Decimal fixed 18      
Float r8        
Image bin.hex   Binary    
Int i4        
Money fixed 19   4  
nChar string.uni 20      
nText bin.hex   Text    
Numeric fixed 18      
nVarChar string.uni 100      
SmallDateTime dateTime        
Real r8        
SmallInt i2        
SmallMoney fixed 10   4  
Text bin.hex   Text    
TimeStamp bin.hex 8     true
tinyInt i2        
UniqueIdentifier string 38 Guid    
VarBinary bin.hex 50 Binary    
VarChar string 50      

见上表,这是我在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流,不在此讨论了


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Eclipse + Lomboz + Tomcat JSP 开发配置-JSP教程,Jsp/Servlet
·利用Java调用可执行命令实例-JSP教程,Java技巧及代码
·彻底搞定JSP在线人数-JSP教程,Jsp/Servlet
·数据库操作类实现(C#,SqlClient)-.NET教程,C#语言
·在C#中实现打印功能(C#中PrintDialog,PrintDocument的使用)-.NET教程,C#语言
·结合PHP使用HTML表单(2)-PHP教程,PHP应用
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码
·解析.Net框架下的XML编程技术-.NET教程,XML应用
·ASP.net Logion用户登陆验证代码-.NET教程,Asp.Net开发
·Java中精确计算的一个类用BigDecimal-JSP教程,Java技巧及代码
最新文章
·超越adsense:另类方法赚取巨额收益_网赚技巧
·google adwords优化技巧_网赚技巧
·自己误点adsense广告不用再通知google了_网赚技巧
·用fireworks滤镜轻松制作可爱gif动画_fireworks教程
·网站赚钱:google关键词广告创建的十二高招_站长心得
·提升网站使用性 打造实用性网站_站长心得
·最快速登录到google的10点主要经验_google推广
·制作主页的四十个技巧1_站长心得
·利用rss和gmail备份你的blog_站长心得
·seo终极方法_seo网站优化
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭