Agile.Net 组件式开发平台 - 数据访问类库

Agile.DataAccess.dll 文件为平台数据访问支持库,本ORM基于FluentData扩展重写,提供各种数据库访问功能。

数据库支持列表:

MS SQL Server using the native .NET driver.

MS SQL Azure using the native .NET driver.

MS Access using the native .NET driver.

MS SQL Server Compact 4.0 through the Microsoft SQL Server Compact 4.0 driver.

Oracle through the ODP.NET driver.

MySQL through the MySQL Connector .NET driver.

SQLite through the SQLite ADO.NET Data Provider.

PostgreSql through the Npgsql provider.

IBM DB2

Sybase through the https://github.com/FredoKapo/FLUENT-ORM-ASE-PROVIDER provider.

API示例

 

查询返回动态对象列表

List<dynamic> products = DataContext.Script("select * from Product")
.QueryMany<dynamic>();
查询返回强类型对象列表
List<Product> products = DataContext.Script("select * from Product")
.QueryMany<Product>();

查询返回单个动态对象

dynamic product = DataContext.Script(@"select * from Product where ProductId = 1").QuerySingle<dynamic>();

查询返回单个强类型对象

Product product = DataContext.Script(@"select * from Product where ProductId = 1").QuerySingle<Product>();

查询返回数据表

DataTable products = DataContext.Script("select * from Product")
.QuerySingle<DataTable>();

查询一个标量值

int number = DataContext.Script(@"select count(*) from Product")
.QuerySingle<int>();

查询一个标量值的列表

List<int> productIds = DataContext.Script(@"select ProductId from Product").QueryMany<int>();

自定义匹配实体类

