AppFramework1.0数据库访问组件使用说明(四)基础数据类型

【工业软件开发学习——AnyCAD篇】模式(Schema)、组件(Component)与参数化对象(Part II) 基于AnyCAD实现属性修改与关联更新 阅读详情
 
为了规避IBatisNet的空值问题,AppFramework不使用C#基本类型来构造实体类。AppFramework对C#基本类型作了简单封装,增加了一个是否有值的属性来标志字段值是否非空。
每一种基本的C#类型都有对应的DBValue对其进行封装。
C#类型
DBValue类型
数据库类型
byte
ByteValue
数字类型
short
ShortValue
数字类型
int
IntValue
数字类型
long
LongValue
数字类型
sbyte
SByteValue
数字类型
ushort
UShortValue
数字类型
ulong
ULongValue
数字类型
uint
UIntValue
数字类型
DateTime
DateTimeValue
日期时间
string
StringValue
Varchar/NVarchar 或
Text/CLOB类型
float
FloatValue
数字类型
double
DoubleValue
数字类型
decimal
DecimalValue
数字类型、金额
byte[]
BLOBValue
BLOB类型
 
1.1.2  DBValue的属性方法
在AppFramework里, DBValue主要用于构造数据库的表实体类。代码生成器为每个数据表生成一个实体类,为每个表字段生成一个子类化的DBValue属性,并自动实现实体类的构造、赋值。测试数据表明,虽然DBValue构造的实体类比用C#基本类型构造的实体类要“重”一些,但其构造对象的性能比IBatis用反射的方式构造对象的性能还是高很多。
下表简单列举了DBValue的基本属性和方法:
属性/方法
类型
说明
HasValue
Bool
标志字段是否有值,构造时初始化为false
Object
Object
获取或设置字段内部封装的值,如果 HasValue 为 false, 获取时得到 null
DBObject
Object
获取或设置字段内部封装的值,如果 HasValue 为 false, 获取时得到 DBNull.Value;
如果设置 DBNull,则 HasValue 改变为 false;
Value
封装的C#类型
获取字段值,HasValue 为 false 时获取 Value 值将获得所封装类型的默认值
ToString()
String
显示为文本,如果HasValue为false,则返回string.Empty
Clear()
Void
把HasValue设置为false,但清除Value值
例如,IntValue 封装了 int类型的数据库字段,IntValue.HasValue表示是否有值,如果没有值访问IntValue.Value属性会得到int的默认值。对无值的IntValue调用ToString()会得到空字符串。
正确的用法应该是先通过HasValue判断是否有值,然后在访问Value获取值。
 
public BasUser GetUser(string fields, int id)
{
    // 获得dao
    IBasUserDAO dao = DAOManager.Default.GetDAO<IBasUserDAO>();
    // 获得数据库会话
    using (IDBSession session = DBSessionManager.Default.GetSession())
    {
        return dao.Get(session, fields, id);//返回得到的实体,如果未找到记录,返回null
    }
}
 
public void ShowUser(int userID)
{
         BasUser user = GetUser(userID);
         if (user != null)
         {
                  txtName.Text = user.Name.ToString();
                  txtAge.Text = user.Age.ToString();
         }
}
 
