Clone框架:http://www.52chloe.com/Wiki/Document/3324802610879266816

Clone框架支持多种数据库,我用的是sql server

  基本查询:

1.取前几条数据

  sql server的sql 语句是:

 UPDATE dbo.POM_Entry SET Status = 'Suspend' WHERE EntryCode IN
(SELECT TOP EntryCode FROM dbo.POM_Entry WHERE OrderCode = 'POM20170401151750740865' AND status = 'Issued' ORDER BY OrderIndex desc);

  用Clone框架:.TakePage(1,20)

 //将该订单下相应个数的状态为下发的工单的状态改为暂停
public void SuspendAmount(string orderCode, int SuspendAmount)
{
       //加事务
this.DbContext.DoWithTransaction(() =>
{
          //查询出该订单下状态为下发的工单,并按排序号倒叙排序,取出SuspendAmount个工单,将其状态设为暂停
List<POM_Entry> Lq = this.DbContext.Query<POM_Entry>().FilterDeleted()
.Where(a => a.OrderCode == orderCode && a.Status == "Issued")
.OrderByDesc(a => a.OrderIndex).TakePage(, SuspendAmount).ToList();
var entryAccount = Lq.Count;
for (var i = ;i < entryAccount; i++)
{
            //更新语句a => a.EntryCode == entryCode中entryCode不能用Lq[i].EntryCode代替,必须先取出来
var entryCode = Lq[i].EntryCode;
this.DbContext.Update<POM_Entry>(a => a.EntryCode == entryCode, a => new POM_Entry()
{
Status = "Suspend"
});
}
});
}

2.调用存储过程

  存储过程如下:

 SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--创建生成工单的存储过程
CREATE PROCEDURE [dbo].[P_POM_CreateEntry]
@OrderCode nvarchar(),--输入参数订单号
@CreateUserId NVARCHAR(),--输入参数创建者ID
@vMsg INT OUTPUT --输出参数
AS
BEGIN
SET NOCOUNT ON;
DECLARE --声明变量
@MaterielNo NVARCHAR(),
@NumberSegmentStart INT,
@NumberSegment INT,
@CellCode NVARCHAR(),
@PPRCode NVARCHAR(),
@Type NVARCHAR(),
@OrderIndex INT = 1,
@Amount FLOAT= --根据订单号查询 给变量赋值
SELECT
@MaterielNo = dbo.POM_Order.MaterielNo,
@NumberSegmentStart = dbo.POM_Order.NumberSegmentStart,
@CellCode = dbo.POM_Order.CellCode,
@PPRCode = dbo.POM_Order.PPRCode,
@Type = dbo.POM_Order.[Type],
@Amount= dbo.POM_Order.Amount
FROM dbo.POM_Order WHERE OrderCode = @OrderCode;
SET @NumberSegment = @NumberSegmentStart
--加入事务
begin tran;
begin TRY
--循环号段
DELETE FROM dbo.POM_Entry WHERE OrderCode = @OrderCode;--如果存在删除
WHILE @NumberSegment < @NumberSegmentStart+CONVERT(INT,@Amount)--重点:int类型和float类型的直接相加 会出错,得做一下类型转换
BEGIN
INSERT dbo.POM_Entry
( Id ,
OrderCode ,
EntryCode ,
ProductUniqueCode ,
CellCode ,
PPRCode ,
Type ,
Status ,
PlanStartTime ,
PlanEndTime ,
ActualStartTime ,
ActualEndTime ,
OrderIndex,
CreationTime ,
CreateUserId ,
IsEnabled ,
IsDeleted ,
DeletionTime ,
DeleteUserId
)
VALUES ( NEWID() , -- Id - nvarchar() --调用函数
@OrderCode , -- OrderCode - nvarchar()
[dbo].[f_GetNumber]('EN', floor(RAND()*)) , -- EntryCode - nvarchar() --调用函数f_GetNumber
[dbo].f_GetProductUniqueCode(@MaterielNo, @NumberSegment) , -- ProductUniqueCode - nvarchar()--调用函数f_GetProductUniqueCode
@CellCode , -- CellCode - nvarchar()
@PPRCode , -- PPRCode - nvarchar()
@Type , -- Type - nvarchar()
'New' , -- Status - nvarchar()
NULL , -- PlanStartTime - datetime
NULL , -- PlanEndTime - datetime
NULL , -- ActualStartTime - datetime
NULL , -- ActualEndTime - datetime
@OrderIndex , -- OrderIndex - int
GETDATE() , -- CreationTime - datetime
@CreateUserId , -- CreateUserId - varchar()
, -- IsEnabled - bit
, -- IsDeleted - bit
NULL , -- DeletionTime - datetime
NULL -- DeleteUserId - varchar()
);
SET @NumberSegment += ;
SET @OrderIndex += ;
end
commit;--成功
SET @vMsg = ;
end TRY
begin catch
rollback tran;--失败回滚
SET @vMsg = ;
end catch
END

用Clone框架:

  public int CreateEntry(string orderCode) {
DbParam[] pas = new DbParam[];
pas[] = new DbParam("@OrderCode", orderCode);
pas[] = new DbParam("@CreateUserId",this.Session.UserId);
pas[] = new DbParam("@vMsg", null, typeof(int)) { Direction = ParamDirection.Output };
DbContext.SqlQuery<int>("P_POM_CreateEntry", CommandType.StoredProcedure, pas).FirstOrDefault();
return (int)pas[].Value;
}

3.对时间类型的模糊查询

  sql server 的sql语句:

SELECT ISNULL(COUNT(1), 0) as amount FROM dbo.POM_Entry WHERE convert(varchar(10), ActualEndTime, 121) = '2017-04-01' AND Status = 'Complete'