List<Product> products = DataContext.Script(@"select p.*,
                       c.CategoryId as Category_CategoryId,
                       c.Name as Category_Name
                       from Product p
                    inner join Category c on p.CategoryId = c.CategoryId")
                       .QueryMany<Product>();

自定义映射

List<Product> products = DataContext.Script(@"select * from Product")
                       .QueryMany<Product>(Custom_mapper_using_dynamic);
 
public void Custom_mapper_using_dynamic(Product product, dynamic row)
{
        product.ProductId = row.ProductId;
        product.Name = row.Name;
}

自定义映射使用DataReader

List<Product> products = DataContext.Script(@"select * from Product")
                       .QueryMany<Product>(Custom_mapper_using_datareader);
 
public void Custom_mapper_using_datareader(Product product, IDataReader row)
{
        product.ProductId = row.GetInt32("ProductId");
        product.Name = row.GetString("Name");
}

查询参数的应用

方式1

dynamic products = DataContext.Script(@"select * from Product where ProductId = @0 or ProductId = @1", 1, 2).QueryMany<dynamic>();
 
方式2
dynamic products = DataContext.Script(@"select * from Product where ProductId = @0 or ProductId = @1").Parameters(1, 2).QueryMany<dynamic>();
 
方式3(命名参数)
dynamic products = DataContext.Script(@"select * from Product where ProductId = @ProductId1 or ProductId [email protected]").Parameter("ProductId1", 1).Parameter("ProductId2", 2).QueryMany<dynamic>();
 
方式4(输出参数):
var command = DataContext.Script(@"select @ProductName = Name from Product where ProductId=1").ParameterOut("ProductName", DataTypes.String, 100);
command.Execute();
string productName = command.ParameterValue<string>("ProductName");

 

分页查询:

List<Product> products = DataContext.Select<Product>("p.*, c.Name as Category_Name").From(@"Product p inner join Category c on c.CategoryId = p.CategoryId ").Where("p.ProductId > 0 and p.Name is not null")
.OrderBy("p.Name").Paging(1, 10).QueryMany();

 

 

插入数据

 

方式1

DataContext.Script(@"insert into Product(Name, CategoryId) values(@0, @1);").Parameters("Way", 1).Execute();
 

方式2 (插入数据并返回自增主键)

int productId = DataContext.Script(@"insert into Product(Name, CategoryId) values(@0, @1);").Parameters("Way", 1).ExecuteReturnLastId<int>();
 
方式3 (插入数据并返回自增主键)
int productId = DataContext.Insert("Product")
                       .Column("Name", "The Warren Buffet Way")
                       .Column("CategoryId", 1)
                          .ExecuteReturnLastId<int>();
 
方式4 (自动构造SQL)
Product product = new Product();
product.Name = "The Warren Buffet Way";
product.CategoryId = 1;
product.ProductId = DataContext.Insert<Product>("Product", product)
                          .AutoMap(x => x.ProductId)
                          .ExecuteReturnLastId<int>();
 

更新数据

 

方式1

int rowsAffected = DataContext.Script(@"update Product set Name = @0 where ProductId = @1").Parameters("The Warren Buffet Way", 1).Execute();
 

方式2

int rowsAffected = DataContext.Update("Product")
                          .Column("Name", "The Warren Buffet Way")
                          .Where("ProductId", 1)
                          .Execute();
 

方式3 (自动构造SQL)

int rowsAffected = DataContext.Update<Product>("Product", product)
                         .AutoMap(x => x.ProductId)
                          .Where(x => x.ProductId)
                          .Execute();

 

 

插入或更新补填方法

var product = new Product();
product.Name = "The Warren Buffet Way";
product.CategoryId = 1;
 
var insertBuilder = DataContext.Insert<Product>("Product", product).Fill(FillBuilder);
 
var updateBuilder = DataContext.Update<Product>("Product", product).Fill(FillBuilder);
 
public void FillBuilder(IInsertUpdateBuilder<Product> builder)
{
        builder.Column(x => x.Name);
        builder.Column(x => x.CategoryId);
}
 
删除数据
 
方式1
int rowsAffected = DataContext.Script(@"delete from Product where ProductId = 1").Execute();
 

方式2

int rowsAffected = DataContext.Delete("Product")
                       .Where("ProductId", 1)
                       .Execute();
 

方式3

int rowsAffected = DataContext.Delete<Product>("Product", product)
                       .Where(x => x.ProductId)
                       .Execute();
 
 
 
存储过程
 
方式1
var rowsAffected = DataContext.Script("ProductUpdate")
                       .CommandType(DbCommandTypes.StoredProcedure)
                       .Parameter("ProductId", 1)
                       .Parameter("Name", "The Warren Buffet Way")
                       .Execute();
 
方式2
var rowsAffected = DataContext.Procedure("ProductUpdate")
                      .Parameter("Name", "The Warren Buffet Way")
                      .Parameter("ProductId", 1).Execute();
 
方式3
var rowsAffected = DataContext.Procedure<Product>("ProductUpdate", product).AutoMap(x => x.CategoryId).Execute();
 
方式4
var rowsAffected = DataContext.Procedure<Product>("ProductUpdate", product) .Parameter(x => x.ProductId)
        .Parameter(x => x.Name).Execute();
 

事物应用

 

使用事务时包装里面的代码使用using语句来确保数据库连接关闭。 默认情况下,如果发生任何异常或者不提交将事物自动回滚.

using (var context = DataContext.BeginTransaction())
{
     context.Script("update Product set Name = @0 where ProductId = @1")
            .Parameters("The Warren Buffet Way", 1)
            .Execute();
 
context.Update("Product").Column("Name", "The Warren Buffet Way")
                          .Where("ProductId", 1)
                          .Execute();
 
context.Update<Product>("Product", product)
           .AutoMap(x => x.ProductId)
           .Where(x => x.ProductId)
           .Execute();
 
context.Commit();
}

 

平台规范:

 

在本平台新增、更新、删除数据均采用以上API完成。由于数据查询的复杂性和可变性,平台规范要求使用SQL语句,示例如下:

首先在脚本管理器中定义查询脚本,例如”2001”号脚本

 

API:

Product product = DataContext.ScriptById(2001).QuerySingle<Product>();
List<Product> products = DataContext.ScriptById(2001).QueryMany<Product>();
Product product = DataContext.ScriptById(2001)
.Parameter("ProductId", 3).QuerySingle<Product>();
时间: 2024-10-16 20:28:11

Agile.Net 组件式开发平台 - 数据访问类库的相关文章

Agile.Net 组件式开发平台 - 报表组件类库

Agile.Report.dll 文件为平台报表支持库,基于FasstReport.Net扩展重写,提供报表打印.报表预览.报表设计.自定义报表数据源等二次开发功能. 示例   //声明报表对象 var report = new Agile.Report.ReportLib(); //添加查询参数 report.AddParameter("Code", "1023"); ////添加自定义数据源 //report.AddDataSource(DataSource);

Agile.Net 组件式开发平台 - 数据库文档

Agile.Debgu.exe 文件为平台文档中心应用程序,该程序集成了数据库结构文档查询.数据库结构文档浏览.实时系统日志监控等功能. 数据库结构文档浏览 数据库结构文档查询

Agile.Net 组件式开发平台 - 服务端部署

应用服务器: 操作系统最低要求Windows Server 2008,服务器硬件如果支持64位建议安装64位操作系统产品以最大化发挥服务器性能. 首先安装操作系统Windows Server 2008,其次对操作系统做必要安全设置,详情请咨询产品经销商.然后将平台服务端安装至D盘AgileServer文件夹内,服务端配置更改请修改” System.Config”配置文件,双击AgileServer.exe安装 ” Agile.Net 分布式服务端 - 系统核心支撑服务” ,启动” Agile S

PIE SDK组件式开发综合运用示例

1. 功能概述 关于PIE SDK的功能开发,在我们的博客上已经分门别类的进行了展示,点击PIESat博客就可以访问,为了初学者入门,本章节将对从PIE SDK组件式二次开发如何搭建界面.如何综合开发进行详细的讲解. 2. 功能实现 2.1.界面搭建 最终的界面如下图所示: 图1最终结果图 2.1.1 新建项目 选择“Window窗体应用程序”,设置程序的名称和保存路径即可.(新建完成后可以将程序的窗体名称右键重命名为“FormMain”,,将窗体界面的属性的Text设置名称为“PIE应用程序”

基于TypeScript的FineUIMvc组件式开发(简介)

不熟悉FineUI的可以访问其官方网站(http://www.fineui.com),在这里我从我的个人角度说一下FineUI,FineUI有多个版本,但主要基于2种架构,一种是基于Asp.net WebForm,别一种是基于Asp.net Mvc. 在WebForm版本下,虽然FineUI是一个前端构架,但在一些常规简单项目中几乎不用写JS代码,除了首次请求页面,后续的操作都是基于Ajax的,而JS代码都是由服务器端动态生成,并放到客户端执行,这也是FineUI的一大特点.了解WebForm的

前端全栈架构,组件式开发,响应式开发,全栈工程师架构,用户界面架构,企业级架构项目实战

我本是一名文科专业半路出家的前端开发人员,从最初只会切图和写CSS.Html到现在会写点JS,一路坑坑洼洼,也是经历了很多,从2010年开始就用WordPress开设了自己的博客,虽然内容零零散散的并不多,但是多多少少也留下了时光的缩影,一直希望自己有一个自留地.用Node.js做服务端替换WordPress是去年的一个想法,由于一直腾不出时间,所以拖到了现在.当然了WordPress作为全球用户量最广的开源博客程序,易用性等诸多好处无可厚非,光自己的博客在过去几年就用了很多套模板,也用它做过很

基于TypeScript的FineUIMvc组件式开发(开头篇)

了解FineUIMvc的都知道,FineUIMvc中采用了大量的IFrame框架,对于IFrame的优缺点网上也有很多的讨论,这里我要说它的一个优点"有助于隔离代码逻辑",这也是FineUIMvc官网对它的描述.IFrame在网页上下文中是完全独立的,这样也就不存在了样式及脚本之间的冲突问题.但由于IFrame与上下文之间是隔离的,在交互上也给我们带来了一些不便. 在接下来的文章中,我将主要介绍如何使用TypeScript对FineUIMvc进行组件式开发,而这里的组件就是基于IFra

项目架构开发:数据访问层之Query

接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操作,多表联查并没有实现 其实对于任何一个项目来说,多表联查都是比较麻烦的地方,因为项目的“读”操作,特别是多表的“读”,至少占据所有“读”的一半以上 然而至今,据我所知还没有哪一款ORM工具可以灵活处理多表联查:想要不写sql语句,又想性能高,还想用强类型的ling查询方法:这对于多表查询来说比较难

注入式类的写法,解耦,组件式开发,沙箱

沙箱(网络编程虚拟执行环境) Sandboxie(又叫沙箱,沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或者其他应用. 因此运行会产生的变化可以随后删掉. 它创造了一个类似沙盒的独立作业环境,在其中内部运行并不会对硬盘产生永久的影响. 其为一个独立的 虚拟环境,可用以测试不受信任的应用程序或上网行为. 沙箱是一种按照安全策略限制程序行为的执行环境. 早期主要用于测试可疑软件等,比如黑客们为了试用某种病毒或者不安全产品,往往可以将它们在沙箱环境中运行. 经典的沙箱系统的实现途经一般是通