没有 sde 前缀 的datatable select可否访问 修改

数据库操作入门文档
数据库操作(ORM框架)介绍
数据库操作(ORM框架),为常用的数据库访问及操作提供了统一的接口规范及实现,按数据类型分类,支持空间数据库操作及属性数据库操作,其中空间数据库操作支持ArcGIS、MapZone 两种类型,属性数据库操作 支持表、视图等常用类型;按数据库类型分类,支持Sqllite、MySQL、Oracle,Access、FileGDB、SqlServer数据类型,统一了访问方式。
ORM 框架使用分三层,第一层,常用的数据库操作,包括数据库的创建、表的增删改查等,第二层,元数据结构的操作即注册数据的操作,第三层,系统表的操作。
前期环境配置
1、确保Main.Win 和 Main.Win.Config 的app.Config 文件中已配置ORM 相应的节点信息(该配置信息可根据项目需要动态设置)
(图一、app.config 配置)
1)&& ormElementCollection节点中的DefaultItem
决定系统使用哪种数据库作为系统表配置,平台支持使用Access、Sqllite、Oracle、MySQL四种数据库类型作为后台系统数据库。
2)&& 数据库连接字符串采用加密的形式生成,默认的Sqllite、Access系统数据库都是放在系统启动路径下,无特殊需求不需修改,项目组可根据项目需要通过加密、解密工具生成加密串。
3)&& DbProvideType 为数据库类型,数据库类型值同ForeStar.Data.General.WorkspaceType枚举相同。
常用数据库
常规数据库操作设计理念
常规数据库操作常用的操作包括工作空间一级的操作,数据表一级的操作,数据记录一级的操作,数据表字段的操作,统一了数据库类型,数据类型,对外统一操作IWorkspace,ITable,IRow,Field对象,通过操作这些对象达到预期目的,常规数据库操作弱化了SQL、事务、DataReader的概念、重点解决SQL 项目满天飞,一片红的问题,降低数据库操作的入门门槛。
常规数据库操作
1、打开数据库
第一步:创建数据库连接对象
1)MDB 数据库
ConnectionInfo connection =
new ConnectionInfo(&&);
//连接路径可换成绝对路径
connection.Database = @&%BIN%\forestar.mdb&;
connection.WorkspaceType = WorkspaceType.A
2)ZDB 数据库
ConnectionInfo connection =
new ConnectionInfo(&&);
connection.Database = @&W:\测试数据\沙化测试数据\北京数据2014.ZDB&;
connection.WorkspaceType = WorkspaceType.SqlL
3)Oracle 数据库
ConnectionInfo connection =
new ConnectionInfo(&&);
connection.Database = &kfdlwy&;
connection.UserID = &dlwy&;
connection.Password = &dlwy&;
//默认端口可不配置
connection.Port = &5151&;
connection.NetName = &erds_designe&;
connection.Server = &192.168.1.175&;
connection.WorkspaceType = WorkspaceType.O
4)MySQL 数据库
ConnectionInfo connection =
new ConnectionInfo(&&);
connection.Server = &192.168.1.188&;
connection.UserID = &dlwy&;
connection.Password = &dlwy&;
//默认可不配置,MySQL SDE为研发部服务端口
connection.Port = &3306&
connection.Database = &forestar&;
connection.WorkspaceType = WorkspaceType.MySQL;
第二步:创建Workspace对象
ForeStar.Data.General.IWorkspaceFactorypWorkspaceFactory =
WorkspaceFactoryProvider.GetWorkspaceFactory();
IWorkspace workspace = pWorkspaceFactory.OpenWorkspace(connection);
2、创建数据表对象
第一步:打开数据库(看打开数据库部分)
第二步:创建Table,FeatureClass对象
//创建表对象
List&Field& fields =
new List&Field&();
Field field =
new Field();
field.FieldName = &name&;
field.FieldAliasName = &名字&;
field.DataType = GlobalDataType.S
field.MaxLen = 20;
fields.Add(field);
field = new
field.FieldName = &sex&;
field.FieldAliasName = &性别&;
field.DataType = GlobalDataType.S
field.MaxLen = 2;
fields.Add(field);
field = new
field.FieldName = &age&;
field.FieldAliasName = &年龄&;
field.DataType = GlobalDataType.Int16;
field.MaxLen = 3;
fields.Add(field);
ITableInfo tableinfo =
new TableInfoClass(fields.ToArray());
tableinfo.TableType = TableType.T
workspace.CreateTable(tableinfo, &JYBZK&);
//创建图形数据对象
List&Field& fields =
new List&Field&();
Field field =
new Field();
field.FieldName = &name&;
field.FieldAliasName = &名字&;
field.DataType = GlobalDataType.S
field.MaxLen = 20;
fields.Add(field);
field = new
field.FieldName = &sex&;
field.FieldAliasName = &性别&;
field.DataType = GlobalDataType.S
field.MaxLen = 2;
fields.Add(field);
field = new
field.FieldName = &age&;
field.FieldAliasName = &年龄&;
field.DataType = GlobalDataType.Int16;
field.MaxLen = 3;
fields.Add(field);
ITableInfo tableinfo =
new TableInfoClass(fields.ToArray());
tableinfo.TableType = TableType.P
(workspace as
IFeatureWorkspace).CreateFeatureClass(&JYBZK&, tableinfo, coordiate);
3、打开数据表对象
第一步:打开数据库(看打开数据库部分)
第二步:打开Table、FeatureClass对象
//打开表对象
if (workspace.ObjectExist(&JYBZK&))
&&&& ITabletable = workspace.OpenTable(&JYBZK&);
//打开图形数据对象
IFeatureWorkspace featureworkspace = workspace
as IFeatureWorkspace;
if (featureworkspace !=
&&&&&& if(featureworkspace.ObjectExist(&JYBZK&))
&&&&&&&&&&&& IFeatureClass featureclass = featureworkspace.OpenFeatureClass(&JYBZK&);
4、查询数据库记录(属性条件)
第一步:打开数据库(看打开数据库部分)。
第二步:打开数据表(看打开数据表部分)。
第三步:查询数据库记录。
//构建查询条件
IQueryFilter filter =
new QueryFilter();
filter.WhereString = String.Format(&name = '{0}'&,
“张三”);
//获取查询记录,返回List集合,图形数据RowBase 可直接转化为IFeature 对象
List&RowBase& rows =table.GetEntityList&RowBase&(filter);
//获取查询记录,返回DataTable,对于图形数据不建议使用
DataTable datatable = table.GetDataTable(filter);
5、查询数据库记录(空间条件)
第一步:打开数据库(看打开数据库部分)。
第二步:打开数据表(看打开数据表部分)。
第三步:查询数据库记录。
//构建查询条件
ISpatialFilter filter =
ContextRegistry.GetContext().GetObject(&GIS_SpatialFilter&)
as ISpatialFilter;
IEnvelope envelope =
ContextRegistry.GetContext().GetObject(&GIS_Envelope&)
asIEnvelope;
IPoint lowerleft =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
lowerleft.X = ;
lowerleft.Y = 4422020;
envelope.LowerLeft =
IPoint lowerright =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
lowerright.X = ;
lowerright.Y = 4422020;
envelope.LowerRight =
IPoint topleft =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
topleft.X = ;
topleft.Y = 4424185;
envelope.UpperLeft =
IPoint topright =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
topright.X = ;
topright.Y = 4424185;
envelope.UpperRight =
filter.WhereString = &&;
filter.Geometry =
filter.Geometry.CoordinateSystem =featureclass.SpatialR
List&RowBase& rows = featureclass.GetFeatures&RowBase&(filter);
6、新增数据库记录
第一步:打开数据库(看打开数据库部分)。
第二步:打开数据表(看打开数据表部分)。
第三步:新增数据库记录。
//图形数据添加(点图层)
IFeature feature = featureclass.CreateFeature();
feature.SetValue(&name&,
“张三”);
feature.SetValue(&arg&, 10);
feature.SetValue(&sex&,
IPoint point =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
point.X = ;
point.Y = 4423085;
feature.Shape =
table.Save(feature);
//属性表新增记录
IRow row =
new RowBase();
row.SetValue(&name&,
row.SetValue(&arg&, 10);
row.SetValue(&sex&,
table.Save(row);
7、新增数据库记录(批量)
如果是批量数据处理,建议使用批量新增方法,提高执行效率
第一步:打开数据库(看打开数据库部分)。
第二步:打开数据表(看打开数据表部分)。
第三步:新增数据库记录。
//图形数据添加(点图层)
List& IFeature & features =
new List& IFeature &();
IFeature feature = featureclass.CreateFeature();
feature.SetValue(&name&,
“张三”);
feature.SetValue(&arg&, 10);
feature.SetValue(&sex&,
IPoint point =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
point.X = ;
point.Y = 4423085;
feature.Shape =
features.Add(feature);
feature = featureclass.CreateFeature();
feature.SetValue(&name&,
“李四”);
feature.SetValue(&arg&, 10);
feature.SetValue(&sex&,
IPoint point =
ContextRegistry.GetContext().GetObject(&GIS_Point&)
point.X = ;
point.Y = 4423000;
feature.Shape =
features.Add(feature);
table.Save(features);
//属性表新增记录
List&IRow& rows =
newList&IRow&();
IRow row =
new RowBase();
row.SetValue(&name&,
row.SetValue(&arg&, 10);
row.SetValue(&sex&,
rows.Add(row);
RowBase();
row.SetValue(&name&,
row.SetValue(&arg&, 10);
row.SetValue(&sex&,
rows.Add(row);
table.Save(rows);
8、修改数据库记录
第一步:打开数据库(看打开数据库部分)。
第二步:打开数据表(看打开数据表部分)。
第三步:修改数据库记录。
//通过UpdateFilter 方式修改
IUpdateFilter filter =
new UpdateFilter();
//多个字段,通过逗号拆分
filter.SetFields = String.Format(&arg = {0},sex = '{1}'&, 20,
filter.WhereString = String.Format(&name = '{0}'&,
table.Update(filter);
//通过给RowBase 属性赋值的方式修改,同新增相近(不同的是修改的RowBase 是从数据库中获取的)
row.SetValue(&name&,
row.SetValue(&arg&, 10);
row.SetValue(&sex&,
table.Save(row);
多记录修改可采用批量新增的方式,提高执行效率
9、删除数据库记录
第一步:打开数据库(看打开数据库部分)。
第二步:打开数据表(看打开数据表部分)。
第三步:删除数据库记录。
//通过QueryFilter 方式删除
IQueryFilter filter =
new QueryFilter();
filter.WhereString = String.Format(&name = '{0}'&,
table.DeleteByRow(filter);
//通过RowBase 删除
table.Delete(row);
10、删除数据表
第一步:打开数据库(看打开数据库部分)。
第二步:删除数据库记录。
//删除纯表
workspace.DeleteObject(TableType.Table,&JYBZK&);
//删除点图层
workspace.DeleteObject(TableType.Point,&JYBZK&);
11、其他常用功能
//添加字段
table.AddField(Fieldfield);
//删除字段
table.Remove(Fieldfield);
//获取数据库表名集合
string[]tablenames = workspace.GetObjects(TableType tabletype);
//判断数据库表是否存在
bool& tableexit = workspace. ObjectExist (TableType tabletype);
//执行SQL 语句
workspace.ExecuteSql(sql);
//判断字段是否存在
Field field =table.GetField(&字段名&);
if (field ==
&&& //字段不存在
常规数据库操作提供的功能远不止文档上面列举的这些,大家可以重点通过IWorkspace,ITable,IRow,Field几个大的对象去逐一深入,这里不做详细介绍
元数据表(结构表)
元数据设计理念
元数据概念:元数据表是存在系统数据库下面的可配置的数据表结构,非具体数据,在实际数据管理的基础上,主要扩展了字典配置及管理、字段的可见、可变等常用的业务属性,元数据概念的提出主要是为了解决实际项目中数据库表的不固定性、数据库表结构的不固定性等原因,经常导致开发的返工的问题,将功能操作针对的数据对象从具体的实际数据转移到一套可配置的灵活的结构上,到具体项目中,将结构与实际数据挂接,从而达到操作实际数据的功能。
元数据操作中比较难以理解的有几个概念,元数据工作空间(IMetadataWorkspace),实际数据工作空间(IWorkspace),元数据表(IMetadataTable),实际数据表(ITable)
元数据工作空间:指存放元数据配置所在的数据库,也就是前期环境配置中所说的配置库,所有有关元数据的配置都放在该配置库中,非实际数据所在的数据库。
实际工作空间:业务数据所在的实际数据库。
元数据表:存储业务数据表结构并融合一些常用业务属性(如字典)的一套表结构,非实际表对象,可通过元数据表对象找到实际数据表对象,元数据表信息存储在元数据工作空间中,如果有实际业务表注册了元数据表结构可通过IMetadataTable的Table属性获取实际的数据表对象。
实际数据表:实际存储业务表,如果实际业务表注册结构了,可以通过实际业务表ITable 可通过MetadataTable属性获取元数据表对象。
元数据数据表结构
元数据工作空间及元数据结构都可以通过平台部提供的后台配置框架的数据服务注册管理模块进行元数据信息的配置,元数据存储的表结构如下
(图二,元数据管理表结构)
1、& 由FS_DATA_TABLE,FS_DATA_TABLEMETADATA,FS_DATA_TABLERELATION三个表来管理一套业务表结构,包含表结构名、表字段信息、表关系等;
2、& 由FS_DATA_DATAREG,FS_DATA_CONNECTION二个表来管理结构表与实际物理表的关系
结构管理表(FS_DATA_TABLE)
自动增值列
varchar(50)
S_TABLEALIASNAME
varchar(50)
树形表标识
S_TREETABLEFIELD
varchar(255)
OID,FOID,CODE,
字典表标识
S_CODETABLEFIELD
varchar(255)
CODE,CAPTION
I_TABLETYPE
Table = 1,
PointFeatureClass = 3,
PolylineFeatureClass = 4,
PolygoneFeatureClass = 5,
Raster = 6,
UnDefine = 7
表分组(业务分组)
S_TABLEGROUP
varchar(255)
注册时必需注册一个分组的表结构
如果是空间表,空间参考信息
S_SPATIALREFERENCE
varchar(255)
暂时未定义
表关系表(FS_DATA_TABLERELATION)
自动增值列
S_PTABLEID
varchar(50)
S_CTABLEID
varchar(50)
S_FOREIGNKEY
varchar(200)
OID=OID,…(前一个字段是父表字段,后一个是子表字段)
I_RELATIONTYPE
I_RELATIONSTRENGTH
0 只联合查询,如视图
1 同步更新主键
2 方子表联动
(表二,表关系表(FS_DATA_TABLERELATION)
自动增值列
varchar(50)
S_FIELDNAME
varchar(50)
S_FIELDALIASNAME
varchar(50)
S_DATATYPE
varchar(50)
请查看附表
是否自动增值
varchar(50)
是否为主键
varchar(50)
唯一键分组条件
S_UNIQUEGROUP
varchar(200)
同一分组,用同一名称
I_DECIMALDIGITS
S_CODERULE
varchar(50)
名称,描述
编码规则取值表达式
S_CODERULEEXP
varchar(200)
取值表达式,
使用spring.net 表达式解析
S_CODETABLEPK
varchar(50)
字典表条件
S_CODETABLEWHERE
varchar(200)
[DOMIAN]=’LANDTYPE’
And [LEVEL]=2
是否可以为空
S_ALLOWNULL
varchar(50)
S_READONLY
varchar(50)
默认值
S_DEFAULTVALUE
varchar(50)
S_CONTROLTYPE
varchar(50)
使用控件宽度(主要用于Grid展示)
I_CONTROLWIDTH
上下级分组
S_RELATIONGROUP
varchar(50)
上下级索引
I_RELATIONINDEX
varchar(50)
varchar(50)
varchar(50)
字段是否必需(注册时可忽略)
S_ISESSENTIAL
varchar(50)
是否是运算字段,默认为否
S_ISCRUCIAL
varchar(50)
主键,外键,同步字段,计算相关字段
(表三,数据表元数据(FS_DATA_TABLEMETADATA)
系统数据注册表(FS_DATA_DATAREG)
自动增值列
注册分组名称
I_GROUPNAME
加S_TABLEID唯一
varchar(50)
S_TABLENAME
varchar(50)
S_CONNECTIONID
varchar(200)
S_TABLEALIASNAME
varchar(50)
注册实体表别名
(表四,系统数据注册表(FS_DATA_DATAREG)
数据连接表(FS_DATA_CONNECTION)
自动增值列
数据连接ID
S_CONNECTIONID
varchar(200)
S_CONNECTIONNAME
varchar(50)
连接字符串
S_CONNECTIONSTR
varchar(200)
I_DATABASETYPE
Oracle = 1,
SqlServer = 2,
SqlServerExpress = 3,
Access = 4,
SqlLite = 5,
FileGDB = 6,
Folder = 7,
ExcelFile = 8,
DbfFolder = 9
(表五,数据连接表(FS_DATA_CONNECTION)
附表1:数据类型说明
1. net中的对应关系:
自定义类型
映射到.net类型
取值范围
布尔值
True/False
自 1899 年 12 月 30 日以来
表示十进制数
79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。
双精度浮点数字
-1.32e308 和 +1.32e308 之间的双精度 64 位数字
单精度浮点数字
-3. 和 +3. 之间的单精度 32 位数字
带符号短整型
-32768 到 +32767 之间的有符号整数
带符号整型
-2,147,483,648 到 +2,147,483,647 之间的有符号整数
带符号长整型
-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数
无符号短整型
-32768 到 +32767 之间的有符号整数
无符号整型
-2,147,483,648 到 +2,147,483,647 之间的有符号整数
无符号长整型
-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数
当前不支持该数据类型
使用它可能导致不可预知的结果。
2.Access的对应关系
自定义类型
Access类型
取值范围
带符号长整型
-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数
带符号整型
数字(长整型)
-2,147,483,648 到 +2,147,483,647 之间的有符号整数
带符号短整型
数字(整型)
-32768 到 +32767 之间的有符号整数
8 位带符号的整数
-128 到 +127 之间的整数
单精度浮点数字
数字(单精度)
-3. 和 +3. 之间的单精度 32 位数字
双精度浮点数字
数字(双精度)
-1.32e308 和 +1.32e308之间的双精度 64 位数
表示十进制数
数字(小数)
79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。
二进制数据流
布尔值
True/False
自 1899 年 12 月 30 日以来
日期时间数据
当前不支持该数据类型
使用它可能导致不可预知的结果。
3、SqlServer对应关系
自定义类型
SqlServer类型
取值范围
带符号长整型
-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数
带符号整型
-2,147,483,648 到 +2,147,483,647 之间的有符号整数
带符号短整型
-32768 到 +32767 之间的有符号整数
8 位带符号的整数
-128 到 +127 之间的整数
单精度浮点数字
-3. 和 +3. 之间的单精度 32 位数字
双精度浮点数字
-1.32e308 和 +1.32e308 之间的双精度 64 位数字
表示十进制数
79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。
二进制数据流
布尔值
True/False
自 1899 年 12 月 30 日以来
日期时间数据
当前不支持该数据类型
使用它可能导致不可预知的结果。
4.oracle的对应关系
自定义类型
Oracle类型
取值范围
带符号长整型
Number(19,0)
-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数
带符号整型
Number(10,0)
-2,147,483,648 到 +2,147,483,647 之间的有符号整数
带符号短整型
Number(5,0)
-32768 到 +32767 之间的有符号整数
8 位带符号的整数
-128 到 +127 之间的整数
Char(1-255)
单精度浮点数字
-3. 和 +3. 之间的单精度 32 位数字
双精度浮点数字
-1.32e308 和 +1.32e308 之间的双精度 64 位数字
表示十进制数
Number(p,s)
79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。
二进制数据流
布尔值
Number(1,0)
True/False
自 1899 年 12 月 30 日以来
日期时间数据
当前不支持该数据类型
使用它可能导致不可预知的结果。
附表2:数据库类型连接字符串说明
1.关键字定义
数据库名称或数据库文件路径
网络名,只为Oracle提供本地配置的网络名
服务器名称,如Oracle服务器IP地址
网络端口号,数据库服务所使用的端口
数据版本,为ArcSDE提供服务
2.连接字符串定义
数据库类型
连接字符串
Server=;Port=;Database=;UserID=;Password=;Version=
Server=;Port=;Database=;UserID=;Password=;Version=
SqlServerExpress
Server=;Port=;Database=;UserID=;Password=;Version=
Server=Microsoft.Jet.OLEDB.4.0;Database=
Server=Microsoft.Jet.OLEDB.4.0;Database=
Server=Microsoft.Jet.OLEDB.4.0;Database=
元数据操作
1、打开元数据库
元数据操作都是通过后台配置完成,不需要像常规的数据库操作一样通过数据库连接打开,不用传参数,参数都在后台配置完成。
第一步:获取元数据工作空间对象
IMetadataWorkspace &metadataworkspace =
MetadataWorkspaceFactory.OpenMetadataWorkspace();
2、打开元数据表对象
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表
IMetadataTable metadatatable = metadataworkspace.OpenTable(&XIAN&);
3、通过元数据表获取实际数据表对象
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取实际业务表对象
ITable table =metadatatable.T
4、通过实际表对象获取元数据表对象
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取实际业务表对象
//获取表方法同常规数据库操作打开数据表对象
ITable table = workspace.OpenTable(&JYBZK&);
IMetadataTable metadatatable =table.MetadataT
5、通过元数据表获取数据记录
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取实际业务表对象(通过实际表对象获取元数据表对象)
第四步:查询获取数据对象
IMetadataTable metadatatable =metadataworkspace.OpenTable(&XIAN&);
ITable table =metadatatable.T
QueryFilter filter =
new QueryFilter();
filter.WhereString = String.Format(&name = '{0}'&,
“张三”);
//获取查询记录,返回List集合,图形数据RowBase 可直接转化为IFeature 对象
List&RowBase& rows =table.GetEntityList&RowBase&(filter);
6、获取元数据字段字典表或字典集合
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取挂字典字段
MetadataField &field = metadatatable.GetField(&XIAN&);
第四步:获取挂接字典信息
//获取字段挂的字典表的元数据结构名
string codetableid =field.CodeTablePK;
//获取字段挂的字典集合
Dictionary&string,
string& codes = field.D
7、获取元数据带字典信息记录
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取查询结果
IMetadataTable metadatatable =metadataworkspace.OpenTable(&XIAN&);
ITable table =metadatatable.T
QueryFilter filter =
new QueryFilter();
filter.WhereString = String.Format(&name = '{0}'&,
“张三”);
//设置获取字典字段值
filter.AddCaptionField= true;
//返回结果中带了 字典字段名+_DESC 的字段,即是返回对应字典的字典翻译值
RowBase row =table.GetEntity&RowBase&(filter);
8、主子表查询
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取查询结果,主子表关系的配置在后台数据服务注册管理面进行配置,注册表查询和其他数据查询方式相同,只需要在查询条件中,添加主子表关系即可,其中主子表关系查询类型包括:
IQueryFilter filter =
new QueryFilter();
filter.FillChild=& FillChildType.AllUpdateC
List&RowBase& rows = table.GetEntityList&RowBase&(queryfilter);
其中子表查询类型包括:
///&summary&
///&/summary&
///&summary&
///填充[主子表][查询关联][联合查询]类型的第一层子表
///&/summary&
FirstOnlySelect= 1,
///&summary&
///填充[主子表][查询关联][联合查询]联动类型的所有层子表
///&/summary&
AllOnlySelect= 2,
///&summary&
///填充[主子表][查询关联]类型的第一层子表
///&/summary&
FirstUpdateRelation= 3,
///&summary&
///填充[主子表][查询关联]联动类型的所有层子表
///&/summary&
AllUpdateRelation= 4,
///&summary&
///填充[主子表]联动类型的第一层子表
///&/summary&
FirstUpdateChild= 5,
///&summary&
///填充[主子表]联动类型的所有层子表
///&/summary&
AllUpdateChild= 6
9、主子表更新
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:支持主子表更新要求在后台主子表关联强度设置为UpdateRelation(查询时关联,如果主表更新了主键,同时更新相关主键),或者UpdataChild(主子表联动),主子表更新设置查询类型支持更新所有子表,获取主表记录,设置关联字段值,保存即可更新字表对应关联字段的值。
IQueryFilter filter =
new QueryFilter();
filter.WhereString= &name& +
filter.FillChild= FillChildType.AllUpdateC
filter.WhereParameter= new
GlobalParameter[] { new
GlobalParameter(&@name&,
&张三&) };
RowBase row = table.GetEntity&RowBase&(filter);
row.SetValue(&name&,&李四&);
table.Save(row);
10、&&&主子表删除
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:支持主子表删除要求在后台主子表关联强度设置为UpdataChild(主子表联动),才能在删除主表的同时删除对应的字表
IQueryFilter filter =
new QueryFilter();
filter.WhereString= &name& +
filter.FillChild= FillChildType.AllUpdateC
filter.WhereParameter= new
GlobalParameter[] {& new
GlobalParameter(&@name&,
table.Delete(filter);
11、&&&其他常用操作
1、 创建并注册表结构
ForeStar.Data.Util. DefaultRegTableMetadata.RegNewTableMetadataInfo(ITable pTable)
根据表明自动创建表名相同结构,并根据表字段信息,自动生成结构字段,最后将表注册到结构中,效果类似数据服务与注册模块中的创建并注册结构功能
2、判断数据表是否和元数据结构匹配
ForeStar.Data.Util. DefaultRegTableMetadata.CheckTableIsMatchMetadata(ITable sourcttable,
stringmetadatatable)
根据源数据对象及给定的元数据表名,判断数据和结构是否匹配包括字段名、字段类型、字段长度等,该方法提供多个重载
3、获取系统表或者元数据表对象
ForeStar.Data.Util. MetadataDataSourceUtils.GetTables()
获取所有注册结构集合,其中有重载方法判断是否加系统表对象
4、根据结构创建实际数据对象
public static void CreateTableByMetadataTable(stringtableid,string newtablename, IWorkspace workspace, ICoordinateSystemcoordinate)
&&&&&&&&&&&if(String.IsNullOrEmpty(tableid))
&&&&&&&&&&&&&&&
&&&&&&&&&&&if(String.IsNullOrEmpty(newtablename))
&&&&&&&&&&&&&&&
&&&&&&&&&&&IMetadataTable metadatatable =MetadataWorkspaceFactory.OpenMetadataWorkspace().OpenTable(tableid);
&&&&&&&&&&&if(metadatatable == null)
&&&&&&&&&&&&&&&
&&&&&&&&&&&if(coordinate== null)
&&&&&&&&&&&&&&&workspace.CreateTable(metadatatable.GetTableInfo,newtablename);
&&&&&&&&&&&else
&&&&&&&&&&& {
&&&&&&&&&&&&&&&if(workspace is IFeatureWorkspace)
&&&&&&&&&&&&&&&&&&&(workspace as IFeatureWorkspace).CreateFeatureClass(newtablename,metadatatable.GetTableInfo, coordinate);
&&&&&&&&&&& }
常规数据库操作提供的功能远不止文档上面列举的这些,大家可以重点通过IMetadataWorksapce,IMetadataTable,Metadata Field 几个大的对象去逐一深入,这里不做详细介绍
系统表设计理念
为了辅助完成元数据操作所需要的元数据信息配置工作及在项目开发过程中经常遇到的为了达到功能灵活配置的效果需要保存一些配置信息到数据库中,针对以上两点原因设计了系统表的概念,
&&& 系统表在元数据表的基础上进一步固定了一些信息,包括1、系统数据库的存放位置是通过app.config 配置的,2、因为系统表示为了辅助其他功能模块更好的达到功能效果,系统表存储的是功能自身的需要的结构信息,结构的变动完全由功能自身的扩展,这就决定了系统表的表结构不是多变或者灵活的,这样就可以将系统表表结构做成模型的方式,所有针对系统表的操作都可以转化为针对模型的操作。
系统表数据结构
系统表对象分为两部分,一个是数据库表结构对象结构(实体),该对象里面的每个属性对应着数据库里面的每个字段,系统表查询时即可返回该对象,通过拿对应的属性即可拿到数据库里面对应的值。第二个是操作该结构对象的辅助类,该类负责辅助提供针对系统表常用的操作。系统表实体类和辅助操作类的创建不需要手工写代码,平台部提供根据实际数据表快速生成CS 文件
系统表实体代码结构,集成常规RowBase对象
namespaceForeStar.Data.Example.系统表基本查询更新
&&& ///&summary&
&&& /// DictMain数据表实例类
&&& ///&/summary&
&&& public
class DictMainRow :
&&&&&&& #region 数据结构
&&&&&&& ///&summary&
&&&&&&& ///
&&&&&&& ///&/summary&
&&&&&&& public
const string FIELD_MAINID =
&&&&&&& ///&summary&
&&&&&&& ///
&&&&&&& ///&/summary&
&&&&&&& public
const string FIELD_CHNAME =
&&&&&&& ///&summary&
&&&&&&& ///
&&&&&&& ///&/summary&
&&&&&&& public
const string FIELD_ENNAME =
&&&&&&& ///&summary&
&&&&&&& ///
&&&&&&& ///&/summary&
&&&&&&& public
const string FIELD_MEMO =
&&&&&&& #endregion
&&&&&&& #region 属性
&&&&&&& ///&summary&&/summary&
&&&&&&& public
Int64 MAINID
&&&&&&&&&&& get {
return GetValue&Int64&(FIELD_MAINID); }
&&&&&&&&&&& set { SetValue(FIELD_MAINID,
&&&&&&& ///&summary&&/summary&
&&&&&&& public
String CHNAME
&&&&&&&&&&& get {
return GetValue&String&(FIELD_CHNAME);&}
&&&&&&&&&&& set { SetValue(FIELD_CHNAME,
&&&&&&& ///&summary&&/summary&
&&&&&&& public
String ENNAME
&&&&&&&&&&& get {
return GetValue&String&(FIELD_ENNAME);&}
&&&&&&&&&&& set { SetValue(FIELD_ENNAME,
&&&&&&& ///&summary&&/summary&
&&&&&&& public
String MEMO
&&&&&&&&&&& get {
return GetValue&String&(FIELD_MEMO);&}
&&&&&&&&&&& set { SetValue(FIELD_MEMO,
&&&&&&& #endregion
系统表辅助类结构,辅助类集成SysTableBase 基类,并需要加上Spring 标签
///&summary&
&&& /// DictMain业务逻辑类
&&& ///&summary&
&&& [Component(IsSingleton =
&true&, Name =
&DICTMAIN&, InitMethodName = &InitMethod&)]
&&& public
class DictMainTable :
SysTableBase
&&&&&&& #region 构造
&&&&&&& public
static readonly
DictMainTable dictmaintable = new
DictMainTable();
&&&&&&& public
const string TABLE_NAME =
&DICTMAIN&;
&&&&&&& private DictMainTable()
&&&&&&&&&&& : base(TABLE_NAME)
&&&&&&& { }
&&&&&&& #endregion
&&&&&&& #region 成员方法
&&&&&&& private
Dictionary&string,
MetadataField&
&&&&&&& protected
override Dictionary&string,
MetadataField& GetTableFields()
&&&&&&&&&&& if (fields ==
&&&&&&&&&&& {
&&&&&&&&&&&&&&& fields = new
Dictionary&string,
MetadataField&();
&&&&&&&&&&&&&&& MetadataField itemField =
new MetadataField();
&&&&&&&&&&&&&&& itemField = new
MetadataField();
&&&&&&&&&&&&&&& itemField.FieldName =
DictMainRow.FIELD_MAINID;
&&&&&&&&&&&&&&& itemField.DataType =
GlobalDataType.Int64;
&&&&&&&&&&&&&&& itemField.FieldID = 2;
&&&&&&&&&&&&&&& itemField.FieldAliasName =
&&&&&&&&&&&&&&& itemField.CanShow = true;
&&&&&&&&&&&&&&& itemField.AllowNull = true;
&&&&&&&&&&&&&&& itemField.IsKey = true;
&&&&&&&&&&&&&&&fields.Add(itemField.FieldName.ToUpper().Trim(), itemField);
&&&&&&&&&&&&&&& itemField = new
MetadataField();
&&&&&&&&&&&&&&& itemField.FieldName =
DictMainRow.FIELD_CHNAME;
&&&&&&&&&&&&&&& itemField.DataType =
GlobalDataType.S
&&&&&&&&&&&&&&& itemField.FieldID = 3;
&&&&&&&&&&&&&&& itemField.FieldAliasName =
&&&&&&&&&&&&&&& itemField.CanShow = true;
&&&&&&&&&&&&&&& itemField.AllowNull = true;
&&&&&&&&&&&&&&&fields.Add(itemField.FieldName.ToUpper().Trim(), itemField);
&&&&&&&&&&&&&&& itemField = new
MetadataField();
&&&&&&&&&&&&&&& itemField.FieldName =
DictMainRow.FIELD_ENNAME;
&&&&&&&&&&&&&&& itemField.DataType =
GlobalDataType.S
&&&&&&&&&&&&&&& itemField.FieldID = 4;
&&&&&&&&&&&&&& &itemField.FieldAliasName =
&&&&&&&&&&&&&&& itemField.CanShow = true;
&&&&&&&&&&&&&&& itemField.AllowNull = true;
&&&&&&&&&&&&&&&fields.Add(itemField.FieldName.ToUpper().Trim(), itemField);
&&&&&&&&&&&&&&& itemField = new
MetadataField();
&&&&&&&&&& &&&&&itemField.FieldName =
DictMainRow.FIELD_MEMO;
&&&&&&&&&&&&&&& itemField.DataType =
GlobalDataType.S
&&&&&&&&&&&&&&& itemField.FieldID = 5;
&&&&&&&&&&&&&&& itemField.FieldAliasName =
&&&&&&&&&&&&&&& itemField.CanShow = true;
&&&&&&&&&&&&&&& itemField.AllowNull = true;
&&&&&&&&&&&&&&&fields.Add(itemField.FieldName.ToUpper().Trim(), itemField);
&&&&&&&&&&& }
&&&&&&&&&&& return
&&&&&&& private
RelationNode relationN
&&&&&&& protected
override RelationNode GetTableRelation()
&&&&&&&&&&& if (relationNode ==
&&&&&&&&&&& {
&&&&&&&&&&&&&&& relationNode = new
RelationNode(TABLE_NAME);
&&&&&&&&&&&&&&& // Sub 表
&&&&&&&&&&&&&&& RelationInfo relationInfo =
new RelationInfo();
&&&&&&&&&&&&&&& relationInfo.Foreignkey =
new Dictionary&string,
string&();
&&&&&&&&&&&&&&& relationInfo.Foreignkey.Add(DictMainRow.FIELD_MAINID,
DictSubRow.FIELD_MAINID);
&&&&&&&&&&&&&&& relationInfo.RelationStrength =RelationStrength.UpdateC
&&&&&&&&&&&&&&& relationInfo.RelationType =
RelationType.OneToM
&&&&&&&&&&&&&&&relationNode.ChildRelationNode.Add(DictSubTable.TABLE_NAME, relationInfo);&&
&&&&&&&& }
&&&&&&&&&&& return relationN
&&&&&&& protected
override TableType GetTableType()
&&&&&&&&&&& return
TableType.T
&&&&&&& public
override string MetadataTableAliasName
&&&&&&&&&&& get {
return &&; }
&&&&&&& #endregion
系统表操作
数据表的增删改查在常规数据库操作中已经做介绍,主子表操作在元数据操作中已经做介绍,系统表对数据的操作支持常规的操作,也支持元件数据表的操作,使用方式相同,这部分内容这里不再赘述,先就系统表的优点做一下讲解,系统表操作有两个突出的优点1、其弱化了工作空间的概念,不用再打开工作空间,或者表对象,所有操作都在对应辅助类里面完成,2、可以返回具体实体,直接通过具体实体属性获取值。
系统表结构的机制可在系统数据库中不存在系统表结构时,自动创建系统表对象,无需手工挨个创建。
1、查询数据库记录
IQueryFilter filter =
new QueryFilter();
filter.WhereString= String.Format(&{0} = '张三'&,
DictMainRow.FIELD_CHNAME);
List&DictMainRow& mains =
DictMainTable.dictmaintable.GetEntityList&DictMainRow&(filter);
2、新增数据库记录
DictMainRow row =
new DictMainRow();
row.MAINID= 5;
row.CHNAME= &宋测试&;
DictMainTable.dictmaintable.Save(row);
3、修改数据库记录
DictMainRow row =
new DictMainRow();
row.CHNAME= &宋测试2&;
DictMainTable.dictmaintable.Save(row);
4、删除数据库记录
DictMainRow row =
DictMainTable.dictmaintable.GetEntity&DictMainRow&(filter);
DictMainTable.dictmaintable.DeleteByRow(row);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14021次
排名:千里之外
原创:59篇
转载:80篇
(9)(11)(9)(10)(7)(19)(2)(2)(2)(21)(11)(2)(10)(7)(3)(2)(13)}

我要回帖

更多关于 soe 访问sde 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信