DBField封装的基本目的是表达C#原始类型的所不能表达的“空值”、“默认值”、“表达式”等信息,其结构为“字段名—操作符—表达式”,在AppFramework中主要用于插入和更新数据库记录时为数据库字段赋值或表达式。经过扩展,也适用于各一些表达 “字段名—操作符—表达式”结构的SQL语句片段,例如“字段名 in (select … from)”这样的子查询。
DBField封装了各种通用的数据库字段类型,如下表:
C#类型
DBField类型
数据库类型
Object
DBField
通用类型
Byte
ByteField
数字类型
Short
ShortField
数字类型
Int
IntField
数字类型
Long
LongField
数字类型
Sbyte
SByteField
数字类型
Ushort
UShortField
数字类型
Ulong
ULongField
数字类型
uint
UIntField
数字类型
DateTime
DateTimeField
日期时间
string
StringField
Varchar/NVarchar
string
TextField
Text/CLOB类型
float
FloatField
数字类型
double
DoubleField
数字类型
decimal
DecimalField
数字类型、金额
byte[]
BLOBField
BLOB类型
注意:DBField比DBValue多了对两种基础类型的封装,一个是DBField对object的封装,另一个是TextField对CLOB/TEXT大文本字段的封装。
1.1.4  DBField的属性方法
下表简单列举了DBField的基本用法:
属性/方法
类型
说明
FieldName
string
获取或设置字段名
Operator
DBOperator
获取或设置字段操作符,例如大于、小于、等于、in、like……等常用操作符,默认为 Equal
Value
封装的C#类型
获取字段值,HasValue 为 false 时获取 Value 值将获得所封装类型的默认值
Expression
string
获取或设置字段表达式
Flag
DBFieldFlag
获取字段值状态标志,当标志值为NotSet时表示未设置值,标志值为Value 表示此对象的Value属性有效; Expression表示此对象的Expression有效。默认为 NotSet。
DataType
DataType
获取或设置字段值类型
AsObject
object
以 object 方式获取或设置字段值,如果 Flag为 NotSet, 获取时得到 null
SelectStatement
SelectStatement
获取或设置字段的子查询表达式
SetDefault()
void
设置字段为其默认值
SetNull()
void
设置字段为空值
Clear()
void
清除字段值或表达式,把Flag设置为NotSet
ToString()
string
已重载。若Flag为NotSet,返回string.Empty。若Flag为Value,则返回Value.ToString()。若Flag为Expression,则返回Expression。
 
为了方便使用,提供了几个静态方法快速创建各种DBField:
方法
返回值
说明
CreateExpression
DBField
创建一个表达式,有多个重载,可以对各个属性进行设置。
string fieldName:字段名
DataType t:字段类型
DBOperator op:表达式的操作符
string expression:表达式
CreateDefault
DBField
创建一个默认值字段
CreateNull
DBField
创建一个空值字段
Create
DBField
虚方法,子类将重载,创建一个子类DBField
 
通过IDBSession和DBFieldk可以轻松实现insert和update:
// 插入记录insert
using (IDBSession session = DBSessionManager.Default.GetSession())
{
    // 插入记录
session.Insert(
           “BAS_USER”,
           new DBField(“Name”, “王二”),
           new DBFieldI(“En_Name”, “Wanger”)
           ……
           new DBFieldI(“Age”, 26)
);
}
 
// 更新记录update
using (IDBSession session = DBSessionManager.Default.GetSession())
{
         string updateCondition = “id = 100”;
    // 更新记录
session.Update(
           “BAS_USER”,
           updateCondition,
           new DBField(“Name”, “王二”),
           new DBFieldI(“En_Name”, “Wanger”)
           ……
           new DBFieldI(“Age”, 26)
);
}
 
 
用IDBSession实现insert和update是一种高效的数据插入和更新方式,测试数据表明其性能超过iBatis的插入更新性能的60~100%。
为了进一步简化代码,AppFramework采用生成DAO和参数实体类(由DBField组成的实体类)实现插入和更新。下列代码中BasUserParam是一个参数实体类,其属性均为子类化的DBField,对其属性赋值后传给DAO的Insert或Update方法实现插入或更新:
// 构造用户信息参数类
IBasUserParam user = new BasUserParam();
user.Name.Value = "MyBasName";
user.EnName.Value = "EnMyBasName" ;
user.CreatorID.Value = 0;
user.DeptID.Value = 100;
user.Email.Value = "Email";
user.EmployeeNo.Value = "EmployeeNO" ;
user.OrgID.Value = 0;
user.Password.Value = "Password";
user.State.Value = 0;
user.UpdatedBy.Value = 0;
user.Age.Value = 25;
user.LastUpdatedTime.SetDefault();
 
