数据库操作入门文档
数据库操作(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.Access;
return connection;
2)ZDB 数据库
ConnectionInfo connection = new ConnectionInfo("");
connection.Database = @"W:\测试数据\沙化测试数据\北京数据2014.ZDB";
connection.WorkspaceType = WorkspaceType.SqlLite;
return connection;
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.Oracle;
return connection;
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;
return connection;
第二步:创建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.String;
field.MaxLen = 20;
fields.Add(field);
field = new Field();
field.FieldName = "sex";
field.FieldAliasName = "性别";
field.DataType = GlobalDataType.String;
field.MaxLen = 2;
fields.Add(field);
field = new Field();
field.FieldName = "age";
field.FieldAliasName = "年龄";
field.DataType = GlobalDataType.Int16;
field.MaxLen = 3;
fields.Add(field);
ITableInfo tableinfo = new TableInfoClass(fields.ToArray());
tableinfo.TableType = TableType.Table;
workspace.CreateTable(tableinfo, "JYBZK");
//创建图形数据对象
List<Field> fields = new List<Field>();
Field field = new Field();
field.FieldName = "name";
field.FieldAliasName = "名字";
field.DataType = GlobalDataType.String;
field.MaxLen = 20;
fields.Add(field);
field = new Field();
field.FieldName = "sex";
field.FieldAliasName = "性别";
field.DataType = GlobalDataType.String;
field.MaxLen = 2;
fields.Add(field);
field = new Field();
field.FieldName = "age";
field.FieldAliasName = "年龄";
field.DataType = GlobalDataType.Int16;
field.MaxLen = 3;
fields.Add(field);
ITableInfo tableinfo = new TableInfoClass(fields.ToArray());
tableinfo.TableType = TableType.Point;
(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 != null)
{
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") asIPoint;
lowerleft.X = 39451000;
lowerleft.Y = 4422020;
envelope.LowerLeft = lowerleft;
IPoint lowerright = ContextRegistry.GetContext().GetObject("GIS_Point") asIPoint;
lowerright.X = 39452190;
lowerright.Y = 4422020;
envelope.LowerRight = lowerright;
IPoint topleft = ContextRegistry.GetContext().GetObject("GIS_Point") asIPoint;
topleft.X = 39451000;
topleft.Y = 4424185;
envelope.UpperLeft = topleft;
IPoint topright = ContextRegistry.GetContext().GetObject("GIS_Point") asIPoint;
topright.X = 39452190;
topright.Y = 4424185;
envelope.UpperRight = topright;
filter.WhereString = "";
filter.Geometry = envelope;
filter.Geometry.CoordinateSystem =featureclass.SpatialReference;
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") asIPoint;
point.X = 19548158;
point.Y = 4423085;
feature.Shape = point;
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") asIPoint;
point.X = 19548158;
point.Y = 4423085;
feature.Shape = point;
features.Add(feature);
feature = featureclass.CreateFeature();
feature.SetValue("name", “李四”);
feature.SetValue("arg", 10);
feature.SetValue("sex", "男");
IPoint point = ContextRegistry.GetContext().GetObject("GIS_Point") asIPoint;
point.X = 19548155;
point.Y = 4423000;
feature.Shape = point;
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);
row = new 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 == null)
{
//字段不存在
}
常规数据库操作提供的功能远不止文档上面列举的这些,大家可以重点通过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)
字段名 | 字段别名 | 类型 | 长度 | 精度 | 描述 |
系统字段 | OBJECTID | int |
|
| 自动增值列 |
系统字段 | I_VERSION | int |
|
|
|
表编号 | S_TABLEID | varchar(50) | 50 |
| 主键 |
表别名 | S_TABLEALIASNAME | varchar(50) | 50 |
|
|
树形表标识 | S_TREETABLEFIELD | varchar(255) | 255 |
| OID,FOID,CODE, CAPTION |
字典表标识 | S_CODETABLEFIELD | varchar(255) | 255 |
| CODE,CAPTION |
表类型 | I_TABLETYPE | int |
|
| Table = 1, View = 2, PointFeatureClass = 3, PolylineFeatureClass = 4, PolygoneFeatureClass = 5, Raster = 6, UnDefine = 7 |
表分组(业务分组) | S_TABLEGROUP | varchar(255) | 255 |
| 注册时必需注册一个分组的表结构 |
如果是空间表,空间参考信息 | S_SPATIALREFERENCE | varchar(255) | 255 |
| 暂时未定义 |
(表一,结构管理表(FS_DATA_TABLE)
表关系表(FS_DATA_TABLERELATION)
字段名 | 字段别名 | 类型 | 长度 | 精度 | 描述 |
系统字段 | OBJECTID | int |
|
| 自动增值列 |
系统字段 | I_VERSION | int |
|
|
|
父表 | S_PTABLEID | varchar(50) | 50 |
| 主键 |
子表 | S_CTABLEID | varchar(50) | 50 |
| 主键 |
外建关系 | S_FOREIGNKEY | varchar(200) | 200 |
| OID=OID,…(前一个字段是父表字段,后一个是子表字段) |
关联类型 | I_RELATIONTYPE | int |
|
| 0 一对一 1 一对多 |
关联关系 | I_RELATIONSTRENGTH | int |
|
| 0 只联合查询,如视图 1 同步更新主键 2 方子表联动 |
(表二,表关系表(FS_DATA_TABLERELATION)
数据表元数据(FS_DATA_TABLEMETADATA)
名称 | 代码 | 数据类型 | 长度 | 精度 | 描述 |
系统字段 | OBJECTID | int |
|
| 自动增值列 |
系统字段 | I_VERSION | int |
|
|
|
表编号 | S_TABLEID | varchar(50) | 50 |
| 主键 |
字段名 | S_FIELDNAME | varchar(50) | 50 |
| 主键 |
字段编号 | I_FIELDID | int |
|
|
|
字段别名 | S_FIELDALIASNAME | varchar(50) | 50 |
|
|
数据类型 | S_DATATYPE | varchar(50) | 50 |
| 请查看附表 |
是否自动增值 | S_ISAUTO | varchar(50) | 50 |
| 是,否 |
是否为主键 | S_ISKEY | varchar(50) | 50 |
| 是,否 |
唯一键分组条件 | S_UNIQUEGROUP | varchar(200) | 200 |
| 同一分组,用同一名称 |
最大长度 | I_MAXLEN | int |
|
|
|
小数位 | I_DECIMALDIGITS | int |
|
|
|
编码规则 | S_CODERULE | varchar(50) | 50 |
| 名称,描述 |
编码规则取值表达式 | S_CODERULEEXP | varchar(200) | 200 |
| 取值表达式, 使用spring 表达式解析 |
字典表名 | S_CODETABLEPK | varchar(50) | 50 |
|
|
字典表条件 | S_CODETABLEWHERE | varchar(200) | 200 |
| [DOMIAN]=’LANDTYPE’ And [LEVEL]=2 |
是否可以为空 | S_ALLOWNULL | varchar(50) | 50 |
| 是,否 |
是否只读 | S_READONLY | varchar(50) | 50 |
| 是,否 |
默认值 | S_DEFAULTVALUE | varchar(50) | 50 |
| 是,否 |
编辑类型 | S_CONTROLTYPE | varchar(50) | 50 |
| 暂未定义 |
使用控件宽度(主要用于Grid展示) | I_CONTROLWIDTH | int |
|
|
|
上下级分组 | S_RELATIONGROUP | varchar(50) | 50 |
|
|
上下级索引 | I_RELATIONINDEX | int |
|
|
|
是否显示 | S_CANSHOW | varchar(50) | 50 |
| 是,否 |
字段分组 | S_GROUP | varchar(50) | 50 |
|
|
单位 | S_UNIT | varchar(50) | 50 |
| 暂未定义 |
字段是否必需(注册时可忽略) | S_ISESSENTIAL | varchar(50) | 50 |
|
|
是否是运算字段,默认为否 | S_ISCRUCIAL | varchar(50) | 50 |
| 主键,外键,同步字段,计算相关字段 |
(表三,数据表元数据(FS_DATA_TABLEMETADATA)
系统数据注册表(FS_DATA_DATAREG)
名称 | 代码 | 数据类型 | 长度 | 精度 | 描述 |
系统字段 | OBJECTID | int |
|
| 自动增值列 |
系统字段 | I_VERSION | int |
|
|
|
注册分组名称 | I_GROUPNAME |
|
|
| 加S_TABLEID唯一 |
结构编号 | S_TABLEID | varchar(50) | 50 |
| 主键 |
表名称 | S_TABLENAME | varchar(50) | 50 |
| 主键 |
数据连接 | S_CONNECTIONID | varchar(200) | 200 |
| 主键 |
表别名 | S_TABLEALIASNAME | varchar(50) | 50 |
| 注册实体表别名 |
(表四,系统数据注册表(FS_DATA_DATAREG)
数据连接表(FS_DATA_CONNECTION)
名称 | 代码 | 数据类型 | 长度 | 精度 | 描述 |
系统字段 | OBJECTID | int |
|
| 自动增值列 |
系统字段 | I_VERSION | int |
|
|
|
数据连接ID | S_CONNECTIONID | varchar(200) | 200 |
|
|
连接名称 | S_CONNECTIONNAME | varchar(50) | 50 |
|
|
连接字符串 | S_CONNECTIONSTR | varchar(200) | 200 |
| 看附件 |
数据类型 | I_DATABASETYPE | int |
|
| Oracle = 1, SqlServer = 2, SqlServerExpress = 3, Access = 4, SqlLite = 5, FileGDB = 6, Folder = 7, ExcelFile = 8, DbfFolder = 9 |
(表五,数据连接表(FS_DATA_CONNECTION)
附表1:数据类型说明
1. net中的对应关系:
自定义类型 | 说明 | 映射到类型 | 取值范围 |
BOOLEAN | 布尔值 | Boolean | True/False |
CHAR | 字符 | Char | 0-255 |
STRING | 字符型 | String | 0-255 |
TEXT | 文本型 | String |
|
DATE | 日期数据 | Date | 自 1899 年 12 月 30 日以来 |
DATETIME | 时间数据 | Date |
|
DECIMAL | 表示十进制数 | Decimal | 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。 |
DOUBLE | 双精度浮点数字 | Double | -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字 |
SINGLE | 单精度浮点数字 | Single | -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字 |
INT16 | 带符号短整型 | Int16 | -32768 到 +32767 之间的有符号整数 |
INT32 | 带符号整型 | Int32 | -2,147,483,648 到 +2,147,483,647 之间的有符号整数 |
INT64 | 带符号长整型 | Int64 | -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数 |
UINT16 | 无符号短整型 | UInt16 | -32768 到 +32767 之间的有符号整数 |
UINT32 | 无符号整型 | UInt32 | -2,147,483,648 到 +2,147,483,647 之间的有符号整数 |
UINT64 | 无符号长整型 | UInt64 | -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数 |
BYTE | 二进制流 | Byte[] |
|
Unknown | 当前不支持该数据类型 | Object | 使用它可能导致不可预知的结果。 |
2.Access的对应关系
自定义类型 | 说明 | Access类型 | Sql类型 | 取值范围 |
BigInt | 带符号长整型 | 无对应 |
| -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数 |
Integer | 带符号整型 | 数字(长整型) | Integer | -2,147,483,648 到 +2,147,483,647 之间的有符号整数 |
SmallInt | 带符号短整型 | 数字(整型) | Smallint | -32768 到 +32767 之间的有符号整数 |
TinyInt | 8 位带符号的整数 | 无对应 |
| -128 到 +127 之间的整数 |
Char | 字符型 | 文本 | Char | 0-255 |
Text | 文本型 | 备注 | memo |
|
Single | 单精度浮点数字 | 数字(单精度) | Real | -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字 |
Double | 双精度浮点数字 | 数字(双精度) | float | -1.79769313486232e308 和 +1.79769313486232e308之间的双精度 64 位数 |
Decimal | 表示十进制数 | 数字(小数) | numeric | 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。 |
Binary | 二进制数据流 | Ole 对象 | binary |
|
Boolean | 布尔值 | 是/否 | bit | True/False |
Date | 日期数据 | 日期/时间 | DateTime | 自 1899 年 12 月 30 日以来 |
Time | 时间数据 | 日期/时间 | DateTime |
|
DateTime | 日期时间数据 | 日期/时间 | DateTime |
|
Unknown | 当前不支持该数据类型 | Object |
| 使用它可能导致不可预知的结果。 |
3、SqlServer对应关系
自定义类型 | 说明 | SqlServer类型 | 取值范围 |
BigInt | 带符号长整型 | BigInt | -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数 |
Integer | 带符号整型 | int | -2,147,483,648 到 +2,147,483,647 之间的有符号整数 |
SmallInt | 带符号短整型 | Smallint | -32768 到 +32767 之间的有符号整数 |
TinyInt | 8 位带符号的整数 | 无对应 | -128 到 +127 之间的整数 |
Char | 字符型 | Char | 0-255 |
Text | 文本型 | Text |
|
Single | 单精度浮点数字 | real | -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字 |
Double | 双精度浮点数字 | float | -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字 |
Decimal | 表示十进制数 | decimal | 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。 |
Binary | 二进制数据流 | Image |
|
Boolean | 布尔值 | Bit | True/False |
Date | 日期数据 | DateTime | 自 1899 年 12 月 30 日以来 |
Time | 时间数据 | DateTime |
|
DateTime | 日期时间数据 | DateTime |
|
Unknown | 当前不支持该数据类型 | Object | 使用它可能导致不可预知的结果。 |
4.oracle的对应关系
自定义类型 | 说明 | Oracle类型 | 取值范围 |
BigInt | 带符号长整型 | Number(19,0) | -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数 |
Integer | 带符号整型 | Number(10,0) | -2,147,483,648 到 +2,147,483,647 之间的有符号整数 |
SmallInt | 带符号短整型 | Number(5,0) | -32768 到 +32767 之间的有符号整数 |
TinyInt | 8 位带符号的整数 | 无对应 | -128 到 +127 之间的整数 |
Char | 字符型 | Char(1-255) | 0-255 |
Text | 文本型 | Clob |
|
Single | 单精度浮点数字 | Number | -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字 |
Double | 双精度浮点数字 | Number | -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字 |
Decimal | 表示十进制数 | Number(p,s) | 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。 |
Binary | 二进制数据流 | blob |
|
Boolean | 布尔值 | Number(1,0) | True/False |
Date | 日期数据 | Date | 自 1899 年 12 月 30 日以来 |
Time | 时间数据 | Date |
|
DateTime | 日期时间数据 | Date |
|
Unknown | 当前不支持该数据类型 | Object | 使用它可能导致不可预知的结果。 |
附表2:数据库类型连接字符串说明
1.关键字定义
编号 | 字符名称 | 示例 | 备注 |
1 | Database | 数据库名称或数据库文件路径 |
|
2 | NetName | 网络名,只为Oracle提供本地配置的网络名 |
|
3 | Server | 服务器名称,如Oracle服务器IP地址 |
|
4 | UserID | 用户名 |
|
5 | Password | 密码 |
|
6 | Port | 网络端口号,数据库服务所使用的端口 |
|
7 | Version | 数据版本,为ArcSDE提供服务 |
|
2.连接字符串定义
数据库类型 | 连接字符串 |
Oracle | Server=;Port=;Database=;UserID=;Password=;Version= |
SqlServer | Server=;Port=;Database=;UserID=;Password=;Version= |
SqlServerExpress | Server=;Port=;Database=;UserID=;Password=;Version= |
Access | Server=Microsoft.Jet.OLEDB.4.0;Database= |
SqlLite | Server=Microsoft.Jet.OLEDB.4.0;Database= |
FileGDB | Database= |
Folder | Database= |
ExcelFile | Database= |
DbfFolder | Server=Microsoft.Jet.OLEDB.4.0;Database= |
元数据操作
1、打开元数据库
元数据操作都是通过后台配置完成,不需要像常规的数据库操作一样通过数据库连接打开,不用传参数,参数都在后台配置完成。
第一步:获取元数据工作空间对象
IMetadataWorkspace metadataworkspace = MetadataWorkspaceFactory.OpenMetadataWorkspace();
2、打开元数据表对象
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表
IMetadataTable metadatatable = metadataworkspace.OpenTable("XIAN");
3、通过元数据表获取实际数据表对象
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取实际业务表对象
ITable table =metadatatable.Table;
4、通过实际表对象获取元数据表对象
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取实际业务表对象
//获取表方法同常规数据库操作打开数据表对象
ITable table = workspace.OpenTable("JYBZK");
IMetadataTable metadatatable =table.MetadataTable;
5、通过元数据表获取数据记录
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取实际业务表对象(通过实际表对象获取元数据表对象)
第四步:查询获取数据对象
IMetadataTable metadatatable =metadataworkspace.OpenTable("XIAN");
ITable table =metadatatable.Table;
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.Domain;
7、获取元数据带字典信息记录
第一步:获取元数据工作空间对象(同打开元数据库)
第二步:打开元数据表,(同打开元数据表对象)
第三步:获取查询结果
IMetadataTable metadatatable =metadataworkspace.OpenTable("XIAN");
ITable table =metadatatable.Table;
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.AllUpdateChild;
List<RowBase> rows = table.GetEntityList<RowBase>(queryfilter);
其中子表查询类型包括:
///<summary>
///不填充
///</summary>
No =0,
///<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" + "=@name";
filter.FillChild= FillChildType.AllUpdateChild;
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" + "=@name";
filter.FillChild= FillChildType.AllUpdateChild;
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))
return;
if(String.IsNullOrEmpty(newtablename))
return;
IMetadataTable metadatatable =MetadataWorkspaceFactory.OpenMetadataWorkspace().OpenTable(tableid);
if(metadatatable == null)
return;
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 : RowBase
{
#region 数据结构
///<summary>
///
///</summary>
public const string FIELD_MAINID = "MAINID";
///<summary>
///
///</summary>
public const string FIELD_CHNAME = "CHNAME";
///<summary>
///
///</summary>
public const string FIELD_ENNAME = "ENNAME";
///<summary>
///
///</summary>
public const string FIELD_MEMO = "MEMO";
#endregion
#region 属性
///<summary></summary>
public Int64 MAINID
{
get { return GetValue<Int64>(FIELD_MAINID); }
set { SetValue(FIELD_MAINID, value); }
}
///<summary></summary>
public String CHNAME
{
get { return GetValue<String>(FIELD_CHNAME); }
set { SetValue(FIELD_CHNAME, value); }
}
///<summary></summary>
public String ENNAME
{
get { return GetValue<String>(FIELD_ENNAME); }
set { SetValue(FIELD_ENNAME, value); }
}
///<summary></summary>
public String MEMO
{
get { return GetValue<String>(FIELD_MEMO); }
set { SetValue(FIELD_MEMO, value); }
}
#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> fields;
protected override Dictionary<string, MetadataField> GetTableFields()
{
if (fields == null)
{
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.String;
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.String;
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.String;
itemField.FieldID = 5;
itemField.FieldAliasName = "";
itemField.CanShow = true;
itemField.AllowNull = true;
fields.Add(itemField.FieldName.ToUpper().Trim(), itemField);
}
return fields;
}
private RelationNode relationNode;
protected override RelationNode GetTableRelation()
{
if (relationNode == null)
{
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.UpdateChild;
relationInfo.RelationType = RelationType.OneToMore;
relationNode.ChildRelationNode.Add(DictSubTable.TABLE_NAME, relationInfo);
}
return relationNode;
}
protected override TableType GetTableType()
{
return TableType.Table;
}
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);
更多推荐
数据库操作入门文档
发布评论