2013年10月22日星期二

SQlLIte中常见的问题总结 - wangyong969

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
SQlLIte中常见的问题总结 - wangyong969  阅读原文»

一、Sqllite中不能使用日期进行相减,执行结果无效

  例如:SELECT count(*) as cnt FROM DayBanalces WHERE (date(ofDay)- date('2013-04-26 00:00:00'))=0 ×

正确: SELECT count(*) as cnt FROM DayBanalces WHERE (date(ofDay) = date('2013-04-26 00:00:00'))

二、SqlLite中 0 与0.0的差别

  首先先在数据库中创建1张表及插入少许数据

  

1 Create Table ZeroDemo
2 (
3 id int identity(1,1),--在Sqllite中这句话的写法应该为:id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
4 num1 numeric(18,10),
5 num2 numeric(18,10),
6 numType int
7 )
8
9
10 INSERT INTO ZeroDemo(num1,num2,numType) values(1,10,1)
11 INSERT INTO ZeroDemo(num1,num2,numType) values(2,20,1)
12 INSERT INTO ZeroDemo(num1,num2,numType) values(3,30,1)
13 INSERT INTO ZeroDemo(num1,num2,numType) values(4,40,1)
14 INSERT INTO ZeroDemo(num1,num2,numType) values(5,50,2)
15 INSERT INTO ZeroDemo(num1,num2,numType) values(1,1.19999,1)

通常SqlServer中我们的写法如下:

1 ---在SqlServer中如果某列的类型与所需要的列不一致,而又要统计合计sum值的时候,写法一般如下:
2 SELECT
3
4 SUM(
5 (CASE numType WHEN 1 THEN num1*num2 ELSE 0 end )
6 ) as demosCoumns
7
8 FROM ZeroDemo

但是在SqlLite中特别是操作Sum函数时候,一定要强制转成REAL类型, CAST(num1 as REAL)* CAST(num2 as REAL) ELSE CAST(0 AS REAL)

1 SELECT
2
3 SUM(
4 (CASE numType WHEN 1 THEN CAST(num1 as REAL)* CAST(num2 as REAL) ELSE CAST(0 AS REAL) end )
5 ) as demosCoumns
6
7 FROM ZeroDemo

或者 0.0

SUM(
(
CASE numType WHEN 1 THEN num1*num2 ELSE 0.0 end )
)
as demosCoumns

FROM ZeroDemo

以上SqlLite在工具中执行的结果可能是一样的,但是如是你用.net调用System.Data.SQLite.dll的时候,如果你依然使用sqlserver的写法,那么可能出来的结果小数位数就会不见。具体的原因参见如下的文章:

http://lvyaojia.sinaapp.com/2012/08/sqlite%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C%E6%95%B0%E6

.NET中如何测试Private和Protected方法 - 罗旭成  阅读原文»

TDD1)写测试2)写通过这些测试的代码,3)然后重构的实践.,NET社区中, 这个概念逐渐变得非常流行,这归功于它所增加的质量保证.此时,它很容易测试public方法,但是一个普遍的问题出现了,”我如何测试Protectedprivate方法呢?”

本文将:

  • 总结你是否应该测试private方法的争论?”的一些关键点.
  • 创建一些案例,这些案例仍旧是有用的,至少知道怎样测试privateprotected方法不考虑你站在争论的哪一边.
  • 提供方法和可下载的代码示例来展现这些测试技术.

背后的方法

你是否应该测试private方法?

一个Google查询 向你展示了有很多关于使用private方法的争议,更不用说测试他们了.下面这个表概括了一些关于这个话题的正方和反方的普遍意见.

正方

反方

使用private方法

  • 封装private方法提供了封装,对于终端客户来说,它使代码更易使用
  • 重构更容易重构private方法,一位他们永远不会直接被外部的客户端调用,因此,修改签名(Signature)不会影响任何方法调用.
  • 验证 不像public方法那样必须验证所有输入,因为他们被外部调用时,private方法在类中安全调用,不需要同样严格的验证输入应该在public方法中已经验证了.
  • 测试范围暴露每个方法为public,将在很大程度上增加测试的范围.private方法仅仅使用在开发者如何去使用他们,然而public方法需要测试每种可能,这就需要一个更广阔的测试范围了.
  • 不能重构如果一个类足够复杂,值得使用private方法,那么它需要重构.
  • 隐藏功能性 private方法(如果正确设计)提供有用的客户端可以访问的特性,那么任何private方法都值得测试,并且应该真正为public.

测试Private方法

  • 测试控制 private方法可以包含复杂的逻辑,并且它可以增加测试控制来直接访问方法,测试它,来代替通过一个public方法间接访问它.
  • 原则单元测试是测试最小的功能代码片断.private方法是功能型代码片断,因此,基于原则,private方法应该是可测试的.
  • 已经覆盖了仅仅只有public接口才可以测试.private已经测试了, 它是通过测试的public方法调用来完成的.
  • 脆弱的代码如果你重构代码,操作private方法,并且如果你有和这些private相关的测试,你同时也需要操作这些测试.

在这些主题的两方,都有明了并且具有经验的人.因此我不打算,也不期望终结我是否应该测试private方法的争论.但是对于双方来说,这里仍有价值来知道如何测试他们,即使你认为private不应该被测试.

  • 如果你至少能表现出你可以测试他们,但是你没有这样做(例如,你没有简单的说不要测试private方法”,因为你不知道如何去测试),你的观点将更加具有说服力.
  • 测试非public方法的选择让你明白在你的小组中,什么真正做的最好.
  • 只要仍有有效的条件,是值得拥有一种方便的方法来测试他们.

好的原则以及不适当的技术

Andrew Hunt a David Thomas在他们的书中Pragmatic Unit Testing in C# with NUnit, 解释到,好的单元测试是ATRIP:

  • 自动化(Automatic)
  • 彻底(Thorough )
  • 可重复(Repeatable)
  • 独立(Independent )
  • 专业(Professional)

对于测试private/protected方法来说,有另外三个附加原则:

  • 透明(Transparency) - 不要改变测试下的系统(System Under Test ,SUT),例如,在产品代码中增加包装的方法.
  • 范围(Scope) - 可以在DebugRelease下运行
  • 简单(Simplicity)阅读更多内容

没有评论:

发表评论