用Clone框架:Clone框架有.Contains(),表示like模糊查询,但是不适用于Date类型的字段ActualEndTime,所以我只能写sql语句了

        /*
平台首页:月产量统计图获取本月每日的产量
*/
public string GetFinishAmountByMonth(string year,int month,int day)
{
string MonthStr = "";
var dataStr = "";
int vliday = ;
if (month < )
{
MonthStr = "" + month.ToString();
}
else
{
MonthStr = month.ToString();
}
for(; vliday <= day;vliday ++ )
{
string NowDate = ""; if ( vliday < )
{
NowDate = year + "-" + MonthStr + "-" + "" + vliday.ToString();
}
else
{
NowDate = year + "-" + MonthStr + "-" + vliday.ToString();
}
//SELECT ISNULL(COUNT(1), 0) as amount FROM dbo.POM_Entry WHERE convert(varchar(10), ActualEndTime, 121) = '2017-04-01' AND Status = 'Complete'
string sql = "SELECT ISNULL(COUNT(1), 0) as amount FROM dbo.POM_Entry WHERE convert(varchar(10), ActualEndTime, 121) = '{0}' AND Status = 'Complete'";
POMDayProduct data = this.DbContext.SqlQuery<POMDayProduct>(string.Format(sql, NowDate),null).ToList()[];
if ( vliday != day)
{
dataStr = dataStr + data.amount + ",";
}
else
{
dataStr = dataStr + data.amount;
} }
return dataStr;
}

注意:

1.这个方法得频繁的和数据库交互,不是很好;

2.对时间模糊查询时,时间字符串必须是'2017-04-09'这样的格式,也就是说'2017-4-9'这种格式是查不出来数据的,

所以我对月,日做了判断,小于10==>拼成'0x';

3.时间字符串类型的转换,充分利用convert(varchar(10), ActualEndTime, 121),这个函数是将ActualEndTime日期类型转化为10位的字符串时间:'2017-04-09';

4.查询某一天的记录直接利用convert()函数等值判断就可以了,不需要like了,代码中的"= '{0}'"就是了,而且" '{0}'"表示第一个参数NowDate,一定要加单引号,不然数据库也是查询不出来的;

5.SELECT ISNULL(COUNT(1), 0) as amount 也要注意, ISNULL(COUNT(1), 0)的数据类型是int类型的,所以POMDayProduct实体里的属性amount的类型(as amount) 也一定必须是int类型的;

6.最后说一下,为了避免和数据库多次交互,这个方法本来我是写成了存储过程,但无奈返回的是"1,2,3,4,,,,,"类型的字符串,而我用Clone框架的this.DbContext.SqlQuery<T>,T不能使用string,必须是一个实体,故放弃了存储过程

持久层框架Clone的更多相关文章

  1. MyBatis持久层框架使用总结

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  2. MyBatis持久层框架使用总结 转载

    MyBatis持久层框架使用总结   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  3. Mybatis详解系列(一)--持久层框架解决了什么及如何使用Mybatis

    简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...

  4. java持久层框架mybatis如何防止sql注入

    看到一篇很好的文章:http://www.jfox.info/ava-persistence-framework-mybatis-how-to-prevent-sql-injection sql注入大 ...

  5. .NET平台下,关于数据持久层框架

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

  6. 菜鸟学习Hibernate——持久层框架

    一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...

  7. .NET平台数据持久层框架

    在.NET平台下的几个数据持久层框架: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS.NET 5.DAAB 6.DLinq

  8. Hibernate数据库持久层框架

    Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...

  9. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

随机推荐

  1. IPv6系列-入门指南

    本文是<IPv6系列>文章的第一篇<入门指南>,用于快速了解并上手IPv6. 小慢哥的原创文章,欢迎转载 目录 ▪ 一. 为什么要了解IPv6 ▪ 二. 顾虑:IPv6地址太复 ...

  2. 看似简单!解读C#程序员最易犯的7大错误

    编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中, ...

  3. vue入门--简单路由配置

    在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装.然后在目录中可以看到有个文件夹叫route ...

  4. 入门 IT 行业,该具备哪些技能?

    对于刚开始进入IT的新人来说,“必备技能”往往意味着一个长长的.标有重要度的学习列表,但是过长的列表通常会导致新人不知如何开始学习,压力倍增.本文尝试列举出最重要的几个技能,也期望通过此列表能给新人一 ...

  5. SQL的where执行顺序

    SQL的where执行顺序 1 mysql 从左到右. 一个原则,排除越多的条件放到第一个 例子:抄的. SELECT … WHERE p.languages_id = 1 AND m.languag ...

  6. UVa 10106 Product 【大数相乘】WA

    虽然是错的代码,但是还是想贴出来,最开始WA发现是没有考虑到乘积为0的情况,后来把a*0,0*a,a*0---0(若干个0),0--0(若干个0)*a都考虑进去了:可是还是WA,实在不懂先留在这儿. ...

  7. ZBrush中Layer层笔刷介绍

    本文我们来介绍ZBrush®中的Layer层笔刷,该笔刷是一种类似梯田效果的笔刷,常用来制作鳞甲和花纹图腾.他还可以用一个固定的数值抬高或降低模型的表面,当笔刷在重合时,笔画重叠部分不会再次位移,这使 ...

  8. Jmeter数据库测试

    Jmeter安装 Jmeter是纯java程序,所以在安装jmeter之前需要先安装JDK,并配置JDK路径,然后开始安装Jmeter. 进入Jmeter官网(https://jmeter.apach ...

  9. CentOS7上安装google谷歌浏览器

      1.首先进入根目录,然后进入etc/yum.repos.d目录下,创建google-chrome.repo文件 cd / cd etc/yum.repos.d vim google-chrome. ...

  10. C#追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件

    C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"\\myText.txt"); sw ...