数据库操作入门文档

数据库操作入门文档

数据库操作(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.net 表达式解析

字典表名

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中的对应关系:

自定义类型

说明

映射到.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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
8.用执行计划分析SQL性能      EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句      通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称      按照从里到外,从上到下的次序解读分析的结果      EXPLAIN PLAN的分析结果是用缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于同一层中,带有最小操作号的将首先被执行      目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具      PG需要将自己添加的查询SQL文记入log,然后在EXPLAIN PLAN中进行分析,尽量减少全表扫描      ORACLE SQL性能优化系列      1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理      在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表      当ORACLE处理多个表时,会运用排序及合并的方式连接它们      首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;      然后扫描第二个表(FROM子句中最后第二个表);      最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并      例如:      表 TAB1 16,384 条记录      表 TAB2 5 条记录      选择TAB2作为基础表 (最好的方法)      select count(*) from tab1,tab2 执行时间0.96秒      选择TAB2作为基础表 (不佳的方法)      select count(*) from tab2,tab1 执行时间26.09秒      如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:   EMP表描述了LOCATION表和CATEGORY表的交集   SELECT *   FROM LOCATION L,   CATEGORY C,   EMP E   WHERE E.EMP_NO BETWEEN 1000 AND 2000   AND E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN      将比下列SQL更有效率   SELECT *   FROM EMP E ,   LOCATION L ,   CATEGORY C   WHERE E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN   AND E.EMP_NO BETWEEN 1000 AND 2000      2.WHERE子句中的连接顺序      ORACLE采用自下而上的顺序解析WHERE子句      根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾      例如:   (低效,执行时间156.3秒)   SELECT *   FROM EMP E   WHERE SAL > 50000   AND JOB = 'MANAGER'   AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      (高效,执行时间10.6秒)   SELECT *   FROM EMP E   WHERE 25 50000   AND JOB = 'MANAGER';      3.SELECT子句中避免使用'*'      当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法      实际上,ORACLE在解析的过程中,会将'*'依次转换成所有的列名      这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间      4.减少访问数据库的次数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值