辨析 Field、FieldDef、Fields、FieldDefs、FieldList、FieldDefList

1、Fields 是 Field 的集合, 它们主要用于运行时对字段元数据和字段值的访问.

2、FieldDefs 是 FieldDef 的集合, 它们主要用于构建数据集(表)和对字段元数据的访问.

3、FieldList 和 FieldDefList 分别是访问 Field 和 FieldDef 的快捷列表; 主要使用其 FieldByName、Find 方法和默认的数组属性访问数据; 它们是只读的.

4、通过 Fields、FieldList、Field 可以得到更多信息, 但必须是在数据集打开的情况下;
通过 FieldDefs、FieldDefList、FieldDef 只能获取定义时的信息, 但即使在数据集关闭时也能使用.

5、顾名思义 FieldDef 是用于定义表的, 但通过 Field 也可以定义表;
用 FieldDef 定义表很方便, 用 Field 可以定义一些更复杂的表;
每个 FieldDef 都会对应一个 Field, 但一个 Field 不一定有 FieldDef 对应;
程序运行后 FieldDef 不能再改变, 而 Field 与 Fields 则可以动态改变或增减.

设计时两者是结合使用的.

  下面是通过三种方法动态建表的代码:

//使用 TFieldDef 建表:  
begin 
 with  ClientDataSet1.FieldDefs do 
 begin 
  Add('Name' , ftString, 12,  True); { True 表示是必填字段 } 
  Add('Age', ftInteger); 
 end; 
  ClientDataSet1.CreateDataSet; 
end; 
 
//使用 TField(这里是用其子类)建表: 
begin  
 with TStringField.Create(Self) do 
 begin 
  FieldName :=  'Name'; 
  Size := 12; 
  Required := True; { 必填字段 } 
  DataSet  := ClientDataSet1; 
 end; 
 with TIntegerField.Create(Self) do 
  begin 
  FieldName := 'Age'; 
  DataSet := ClientDataSet1; 
  end; 
 ClientDataSet1.CreateDataSet; 
end; 
 
//混合使用(这好像就是设计时的情形): 
var 
 F: TIntegerField; 
begin 
 with  ClientDataSet1.FieldDefs.AddFieldDef do 
 begin 
  Name := 'Name';  
  DataType := ftString; 
  Size := 12; 
  Required := True; 
  CreateField(ClientDataSet1); 
 end; 
 with  ClientDataSet1.FieldDefs.AddFieldDef do 
 begin 
  Name := 'Age'; 
  DataType := ftInteger; 
  { 指定最大值和最小值 } 
  F :=  CreateField(ClientDataSet1) as TIntegerField; 
  F.MinValue := 0; 
  F.MaxValue := 150; 
 end; 
 ClientDataSet1.CreateDataSet; 
end;  

在C#中,可以使用OGR库来实现shp与text之间的互转。首先,需要安装OGR库,可以通过NuGet包管理器来进行安装。 将shp转为text,可以使用以下代码: ```csharp using OSGeo.OGR; // 打开shp文件 var driver = Ogr.GetDriverByName("ESRI Shapefile"); var dataSource = driver.Open("path/to/shapefile.shp", 0); // 获取第一个图层 var layer = dataSource.GetLayerByIndex(0); // 创建txt文件 var textDriver = Ogr.GetDriverByName("CSV"); var textDataSource = textDriver.CreateDataSource("path/to/textfile.txt", null); // 创建新的图层 var textLayer = textDataSource.CreateLayer("layer_name", null, wkbGeometryType.wkbUnknown, null); // 获取字段 var layerDef = layer.GetLayerDefn(); var fieldCount = layerDef.GetFieldCount(); for (int i = 0; i < fieldCount; i++) { var fieldDef = layerDef.GetFieldDefn(i); var fieldName = fieldDef.GetName(); var fieldType = fieldDef.GetFieldType(); var fieldWidth = fieldDef.GetWidth(); var fieldPrecision = fieldDef.GetPrecision(); // 在新的图层中创建字段 var textFieldDef = new FieldDefn(fieldName, fieldType); textLayer.CreateField(textFieldDef); } // 获取要素 var feature = layer.GetNextFeature(); while (feature != null) { // 在新的图层中创建要素 var textFeature = new Feature(textLayer.GetLayerDefn()); for (int i = 0; i < fieldCount; i++) { var fieldValue = feature.GetFieldAsString(i); textFeature.SetField(i, fieldValue); } // 设置几何图形 var geometry = feature.GetGeometryRef(); if (geometry != null) { var textGeometry = geometry.Clone(); textFeature.SetGeometry(textGeometry); } // 将要素写入文件中 textLayer.CreateFeature(textFeature); // 获取下一个要素 feature = layer.GetNextFeature(); } // 关闭文件 dataSource.Dispose(); textDataSource.Dispose(); ``` 将text转为shp,可以使用以下代码: ```csharp using OSGeo.OGR; // 打开txt文件 var driver = Ogr.GetDriverByName("CSV"); var dataSource = driver.Open("path/to/textfile.txt", 0); // 获取第一个图层 var layer = dataSource.GetLayerByIndex(0); // 创建shp文件 var shpDriver = Ogr.GetDriverByName("ESRI Shapefile"); var shpDataSource = shpDriver.CreateDataSource("path/to/shapefile.shp", null); // 创建新的图层 var shpLayer = shpDataSource.CreateLayer("layer_name", null, wkbGeometryType.wkbUnknown, null); // 获取字段 var layerDef = layer.GetLayerDefn(); var fieldCount = layerDef.GetFieldCount(); for (int i = 0; i < fieldCount; i++) { var fieldDef = layerDef.GetFieldDefn(i); var fieldName = fieldDef.GetName(); var fieldType = fieldDef.GetFieldType(); var fieldWidth = fieldDef.GetWidth(); var fieldPrecision = fieldDef.GetPrecision(); // 在新的图层中创建字段 var shpFieldDef = new FieldDefn(fieldName, fieldType); shpLayer.CreateField(shpFieldDef); } // 获取要素 var feature = layer.GetNextFeature(); while (feature != null) { // 在新的图层中创建要素 var shpFeature = new Feature(shpLayer.GetLayerDefn()); for (int i = 0; i < fieldCount; i++) { var fieldValue = feature.GetFieldAsString(i); shpFeature.SetField(i, fieldValue); } // 设置几何图形 var geometry = feature.GetGeometryRef(); if (geometry != null) { var shpGeometry = geometry.Clone(); shpFeature.SetGeometry(shpGeometry); } // 将要素写入文件中 shpLayer.CreateFeature(shpFeature); // 获取下一个要素 feature = layer.GetNextFeature(); } // 关闭文件 dataSource.Dispose(); shpDataSource.Dispose(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值