// 获得dao
IBasUserDAO dao = DAOManager.Default.GetDAO<IBasUserDAO>();
// 获得数据库会话
using (IDBSession session = DBSessionManager.Default.GetSession())
{
dao.Insert(session, user); // 插入记录
return user.ID.Value;//返回新用户的ID
}
 
 
Debian 9下手工部署Nextcloud 18:LAMP深度调优与安全加固指南 Nextcloud 是开源私有云的核心平台,其本质是基于 PHP 的 Web 应用服务,依赖 LAMP(Linux-Apache-MySQL-PHP)技术栈实现文件同步、协作办公与数据自治。理解其运行原理需掌握 Apache MPM 模式切换、PHP-FPM 进程管理、OPcache 缓存机制及 MariaDB 字符集配置等底层知识。这类传统部署方式虽步骤较多,但具备极高的可审计性、安全可控性和长期稳定性,特别适合教育机构、中小团队及边缘服务器等对数据主权和运维透明度要求严格的场景。本文聚焦 Debian 阅读详情

相关推荐

Ubuntu 18.04 搭建 ownCloud 私有云盘全指南

私有云盘是企业与个人实现数据自主可控的核心基础设施,其本质是基于 Web 服务架构的文件同步与共享系统。原理上依赖 LAMP(Linux-Apache-MySQL-PHP)栈协同工作,需精确匹配组件版本、字符集(如 utf8mb4)、缓存机制(OPcache/APCu)及安全策略(trusted_domains、HTTPS 强制)。技术价值在于规避公有云风险、满足等保合规、支持离线协作与细粒度权限管控。典型应用场景包括中小企业文档中心、家庭 NAS Web 化管理、教育机构资源分发及 Linux 运维实训环

weixin_30791095的博客 481

[四]基础数据概述之Byte详解

Byte 基本数据类型byte 的包装类 Byte 类型的对象包含一个 byte类型的字段 属性简介 构造方法 Byte的构造方法也是有两种 可以通过基本类型byte 或者字符串形式 Byte(byte value) Byte(String s) 常用方法 比较 static ...

noteless的博客 1054

基于C#的机器人控制框架:如何将ROS与硬件集成

本文探讨了如何利用C#与ROS(Robot Operating System)集成开发机器人控制系统。通过ROSSharp库和rosbridge中间件,实现了C#与ROS的WebSocket通信,并展示了硬件控制模块的设计方法。文章详细介绍了电机控制的串口通信实现、ROS消息订阅机制,以及性能优化和容错处理策略,最终构建了一个智能小车控制框架的案例。这种C#与ROS的集成方案为机器人开发提供了跨平台支持,同时兼顾了系统的高效性和可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1138

Java基础语法2 变量 数据类型 Byte类型范围 数据类型转换

Java基础语法 变量 数据类型 Byte类型范围 数据类型转换

lrn521zsd的博客 734

HttpClient跳过HTTPS证书验证的3种实战方法(含完整代码示例)

本文详细介绍了HttpClient跳过HTTPS证书验证的3种实战方法,包括自定义TrustManager、SSLContext配置和HttpClientBuilder高级定制,并提供完整代码示例。这些方法适用于开发和测试环境,帮助开发者快速解决自签名证书或未认证证书导致的HTTPS请求失败问题,但需注意生产环境的安全风险。

weixin_29213655的博客 529

地下水热耦合模拟FEFLOW建模

2.3 依据讲解内容,练习构建地下水数值模型(例二),学会各种源汇项、边界条件、时间序列、节点参数的添加及模拟结果的导出。对于真实模型,学习如何建立概念模型、数学模型,练习模型的各种参数和源汇项输入,进行溶质运移、水热模拟。3.通过多种实践案例应用,掌握实践工作中常见项目的模型搭建及特殊问题处理方法。4.1学习水热模型抽灌模式,网格剖分、边界条件、初始温度场赋值。3.3练习模型的各种参数和源汇项输入,进行水流和溶质运移模拟。2.掌握水热耦合的模拟方法及典型项目应用问题处理。2.4根据模拟结果,

weixin_55561616的博客 964

深入理解数据类型

1. 前言 有很多人会说,数据类型不是在高级语言编程中都会讲的吗,C,C++,C#,JAVA等都讲的很清楚,为什么还要提出来说呢?其实我想说,在几乎所有的高级语言编程书籍中,都将数据类型的讲解与底层割裂开来,对数据的大小端只字不提(C++之父写的书讲到了大小端),对浮点数的编码也没有讲清楚,什么是网络字节序和字节对齐更没有讲解,那些数据类型需要考虑网络字节序,那些不需要,有符号数和无符号数到底有什么区别?其实,所有定义的数据类型,都是基于底层而来,所以有必要从底层来分析理解数据类型,以下结合....

ComputerInBook的专栏 1814

手把手教你用CEFSharp打造防关联指纹浏览器(附完整代码)

本文详细介绍了如何基于CEFSharp框架,从零开始构建一个企业级的防关联指纹浏览器。通过剖析核心架构、多进程隔离实现、动态指纹混淆(如Canvas、WebGL)的实战代码,以及代理集成与性能优化,为跨境电商、广告投放等场景提供了一套可控、安全的开源解决方案。

fern8的博客 961

byte范围及8种常见数据类型

byte范围:-128  到 127 原因 : 在计算机内,定点数有3种表示法:原码、反码和补码 原码 :二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码 :正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码 :正数的补码与其原码相同;负数的补码是在其反码的末位加1。 java中用补码表示二进制数,补码的最高位是符号

J 博客 3万+

Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知

Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知 文章目录Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知1.实现思路2.新增钉钉机器人并测试消息的发送2.1.新增钉钉机器人2.2.测试发送消息到钉钉3.在Jenkins中新建一个构建任务3.1.新建任务3.2.配置任务时增加参数化构建过程3.3.配置任务添加git地址3.4.配置构建触发器生成gitlab webhook使用的token3.5.配置任务构建过程中执行的She

江晓龙的博客 3808

【SA8155P】AIS Camera相关内容的简单介绍

【SA8155P】AIS Camera相关内容的简单介绍

静谧、淡雅 1698

Field类的使用

概述 Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。 Field类中提供了对反射获取的类中成员变量进行操作的方法。 类中每个成员变量都有数据类型和数据值。 在Java中数据类型分为基本数据类型和引用数据类型。 基本数据类型分为四类八种: 整数:byte、short、int、long 浮点数:float、double 字符:char 布尔值:boolean 引用数据类型: 所有引用数据类型都继承自java.lang.Ob

二木成林 4789

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1766

AppFramework1.0数据库访问组件使用说明(六)QueryFilter的使用

 1.1  QueryFilter的使用QueryFilter是AppFramework提供的一个功能强大、不需要编写SQL语句、跨数据库、参数化、执行性能优异的查询条件构造器。有了QueryFilter我们不需要再拼装SQL语句,不用再担心单引号导致SQL注入的安全漏洞,不用担心被众多的AND、OR、NOT等逻辑运算符弄得晕头转向,不用区分处理TO_DATE、UPPER等无法跨数据库的表

框架提高生产力 5312

如何提高电路的抗干扰能力

本内容详细介绍了电源传导干扰处理,包括滤波、Feedthrough电容器、磁环、磁珠、屏蔽的使用与选型,EMC电磁兼容测试项目简介与要求,单片机与电源抗干扰处理等。

让你爱上电路设计 8595

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

AppFramework1.0数据库访问组件使用说明(一)引言

   1  概述1.1  引言约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过30%的代码集中在数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与访问机制、本地事务与分布式事务支持、多数据库支持,这些机制或功能形成相对独立的逻辑领域,其主要目的有:1、    提供简单易用的数据库访问方法,

框架提高生产力 2177

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

AppFramework1.0数据库访问组件使用说明(八)DAO类的使用

 1.1  DAO类的使用在AppFramework里DAO类可以由代码生成工具自动生成,开发者只需要通过DAO类基本上就可以完成大部分增删查改业务,一些特殊的业务如果无法用DAO实现,则可以通过SqlMap结合IDBSession来实现。DAO主要处理三类对象:1、       表:生成的代码有增删改查等方法;2、       视图:生成的代码有查询方法;3、      

框架提高生产力 1409

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

AppFramework1.0数据库访问组件使用说明(二)入门

 2.1 安装1.1.1  软件环境要求已安装如下软件:1、       安装了.Net Framework 2.02、       安装了Visual Studio 20053、       如果要访问MSAccess数据库,需安装了MDAC(1.7以上版本)4、       如果要访问Oracle数据库,需安装了ODP.NET专业的开发人员一般都知道如何获取和安

框架提高生产力 2523

AppFramework1.0数据库访问组件使用说明(五)IDBSession使用详解

 1.1  IDBSession使用详解IDBSession负责与数据库打交道,它通过ADO.NET实现几种常用数据库的连接。目前支持3种数据库:SQLServer(7.0、2000、2005三个版本,推荐2005)、ORACLE(8.1.7以上,推荐9i)、MSAccess(需要MDAC1.7以上支持)。与IDBSession有关的关系图如下:       

框架提高生产力 2444

AppFramework1.0数据库访问组件使用说明(七)SqlTemplate与SqlMap的使用

 1.1  SqlTemplate与SqlMap的使用1.1.1  SqlTemplate原理在早期做过报表系统开发的都知道,众多的查询条件和复杂的统计逻辑都直接硬编码在程序里,程序代码与SQL代码交织在一起,程序文件变得冗长杂乱,时间久了就变得难以维护。SqlTemplate是AppFramework提供的一种可视化、结构化的动态SQL语法,其代码为XML格式,从程序中剥离出来编写在

框架提高生产力 1711

AppFramework1.0数据库访问组件使用说明(三)配置文件详解

  1.1  配置文件详解1.1.1  在DBAccess.config配置多个数据源如果应用系统规模较大,有可能会使用多个数据源。AppFramework支持多个数据源,配置方法是在DBAccess.config里配置多个节点,并给每个数据源命名不同的名称。注意,为了提高性能,应该把最常用的数据源设置为默认数据源,在DataSource节点里把Default属性设置值为true,例如

框架提高生产力 1456

用 AppFramework 替换 Discuz!NT 的数据库访问层

(一)分析DIscuz!NT 支持2种数据源,SqlServer和MSAccess,但其数据库访问层实际上已经支持了 MySQL,只是安装程序还未提供基于 MySQL  的。 Discuz!NT采用了"页面类 -> 业务类 -> 数据库访问类 -> DbHelper -> 数据库"这样的分层方式。数据库访问类有1个大接口3个大实现。所谓大接口就是 IDataProvider 接口,定义了9

框架提高生产力 2289

用AppFramework重写Discuz数据访问层源代码

下载地址:http://download.csdn.net/source/331414 修改的地方主要有:1)在解决方案里增加了“Discuz.Data.AppFramework”项目2)AppFramework插件生成的代码放在“Discuz.Data.AppFramework”项目的GenerateCode目录下3)对论坛管理的数据访问类源代码ForumManage.cs做了重

框架提高生产力 2311

凌驾于数据库之上的数据静态缓存技术思考和范例

    一个性能良好的系统,数据的读、写、查、删、改效率至关重要,其中读和查更是重中之重,本篇将以一个简单的实例来探索与数据库无关的数据静态缓存技术。所谓与数据库无关,就是无论存储数据库是何种类型,这个缓存技术都是适用的,要实现这样的数据库无关性,我们需要在数据访问层动刀,及将数据访问层进一步细分为数据库访问中间件层-数据缓存层-数据访问层,其中:    数据库访问中间件层负责与物理数据库打交

liveweb的专栏 1016

java lzma解压_lzma-java

相关开源项目DWR NetBeans plugin:DWR NetBeans pluginCapivara:Capivara是一个文件同步(FileSync)管理器,支持SFTP与FTP服务器.纯Java开发,支持Linux与Windows系统.Jeppers:Jeppers是一个基于Web的Java电子表格.它同时也提供一个用在Swing应用程序的LGPL Grid组件.GWTChismes:G...

weixin_34175388的博客 459

10分钟学会使用mybatis

pipeliner/src/main/java/com/age/sale/dao/SqlMapConfig.xml 数据库配置文件:(这里配置了,tomcat的server.xml就不用配了)

ouyida3的专栏 819
上一篇: AppFramework1.0数据库访问组件使用说明(三)配置文件详解
下一篇: AppFramework1.0数据库访问组件使用说明(五)IDBSession使用详解
AppFramework
博客等级 码龄19年 61粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值