[转载]谈谈J2EE框架Paoding-Rose - 施杨 - 博客园

mikel阅读(1136)

[转载]谈谈J2EE框架Paoding-Rose – 施杨 – 博客园.

很久没有发过文章了,不是俺懒,首先是精力放到了考试和申请上了,从八月到十二月都在忙考试和申请,现在已经都

告一段落了,可以干些别的事了。其实说没时间也都是借口,主要还是技术上没有太值得写的东西,自己没亲自上手用过的,不

想写些没啥质量的水文或者评论文章,非技术的东西又写着没意思,转载某本书的章节或者翻译外文的事,俺也兴趣不大。所以

没东西写就干脆不写。

最近给我的一个产品做技术选型,耍了耍Paoding-Rose(下文简称Rose),其实这个框架早在两年前我就关注到了,

当时是在Infoq上看到的一篇人人网架构师的文章,说开源了人人网的前端框架Rose,只不过那个时候已经被各种J2EE框架整的

麻木了,所以只是下载了,但是一直没用过。当时的兴趣都在动态语言和MacOS上,那会的编译原理和操作系统课也挺牵扯精力

的(后半句是借口)。Rose的Google Code官网下载的包里没有Demo,只有几个jar文件,官网上有Wiki作为使用指南,帮助

开发者使用这个框架。Wiki写的挺全的,勤快点还是可以做出来官方Demo的。这次借这个机会,用Rose做了一个小Demo,一

个简单的雇员管理系统,包含了基本的CRUD、分页、上传、拦截器、Portal,持久层用的Rose自带的Jade,用的最新版本1.01

(其实也不算新,一年半都没更新过了),用的很舒服,开发效率非常高。如果再来个脚本工具自动建个表并生成个CRUD,那效

率就真赶上Rails了。为啥我这里要提Rails,那是因为Rails有个闪亮的特点,叫约定优于配置。(您要非说两个框架的首字母都是R

,我也没意见)。网上关于Rose的文章很少,俺写写填补一下空白吧。先声明一下,俺并没有任职于人人网,只是觉得这个开源框

架中有些设计思路不错,所以记下来。下面会谈谈我在使用Rose的过程中发现的七个明显的优点。

 

1.       约定优于配置

先说约定优于配置,这个优点是我体会最深的。包路径,类名,类方法名都不需要配置文件声明,只要名称包含特定的关键字和

Annotation就行,只要满足这个条件,其他的命名部分可以随便修改,不需要修改任何配置。如图:

包名和类名:

Annotation声明:

这非常爽,当年用SSH单挑项目的时候,写配置都写的手酸。这里就牵扯到XML和Annotation哪个更好的问题了,总之各有优势,

我会分场合使用。XML的优点是配置独立于代码外,无需编译,结构也更清晰直观,便于管理与修改。例如Ibatis就把SQL都放到xml

里,这样确实非常方便管理。Annotation的优点就是提供一体化解决方案,不涉及XML等第三方技术标准,开发起来比较顺手也很简

洁,不用担心XML文件过多。JPA就是把数据映射都用Annotation配置,也确实干净。我在使用的过程中会把经常变动的属性提到XML

中,这样方便管理与修改。Annotation则处理不经常变动的部分,比如一些数据或路径映射关系。

2.       自动绑定

自动绑定也是非常实用的功能,Struts2和Struts比起来,比较明显的地方就是表单的自动绑定,我当时实用struts2的时候,

是必须使用struts2标签和set才能自动绑定表单数据的。Rose则不用这样,没有任何标签限制,可以自由绑定属性,并且直接通过

Annotation传参,不需要set数据。数据持久层的Jade框架也提供属性自动绑定,不需要任何的set,get方法,非常提升开发效率。

3.       REST风格

由于Rose基于Spring开发,所以使用了很多Spring MVC的组件,也带来了Spring MVC的REST风格,Rose具备了Spring MVC

的很多优势,为了验证与Spring MVC的异同,我专门做了一个Spring MVC 3.0版本的CRUD操作,用来比较开发效率与实现方法。还

是Rose更为快速,Rose对Spring MVC中的URL映射和页面传值操作都进行了优化,看起来更优雅一些,完全支持REST。

4.       Jade极简主义

Jade框架极大的提升了开发效率,DAO接口方法加一句SQL实现数据库操作和赋值,不多说了,上图:

补充一点,当然也是支持整合缓存框架的,即便是有些缓存框架的支持不是特别的好,我觉得自己管理缓存也无所谓,反倒更灵活一些。

自己可以决定保存哪些字段。我倒是不怎么喜欢啥都扔给hibernate管理。

5.       Portal技术

这个技术蛮帅的,也是人人网架构师比较自豪的一个java后台原创技术,实现的基本原理就是对于需要许多数据渲染的页面(例如

公共主页)做页面模块切分,比如关注列表一个模块,留言一个模块,最新动态一个模块等等。然后每个模块作为一个window并发从

数据库取数据,然后再重新整合数据,最终呈现给用户。可以设置一个时限,比如几百ms,如果在限定时间内,数据没有拿出来,就不

显示这个模块了,保证用户端的响应速度。这个技术也经过了SJ圣战的洗礼,确实发挥了作用,是一个蛮有意思的设计思路。后台原理

类似scala的并发算法,把数据分块,然后并发计算。前台效果也类似新浪微博使用的页面片段加载技术,为了保证用户的响应速度,先

部分加载页面片段,逐步显示整个页面。Facebook也有一套类似的实现方案。

6.       兼容性

Rose使用过滤器而非Servlet拦截请求,现在大部分框架都在通过过滤器拦截请求,比如Struts2,Spring。这样做的好处就是,

可以方便与其他框架的兼容。也基于这点使Rose有了REST的风格。并且也可以与基于Servlet拦截请求的Struts共存,改造遗留系统。

官方描述人人网的前端框架就是这样移植的。

7.       养成好习惯

首先是灵活的拦截器控制,比如局部拦截器是基于包目录的作用域,这样可以帮助开发者养成良好的权限模块切分习惯。其次是

控制器方法映射支持正则表达式以及直接返回Json和XML格式数据,这样可以帮助开发者更好的命名映射路径与规范输出数据。约定

优于配置也帮助开发者规范的命名包和类。某种程度上Rose收集了最佳实践,引导开发者遵守规范。最后如果框架存在Bug或者兼容性

问题,可以通过修改框架源码解决。

 

PS:对Rose有兴趣可以访问官网,链接:http://code.google.com/p/paoding-rose/,wiki写的挺全。

[转载]PHP date函数 - VIP-爷 - 博客园

mikel阅读(860)

[转载]PHP date函数 – VIP-爷 – 博客园.

PHP的日期时间函数date()

1,年-月-日
echo date(‘Y-m-j’);
2007-02-6

echo date(‘y-n-j’);
07-2-6

大写Y表示年四位数字,而小写y表示年的两位数字;
小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字。

echo date(‘Y-M-j’);
2007-Feb-6

echo date(‘Y-m-d’);
2007-02-06

大写M表示月份的3个缩写字符,而小写m则表示月份的数字(带前导0);
没有大写的J,只有小写j表示月份的日期,无前导o;若需要月份带前导则使用小写d。

echo date(‘Y-M-j’);
2007-Feb-6

echo date(‘Y-F-jS’);
2007-February-6th

大写M表示月份的3个缩写字符,而大写F表示月份的英文全写。(没有小写f)
大写S表示日期的后缀,比如“st”、“nd”、“rd”和“th”,具体看日期数字为何。

小结:
表示年可以用大写的Y和小写y;
表示月可以用大写F、大写M、小写m和小写n(分别表示字符和数字的两种方式);
表示日可以用小写d和小写j,大写S表示日期的后缀。

2,时:分:秒

默认情况下,PHP解释显示的时间为“格林威治标准时间”,与我们本地的时间相差8个小时。

echo date(‘g:i:s a’);
5:56:57 am

echo date(‘h:i:s A’);
05:56:57 AM

小写g表示12小时制,无前导0,而小写h则表示有前导0的12小时制。
当使用12小时制时需要表明上下午,小写a表示小写的“am”和“pm”,大写A表示大写的“AM”和“PM”。

echo date(‘G:i:s’);
14:02:26

大写G表示24小时制的小时数,但是不带前导的;使用大写的H表示带前导的24小时制小时数

小结:
字母g表示小时不带前导,字母h表示小时带前导;
小写g、h表示12小时制,大写G、H表示24小时制。

3,闰年、星期、天

echo date(‘L’);
今年是否闰年:0

echo date(‘l’);
今天是:Tuesday

echo date(‘D’);
今天是:Tue

大写L表示判断今年是否闰年,布尔值,为真返回1,否则为0;
小写l表示当天是星期几的英文全写(Tuesday);
而使用大写D表示星期几的3个字符缩写(Tue)。

echo date(‘w’);
今天星期:2

echo date(‘W’);
本周是全年中的第 06 周

小写w表示星期几,数字形式表示
大写W表示一年中的星期数

echo date(‘t’);
本月是 28 天

echo date(‘z’);
今天是今年的第 36 天

小写t表示当前月份又多少天
小写z表示今天是本年中第几天

4,其他

echo date(‘T’);
UTC
大写T表示服务器的时间区域设置

echo date(‘I’);
0
大写I表示判断当前是否为夏令时,为真返回1,否则为0

echo date(‘U’);
1170769424
大写U表示从1970年1月1日到现在的总秒数,就是Unix时间纪元的UNIX时间戳。

echo date(‘c’);
2007-02-06T14:24:43+00:00
小写c表示ISO8601日期,日期格式为YYYY-MM-DD,用字母T来间隔日期和时间,时间格式为HH:MM:SS,时区使用格林威治标准时间(GMT)的偏差来表示。

echo date(‘r’);
Tue, 06 Feb 2007 14:25:52 +0000
小写r表示RFC822日期。

小小的date()函数就显示出了PHP的强大功能和迷人魅力,再比较下ASP,呵呵。

—————————————————————————-

PHP日期时间函数的高级应用技巧

PHP的日期时间函数date()中介绍了PHP日期时间函数的简单用法,这类将介绍更多的函数来丰富我们的应用。

checkdate($month,$date,$year)

如果应用的值构成一个有效日期,则该函数返回为真。例如,对于错误日期2005年2月31日,此函数返回为假。

在日期用于计算或保存在数据库中之前,可用此函数检查日期并使日期生效。
<?php
// returns false
echo checkdate(2,30,2005) ? “valid” : “invalid”;
// returns true
echo checkdate(4,6,2010) ? “valid” : “invalid”;
?>

getdate($ts)

在没有自变量的情况下,该函数以结合数组的方式返回当前日期与时间。数组中的每个元素代表日期/时间值中的一个特定组成部分。可向函数提交可选的时间标签自变量,以获得与时间标签对应的日期/时间值。

应用此函数来获得一系列离散的,容易分离的日期/时间值。

<?php
// get date as associative array
$arr = getdate();
echo “Date is ” . $arr[‘mday’] . ” ” . $arr[‘weekday’] . ” ” . $arr[‘year’];
echo “Time is ” . $arr[‘hours’] . “:” . $arr[‘minutes’];
?>

mktime($hour, $minute, $second, $month, $day, $year)

此函数的作用与getdate()的作用相反:它由一系列的日期与时间值生成一个UNIX时间标签(GMT时间1970年1月1日到现在消逝的秒数)。不用自变量时,它生成当前时间的UNIX时间标签。

用此函数获得即时时间的UNIX时间标签。这种时间标签通常用于许多数据库与程序语言中。

<?php
// returns timestamp for 13:15:23 7-Jun-2006
echo mktime(13,15,23,6,7,2006);
?>

date($format, $ts)

此函数将UNIX时间标签格式化成一个可人为阅读的日期字符串。它是PHP日期/时间API中功能最为强大的函数,可用在一系列的修正值中,将整数时间标签转变为所需的字符串格式。

为显示格式化时间或日期时,应用此函数。

<?php
// format current date
// returns “13-Sep-2005 01:16 PM”
echo date(“d-M-Y h:i A”, mktime());
?>

strtotime($str)

此函数将可人为阅读的英文日期/时间字符串转换成UNIX时间标签。

应用此函数将非标准化的日期/时间字符串转换成标准、兼容的UNIX时间标签。

<?php
// returns 13-Sep-05
echo date(“d-M-y”, strtotime(“today”));
// returns 14-Sep-05
echo date(“d-M-y”, strtotime(“tomorrow”));
// returns 16-Sep-05
echo date(“d-M-y”, strtotime(“today +3 days”));
?>

strftime($format,$ts)

如前面的setlocale()函数定义的那样,此函数将UNIX时间标签格式化成适用于当前环境的日期字符串。

应用此函数建立与当前环境兼容的日期字符串。

<?php
// set locale to France (on Windows)
setlocale(LC_TIME, “fra_fra”);

// format month/day names
// as per locale setting
// returns “septembre” and “mardi”

echo strftime(“Month: %B “);
echo strftime(“Day: %A “);
?>

microtime()

如前面的setlocale()函数定义的那样,此函数将UNIX时间标签格式化成适用于当前环境的日期字符串。

应用此函数建立与当前环境兼容的日期字符串。

<?php
// get starting value
$start = microtime();

// run some code
for ($x=0; $x<1000; $x++) {
$null = $x * $x;
}

// get ending value
$end = microtime();

// calculate time taken for code execution
echo “Elapsed time: ” . ($end – $start) .” sec”;
?>

gmmktime($hour, $minute, $second, $month, $day, $year)

此函数由一系列用GMT时间表示的日期与时间值生成一个UNIX时间标签。不用自变量时,它生成一个当前GMT即时时间的UNIX时间标签。

用此函数来获得GMT即时时间的UNIX时间标签。

<?php
// returns timestamp for 12:25:23 9-Jul-2006
echo gmmktime(12,25,23,7,9,2006);
?>

gmdate($format, $ts)

此函数将UNIX时间标签格式化成可人为阅读的日期字符串。此日期字符串以GMT(非当地时间)表示。

用GMT表示时间标签时应用此函数。

<?php
// format current date into GMT
// returns “13-Sep-2005 08:32 AM”
echo gmdate(“d-M-Y h:i A”, mktime());
?>

date_default_timezone_set($tz)、date_default_timezone_get()

此函数此后所有的日期/时间函数调用设定并恢复默认的时区。

注:此函数仅在PHP 5.1+中有效。

此函数是一个方便的捷径,可为以后的时间操作设定时区。

<?php
// set timezone to UTC
date_default_timezone_set(‘UTC’);
?>

想1小时,不如做1分钟

mikel阅读(890)

案例分析《推广7 天 赚6460的方法》写了,很多人看,可都是看客。

经验、方法、实施步骤就在那里,随时都可以拿来操作,可真正有多少人做了?

一个也没有!

穷人和富人最大的差别不是财富多少,是思维模式!

再穷的富人,他也能想办法赚到钱,因为他脑袋里不会抱怨,抱怨只能带来抱怨,也只是抱怨!

富人思维是我怎么能变得富有?

富人追求的是控制钱的方法,穷人追求的是消费钱的方法

世界上很多事情不是我们想的那样,你不去尝试去实践永远不知道其中的奥秘。

有时候机会就是转瞬即逝,做了!你就抓住了!迟疑了!你就错过了!

[转载]mysql日期加减 - mysql数据库栏目 - 红黑联盟

mikel阅读(1166)

[转载]mysql日期加减 – mysql数据库栏目 – 红黑联盟.

1. MySQL 为日期增加一个时间间隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day);   – 加1天

select date_add(@dt, interval 1 hour);   -加1小时

select date_add(@dt, interval 1 minute);    – 加1分钟

select date_add(@dt, interval 1 second); -加1秒

select date_add(@dt, interval 1 microsecond);-加1毫秒

select date_add(@dt, interval 1 week);-加1周

select date_add(@dt, interval 1 month);-加1月

select date_add(@dt, interval 1 quarter);-加1季

select date_add(@dt, interval 1 year);-加1年

MySQL adddate(), addtime()函数,可以用date_add() 来替代。下面是date_add() 实现addtime() 功能示例:

mysql> set @dt = ‘2009-09-09 12:12:33′;

mySQL>

mysql> select date_add(@dt, interval ’01:15:30′ hour_second);-加上1小时15分30秒

date_add(@dt, interval ’01:15:30’ hour_second)

 

结果:2009-09-09 13:28:03

 

mysql> select date_add(@dt, interval ‘1 01:15:30’ day_second);-加1天1小时15分30秒

date_add(@dt, interval ‘1 01:15:30’ day_second)

2008-08-10 13:28:03

date_add() 函数,分别为@dt 增加了“1小时15分30秒” 和 “1天1小时15分30秒”

2. MySQL 为日期减去一个时间间隔:date_sub()

mysql> select date_sub(‘1998-01-01 00:00:00’, interval ‘1 1:1:1’ day_second);

date_sub(‘1998-01-01 00:00:00’, interval ‘1 1:1:1’ day_second)

www.2cto.com

MySQL date_sub() 日期时间函数 和date_add() 用法一致,不再赘述。另外,MySQL 中还有两个函数subdate(), subtime(),建议,用date_sub() 来替代。

3. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去N month(月)。

MySQL period_add(P,N):日期加/减去N月。

mysql> select period_add(200808,2), period_add(20080808,-2)

| period_add(200808,2) | period_add(20080808,-2) |

结果|               200810 |                20080806 |

MySQL period_diff(P1,P2):日期P1-P2,返回N 个月。

mysql> select period_diff(200808, 200801);

period_diff(200808, 200801)

结果:7

MySQL 中,这两个日期函数,一般情况下很少用到。

4. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减date1 date2,返回天数。网站制作学习网整理

select datediff(‘2008-08-08’, ‘2008-08-01’); – 7

select datediff(‘2008-08-01’, ‘2008-08-08’); -7

MySQL timediff(time1,time2):两个日期相减time1 time2,返回time 差值。

select timediff(‘2008-08-08 08:08:08’, ‘2008-08-08 00:00:00′);- 08:08:08

select timediff(’08:08:08′, ’00:00:00’);                      – 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

[转载]APP推广的八大“邪恶”方法 | 雷锋网

mikel阅读(924)

[转载]APP推广的八大“邪恶”方法 | 雷锋网.

现在APP的火爆程度简直不亚于房地产。在移动互联网行业的影响下,大量的传统开发者进入APP的领域,有做金融的,有做CRM软件销售的,有做房 产的等等,扫码下载APP的方式无处不在。很多传统开发者不知道APP行业已经是红海,这些人站在“海边”,正准备着“下水”。而在红海内的那些APP开 发者为了用户数,为了给投资人看数据,为了将来的发财梦,正在这片APP的红海之内用尽浑身解数,各种招数推广自己的APP。这些方法都是非正常方式推广 APP的技巧,也是笔者道听途说而来,从他们的推广方法上看到当年SP的影子。

105677540

第一种:刷榜

刷榜曝光于2010年底,可能之前已经很火,后期这个话题遭到大量的行业媒体曝光。当时著名的曝光事件是据说人人的作弊器忘记关闭,结果刷的流量超 过了雅虎。刷榜在行业是非常火爆的,但是对行业之外的人来说,还是有些迷茫。所谓刷榜就在App Store 上下载假的自家App的方式,以获得排名靠前的机会,从而获得真正的用户。这个和当年SP的自消费业务类似。刷榜的前期主要是刷App Store,后来苹果不断的修改排行算法,导致刷榜的成本不断高涨。当前的刷榜已经扩散到安卓渠道,主要原因是由于渠道集中化和APP的增长,出现了“僧 多粥少”的局面。国内的前十安卓渠道也被成为刷榜的目标。刷榜破坏了应用商店的排行机制,让众多应用商店的运营者们“痛苦不堪”。最痛苦的莫过于App Store的人,算法被不停的破解,要每天不停的修改算法。同时刷榜也让那些刷榜机构赚的钵满盆满,不过能刷得起榜的除了土豪还是土豪,开发者依旧望尘莫 及,只能望洋兴叹。

第二种:积分墙

如果说第一种方法是针对流量平台,那么这个第二种方式就是针对用户了,国内的上百个广告联盟为了推广广告主的APP,不得不用更加有才的方法刺激用 户下载他们的APP,这个就是积分墙,那些加了积分墙的APP,用户在使用时候遇到关卡时不得不点击弹出的积分墙下载APP才能获得更好的“复活”机会, 当然积分墙也在超前发展,之前的积分墙是累积积分,换礼品,现在的积分墙都是直接送钱了。只从苹果严厉打击刷榜之后,大家老实了一些,所以积分墙成了冲榜 的第二种手段,相比第一种,积分墙的用户还是非常真实的,只不过活跃度低了点。

第三种:刷评论

刷评论这个事之前还不是很知道,后来看了《flAppy  bird》火了之后,众多的APP开发者忽然发现,原来刷评论也能冲上App Store排行榜,于是,各家的刷榜机器再次启动,刷评论,结果上周看到一篇文章说到,苹果处罚了一家APP,删除了四万条评论。想象下苹果榜单的运营者 一定非常烦恼,每天为了保持正常的排名,天天和这些作弊者们斗争。为了App Store,为了下载量,针对App Store,各个行业推广者真是八仙过海——各显神通。

第四种:制造换壳App引流

这个是最新发现的,App Store对于最新上架的APP有一段时间的曝光机会,为新的APP能带来一些原始流量,也是App Store对新APP的扶持手段,不过这个手段貌似被很多不坏好意的开发者发现了,他们开发一个APP,提交上线后,把自家的APP换个皮,起个名字,再 提交一次,不停的换皮,改名,于是,每一次短暂的曝光机会都能带来一些流量,这样每个APP都加入同一个APP的广告,那么就相当于从App Store引流了。我只想说,太有才了。

第五种:盗版山寨App引流

相比第四种方法,第五种方法是非常不道德的,山寨或者盗版他人的APP,然后加入广告,上传到第三方应用商店,赚流量赚钱,一些中小广告联盟,没有 开发者做他们的广告,他们就山寨盗版他人的APP,放上广告,引流赚钱。他们流水线一样,批量盗版上百个APP,加入上百个广告,正所谓积少成多,总能转 到流量,要么引流到自己的APP上,要么卖广告赚钱,当然这个也算是APP的一种推广手段,如果有一天你下载到带广告的新浪微博,微信,QQ之类话,那一 定不是真的。

第六种:默认安装

每天一开Q,经常能看到群里,静默渠道,量大,我在想有多少的用户中招啊。所谓默认安装就是,你半夜睡觉的时候,你的手机突然下载了很多App。然 后自动打开,自动联网,然后自动卸载,第二天醒来还和以前一模一样。只不过,月初没有过几天流量耗尽了。这个和当初SP的暗扣真是没有什么区别。关键是 SP的暗扣还能查到谁家扣的钱,静默的话。你根本不知道是手机上那个App干的坏事,静默的发生大多是因为手机权限被root后。一些APP取得了手机的 最高级权限,然后就开始半夜干活了。不过,据说一些带PUSH功能的APP也可以直接在手机上安装App,这个就和木马一样。所以告诫各位看客,没事别乱 root手机,当然也有三流的手机厂商为了钱预置一些可以静默的APP在自己的手机里,这个是一条道都是黑的。不过,如果运营商看到这个方法的估计会很喜 欢,卖流量都卖发了。所以,请大家到正规的网站上,下载正规的APP,别轻易root手机。

第七种:病毒App引流

第七种APP推广方式和第六种基本差不多,唯一不同的是,危害性更大一些。拿一些知名APP做成病毒,控制无数的手机,就像控制着千军万马。一个指令下去,几十万的APP都在下载你的APP,你的APP流量自然就上涨了。

第八种:无数二手手机刷流量

上次有人微信上曝光,某人用了很多二手手机刷流量的事件,结果很快被删除了。由此可以看见使用大批量的二手手机刷APP也是一种生意,一方面数据是 真的,一方面还可以控制活跃度。现在的广告主不仅要求激活,还要求活跃度,这给推广APP的那些渠道商不小的压力。正所谓道高一尺,魔高一丈,通过上千部 自动下载,自动激活,也能造就很多活跃用户。

最后,说说笔者的一些感悟,现在很多做APP创业的,大部分都不是真正的为了梦想的,真正为了梦想的那是雷军,不要KPI,是周鸿祎,为了产品,他 们这些人才是真正的为了梦想,而这些APP创业者是为了什么呢?一方面是为了投资,尽快拿到大量的数据得到投资,一方面是为了赚钱,还有无数的投资者也是 为了赚钱,投资一个产品就想尽快IPO套现,透过那些APP的界面,和他们的方式,能看到APP背后“人”的无尽的贪欲,产品的泡沫和资本的泡沫正蔓延着 整个行业,很多APP终究只是昙花一现,当繁华落后,只有真正做产品的人才会获得成功和梦想。

作者:移动互联网李建华。微信:tianyi86913 申明。本文首发雷锋网,转载文章请注明个人名字和微信号。

[转载]MySQL BETWEEN 用法_PHP+MySQL数据库教程

mikel阅读(1040)

[转载]MySQL BETWEEN 用法_PHP+MySQL数据库教程.

MySQL BETWEEN 语法

BETWEEN 运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围。BETWEEN 同 AND 一起搭配使用,语法如下:

WHERE column BETWEEN value1 AND value2
WHERE column NOT BETWEEN value1 AND value2

通常 value1 应该小于 value2。当 BETWEEN 前面加上 NOT 运算符时,表示与 BETWEEN 相反的意思,即选取这个范围之外的值。

BETWEEN 实例

选取 uid 在 2 到 5 之间的用户数据:

SELECT * FROM user WHERE uid BETWEEN 2 AND 5

返回查询结果如下:

uid username password email regdate
2 小明 a193686a53e4de85ee3f2ff0576adf01 xiao@163.com 1278063917
3 Jack 0193686a35e4de85ee3f2ff0567adf490 jack@gmail.com 1278061380
4 小王 e10adc3949ba59abbe56e057f20f883e 12345@163.com 1289632955
5 5idev a193686a53e4de85ee3f2ff0576adf01 5idev@5idev.com 1291107029

除了数值类型外,BETWEEN 也支持字符串范围,如下选择出所有 username 介于 a 至 j 之间的用户(并包括单字母k/K):

SELECT * FROM user WHERE username BETWEEN 'a' AND 'k'

字符范围也支持汉字,但通常来说没什么意义。

MySQL BETWEEN 边界

虽然几乎所有的数据库都支持 BETWEEN … AND 运算符,但不同的数据库对 BETWEEN … AND 处理方式是有差异的。在 MySQL 中,BETWEEN 包含了 value1 和 value2 边界值,如上面选取 uid 在 2 到 5 之间的用户数据例子。

而有的数据库则不包含 value1 和 value2 边界值(类似于 > and <),也有数据库包含 value1 而不包含 value2(类似于 >= and <)。所以在使用 BETWEEN … AND 的时候,请检查你的数据库是如何处理 BETWEEN 边界值的。

MySQL BETWEEN 时间日期

BETWEEN AND 常用于检索时间或日期段内的内容,下面是一些常见的 BETWEEN 时间日期例子:

// int 时间戳格式,查询 2008-08-08 20:00:00 到 2009-01-01 零点之前的数据
SELECT * FROM table WHERE column_time BETWEEN 1218196800 AND 1230739199

// DATE 格式,查询 2008-08-08 到 2009-01-01 零点之前的数据
SELECT * FROM table WHERE column_time BETWEEN '2008-08-08' AND '2009-01-01'

// DATETIME 格式,查询 2008-08-08 20:00:00 到 2009-01-01 零点之前的数据
SELECT * FROM table WHERE column_time BETWEEN '2008-08-08 20:00:00' AND '2008-12-31 23:59:59'

但对于查询到当前时间的数据,建议使用 >= 运算符:

// DATETIME 格式,查询 2008-08-08 20:00:00 到当前时刻的数据
SELECT * FROM table WHERE column_time >= '2008-08-08 20:00:00'

可见,同样的需求,不同的字段类型,写法可能就不一样。从效率上来讲,int 时间戳格式效率最优。

以上 BETWEEN 的各个例子,虽然都是 SELECT 查询,但 BETWEEN 也可以用于 UPDATEDELETE 等适用 WHERE 表达式的 SQL 中。

MySQL BETWEEN 数据比较

BETWEEN 还具有数据比较功能,语法如下:

expr BETWEEN min AND max

当 expr 表达式的值大于或等于 min 且小于或等于 max 时, BETWEEN 的返回值为 1 ,否则返回 0 。利用这个功能,可以判断一个表达式或值否则在某个区间:

// 返回 0
SELECT 1 BETWEEN 2 AND 3
// 返回 1
SELECT 'b' BETWEEN 'a' AND 'c'
// 判断日期范围
SELECT 20080808 BETWEEN 20080101 AND 20090101

BETWEEN 与 <、<=、>=、> 等运算符在某些情况下有着类似的功能,但 BETWEEN 运算级别更高且效率上更甚一筹。当然由于 BETWEEN 存在边界值的问题而不够灵活,因此不同的情况,采用何种运算符,需要具体对待。

[转载]mysql中时间比较的实现 - 水晶糖 - 博客园

mikel阅读(1141)

[转载]mysql中时间比较的实现 – 水晶糖 – 博客园.

MySQL中时间比较的实现

unix_timestamp 函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果 使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970-01-01 00:00:00到指定时间所经历的秒数。有了这个函数,就可以很自然地把时间比较转换为一个无符号整数的比较。
例如,判断一个时间是否在一个区间内
unix_timestamp( time ) between unix_timestamp( ‘start ‘) and unix_timestamp( ‘end’ )
对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。
这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:
mysql> SELECT something FROM table
WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。
mySQL> select DAYOFWEEK(‘1998-02-03’);
-> 3
WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
mySQL> select WEEKDAY(‘1997-10-04 22:23:00’);
-> 5
mysql> select WEEKDAY(‘1997-11-05’);
-> 2
DAYOFMONTH(date)
返回date的月份中日期,在1到31范围内。
mysql> select DAYOFMONTH(‘1998-02-03’);
-> 3
DAYOFYEAR(date)
返回date在一年中的日数, 在1到366范围内。
mysql> select DAYOFYEAR(‘1998-02-03’);
-> 34
MONTH(date)
返回date的月份,范围1到12。
mysql> select MONTH(‘1998-02-03’);
-> 2
DAYNAME(date)
返回date的星期名字。
mysql> select DAYNAME(“1998-02-05”);
-> ‘Thursday’
MONTHNAME(date)
返回date的月份名字。
mysql> select MONTHNAME(“1998-02-05”);
-> ‘February’  www.2cto.com
QUARTER(date)
返回date一年中的季度,范围1到4。
mysql> select QUARTER(’98-04-01′);
-> 2
WEEK(date)
WEEK(date,first)
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数形式WEEK()允许
你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始,如果第二个参数是1,
从星期一开始。
mysql> select WEEK(‘1998-02-20’);
-> 7
mysql> select WEEK(‘1998-02-20’,0);
-> 7
mysql> select WEEK(‘1998-02-20’,1);
-> 8
YEAR(date)
返回date的年份,范围在1000到9999。
mysql> select YEAR(’98-02-03′);
-> 1998
HOUR(time)
返回time的小时,范围是0到23。
mysql> select HOUR(’10:05:03′);
-> 10
MINUTE(time)
返回time的分钟,范围是0到59。
mysql> select MINUTE(’98-02-03 10:05:03′);
-> 5
SECOND(time)
回来time的秒数,范围是0到59。
mysql> select SECOND(’10:05:03′);
-> 3
PERIOD_ADD(P,N)
增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。
mysql> select PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。
mysql> select PERIOD_DIFF(9802,199703);
-> 11
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
这些功能执行日期运算。对于MySQL 3.22,他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。
在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(见例子)date是一个指定开始日期的
DATETIME或DATE值,expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,expr是一个字符串;它可以以
一个“-”开始表示负间隔。type是一个关键词,指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期
中返回“type”间隔。下表显示了type和expr参数怎样被关联: type值 含义 期望的expr格式
SECOND 秒 SECONDS
MINUTE 分钟 MINUTES
HOUR 时间 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
MINUTE_SECOND 分钟和秒 “MINUTES:SECONDS”
HOUR_MINUTE 小时和分钟 “HOURS:MINUTES”
DAY_HOUR 天和小时 “DAYS HOURS”
YEAR_MONTH 年和月 “YEARS-MONTHS”
HOUR_SECOND 小时, 分钟, “HOURS:MINUTES:SECONDS”
DAY_MINUTE 天, 小时, 分钟 “DAYS HOURS:MINUTES”
DAY_SECOND 天, 小时, 分钟, 秒 “DAYS HOURS:MINUTES:SECONDS”
MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅
包含YEAR、MONTH和DAY部分(即,没有时间部分),结果是一个DATE值。否则结果是一个DATETIME值。
mysql> SELECT “1997-12-31 23:59:59” + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00   www.2cto.com
mysql> SELECT INTERVAL 1 DAY + “1997-12-31”;
-> 1998-01-01
mysql> SELECT “1998-01-01” – INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD(“1997-12-31 23:59:59”,
INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD(“1997-12-31 23:59:59”,
INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD(“1997-12-31 23:59:59”,
INTERVAL “1:1” MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB(“1998-01-01 00:00:00”,
INTERVAL “1 1:1:1” DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD(“1998-01-01 00:00:00”,
INTERVAL “-1 10” DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB(“1998-01-02”, INTERVAL 31 DAY);
-> 1997-12-02
mysql> SELECT EXTRACT(YEAR FROM “1999-07-02”);
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM “1999-07-02 01:02:03”);
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM “1999-07-02 01:02:03”);
-> 20102
如果你指定太短的间隔值(不包括type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,
如果你指定一个type是DAY_SECOND,值expr被希望有天、小时、分钟和秒部分。如果你象”1:10″这样指定值,
MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,”1:10″ DAY_SECOND以它等价于”1:10″ MINUTE_SECOND
的方式解释,这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,
结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。
mysql> select DATE_ADD(‘1998-01-30’, Interval 1 month);
-> 1998-02-28
注意,从前面的例子中词INTERVAL和type关键词不是区分大小写的。
TO_DAYS(date)
给出一个日期date,返回一个天数(从0年的天数)。
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS(‘1997-10-07’);
-> 729669
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。
FROM_DAYS(N)
给出一个天数N,返回一个DATE值。
mysql> select FROM_DAYS(729669);
-> ‘1997-10-07’
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。
DATE_FORMAT(date,format)
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)   www.2cto.com
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
所有的其他字符不做解释被复制到结果中。
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’, ‘%W %M %Y’);
-> ‘Saturday October 1997’
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’, ‘%H:%i:%s’);
-> ’22:23:00′
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’,
‘%D %y %a %d %m %b %j’);
-> ‘4th 97 Sat 04 10 Oct 277’
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’,
‘%H %k %I %r %T %S %w’);
-> ’22 22 10 10:23:00 PM 22:23:00 00 6′
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。
TIME_FORMAT(time,format)
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。
其他修饰符产生一个NULL值或0。
CURDATE()
CURRENT_DATE
以’YYYY-MM-DD’或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。
mysql> select CURDATE();
-> ‘1997-12-15’
mysql> select CURDATE() + 0;
-> 19971215
CURTIME()
CURRENT_TIME
以’HH:MM:SS’或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql> select CURTIME();
-> ’23:50:26′
mysql> select CURTIME() + 0;
-> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的    www.2cto.com
上下文被使用。
mysql> select NOW();
-> ‘1997-12-15 23:50:26’
mysql> select NOW() + 0;
-> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
如果没有参数调用,返回一个Unix时间戳记(从’1970-01-01 00:00:00’GMT开始的秒数)。如果UNIX_TIMESTAMP()用一
个date参数被调用,它返回从’1970-01-01 00:00:00′ GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME
字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP(‘1997-10-04 22:23:00’);
-> 875996580
当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。
FROM_UNIXTIME(unix_timestamp)
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串
还是或数字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580);
-> ‘1997-10-04 22:23:00’
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300   www.2cto.com
FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条
目同样的修饰符。
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
‘%Y %D %M %h:%i:%s %x’);
-> ‘1997 23rd December 03:43:30 x’
SEC_TO_TIME(seconds)
返回seconds参数,变换成小时、分钟和秒,值以’HH:MM:SS’或HHMMSS格式化,取决于函数是在一个字符串还是在数字
上下文中被使用。
mysql> select SEC_TO_TIME(2378);
-> ’00:39:38′
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(time)
返回time参数,转换成秒。
mysql> select TIME_TO_SEC(’22:23:00′);
-> 80580
mysql> select TIME_TO_SEC(’00:39:38′);
-> 2378
作者 晓风残月1990

 

[转载]C#使用 SQLite 数据库 开发的配置过程及基本操作类,实例程序:工商银行贵金属行情查看小工具 - vicky liang - 博客园

mikel阅读(2083)

[转载]C#使用 SQLite 数据库 开发的配置过程及基本操作类,实例程序:工商银行贵金属行情查看小工具 – vicky liang – 博客园.

–首发于博客园, 转载请保留此链接  博客原文地址

本文运行环境: Win7 X64, VS2010

1. SQLite 的优点:

SQLite 是一款轻型数据库,开发包只有十几M, 相对于 MSSQL 几个 G 的体积来说简直是小 Case, 而且在打包成的软件里只需要添加相关的 DLL 就可以在其他的电脑运行,这一点来说比 Access 数据库还要来得方便。

SQLite虽然很小巧,但是支持的SQL语句不会太逊色于其他开源数据库。

更多详情参见百科:SQLite

2. 开发包下载

SQLite 官方下载网址

本文所用开发包:sqlite-netFx40-setup-bundle-x86-2010-1.0.93.0.exe 

3. VS 2010 使用 SQLite

3.1 安装 SQLite

3.1.1. 安装部件有3个选项:Full installation(完全安装), Compact installation(精简安装), Custom installation(自定义安装), 本文所选为 Full installation

3.1.2 默认为不勾选 Instatll the designer components for Visual Studio 2010, 可以把这个选上

 

3.1.2 先在本地创建一个空白文件,扩展名为*.db,

添加 SQLite 连接: Server Explorer -> Data Connections -> Add Connection …

Data Source 为 SQLite Database file

由于表结构一般是一次性创作,所以添加数据库后使用视图直接建立数据表结构,不必使用代码创建

3.1.3 添加 SQLite 引用

Solution Explorer -> Reference -> Add Reference…        找到SQLite 安装路径添加 System.Data.SQLite.dll 引用

该类库包含SQLiteConnection , SQLiteCommand,SQLiteDataAdapter 等连接操作数据库需要的类

3.1.4 新建 SQLiteHelper 类,主要是db 连接的基本信息,如路径,以及一些数据表的基本操作方法(根据个人需要):

1 public class SQLiteHelper
2 {
3 public SQLiteConnection Connection
4 {
5 get
6 {
7 if (_cn == null)
8 {
9 Settings settings = new Settings();
10 string connection = settings.Connection.ToString();
11 _cn = new SQLiteConnection(connection);
12 }
13 return _cn;
14 }
15 }
16
17 private SQLiteConnection _cn = null;
18
19 public DataTable GetDataTable(string query)
20 {
21 DataTable dt = new DataTable();
22 try
23 {
24 Connection.Open();
25 GetAdapter(query).Fill(dt);
26 }
27 catch
28 { }
29 finally
30 {
31 Connection.Close();
32 }
33 return dt;
34 }
35
36 public bool Update(string tableName, DataTable dt)
37 {
38 try
39 {
40 Connection.Open();
41 string tableStructureQuery = string.Format("SELECT * FROM {0} WHERE 1 = 0", tableName);
42 SQLiteDataAdapter da = GetAdapter(tableStructureQuery);
43 da.Update(dt);
44 }
45 catch (Exception ex)
46 {
47 MessageBox.Show(ex.Message);
48 }
49 finally
50 {
51 Connection.Close();
52 }
53 return true;
54 }
55
56 public SQLiteDataAdapter GetAdapter(string query)
57 {
58 SQLiteCommand selectCommand = new SQLiteCommand(query, Connection);
59 SQLiteDataAdapter adapter = new SQLiteDataAdapter(selectCommand);
60 SQLiteCommandBuilder sb = new SQLiteCommandBuilder(adapter);
61 return adapter;
62 }
63
64 public bool ExecuteScript(string query)
65 {
66 try
67 {
68 SQLiteCommand selectCommand = new SQLiteCommand(query, Connection);
69 Connection.Open();
70 selectCommand.ExecuteNonQuery();
71 }
72 catch
73 {
74 return false;
75 }
76 finally
77 {
78 Connection.Close();
79 }
80
81 return true;
82 }
83 }
84
85 public static class DataViewHelper
86 {
87 public static DataView Clone(this DataView source, string filter)
88 {
89 if (source == null)
90 {
91 throw new ApplicationException("Source cannot be null");
92 }
93
94 DataView newView = new DataView(source.Table);
95
96 string viewfilter = source.RowFilter;
97
98 List filters = new List();
99 if (!string.IsNullOrEmpty(viewfilter))
100 filters.Add(string.Format("({0})", viewfilter));
101 if (!string.IsNullOrEmpty(filter))
102 filters.Add(string.Format("({0})", filter));
103
104 newView.RowFilter = string.Join(" AND ", filters.ToArray());
105
106 return newView;
107 }
108
109 public static DataView Clone(this DataView source)
110 {
111 return source.Clone(string.Empty);
112 }
113 }

(1) 其中 Setting.Connection 为 string 类型,只需要指定 db 路径,本文 Connection 为: Data Source=D:\Trade\Trade\DB\Quotation.db

这里提一下 MSSQL 的 连接字符串以示比较,一般情况下 MSSQL 的连接为ConnectionString 类型的配置节点,如:

<add name=”Test” connectionString=”Data Source=ServerName;Initial Catalog=dbName;User ID=xxx;Password=***;”
providerName=”System.Data.SqlClient” />

(2) 可以看到数库表的操作方法 与 其他数据库操作 类似:连接,运行操作命令,关闭

(3) 笔者尝试添加一个 SQLiteParameter.Direction 为 ParameterDirection.Output 的参数 但报错,至今没找到正确的使用方法

(4) 使用 SQLiteConnection 可以用 using 的方式使用,有利于程序内存管理及垃圾回收

3.1.5 新建 DAO 类,继承 SQLiteHelper ,主要是针对具体表 的方法:

1 public class DAO : SQLiteHelper
2 {
3 public DAO(string tableName)
4 {
5 TableName = tableName;
6 }
7 public string SelectTableQuery { get { return "SELECT * FROM " + TableName; } }
8
9 public string TableStructureQuery { get { return SelectTableQuery + " WHERE 1=0"; } }
10
11 public int GetMaxID(string fieldName)
12 {
13 SQLiteHelper helper = new SQLiteHelper();
14 StringBuilder commandText = new StringBuilder();
15 commandText.AppendLine(string.Format(@"SELECT MAX({0}) ", fieldName));
16 commandText.AppendLine(string.Format(@" FROM {0} ", TableName));
17 DataTable dt = helper.GetDataTable(commandText.ToString());
18 if (dt.Rows.Count == 0)
19 return 0;
20 else
21 return int.Parse(dt.Rows[0][0].ToString());
22 }
23
24 public string TableName { get; set; }
25
26 internal DataTable GetDataTableStructor()
27 {
28 return GetDataTable(TableStructureQuery);
29 }
30
31 public bool Update(DataTable dt)
32 {
33 return base.Update(TableName, dt);
34 }
35 }

4. SQLite 实例小程序

Quotation 小程序是用于查看工商银行贵金属报价的小工具(这里只更新纸黄金报价),工行贵金属报价官方网址

用户可以随时查看报价,设置 更新频率(默认更新周期为 120 s )。

下载的报价数据保存到 quotation.db 里,同时用户可以上传个人贵金属账户交易记录。

根据交易记录设置个人买卖差价,选择是否播放音乐提醒用户买入卖出,适用于贵金属短线投资辅助小工具。

 

4.1 使用方法:

4.1.1 下载:Quotation  Setup 和 db 文件 ( setup 文件用 VS 自带工具打包好的MSI 文件 非源代码 )

4.1.2 安装 Setup 文件, PS: 想要了解 db 结构的读者可以用 VS 或其他 SQLite 命令、视图软件查看

4.1.3 更改配置文件,打开 Trade.exe.config , 修改 节点:

<setting name=”Connection” serializeAs=”String”>
<value>Data Source=D:\Trade\Trade\DB\Quotation.db</value>
</setting>

其中 <value>Data Source = db path</value> 是 Quotation.db 的存放路径,注意如果软件安装在 C 盘保存时可能提示无法访问,这时可以把 .config 文件复制出来修改后再替换原来的文件

4.1.4 从 <Load Trx> 菜单命令导入从工行下载好的 txt 文件(不要更改格式)用于比较差价, <Transactions> 查看导入的交易记录,无效的交易记录可以选中后 Transactions -> Close 来关闭记录。

4.1.5 小程序为笔者个人开发,用于学习交流,个人免费使用,著作权解释权归软件作者所有,任何人不得进行反编译及以此向他人收取任何费用,欢迎读者留言提出意见和建议。

4.1.6 程序截图

[转载]SQL Server生成订单号 - matthewZhang - 博客园

mikel阅读(1320)

[转载]SQL Server生成订单号 – matthewZhang – 博客园.

SQL语句:select replace(substring(convert(varchar(20),getdate(),120),1,10),'-','')+cast(MAX(订单号)+1 as varchar(4))

使用存储过程
--创建测试表
create table usertable(userid varchar(20),username nvarchar(20))
go
--创建触发器
create trigger tg_insert on usertable
for insert
as
declare @username nvarchar(20)
declare @userid varchar(20)
declare @num int
select @userid=max(userid) from usertable where userid like 'jzxd' + substring(convert(varchar(10),getdate(),112),5,4) + '%'
if @userid is null
set @userid='jzxd' + substring(convert(varchar(10),getdate(),112),5,4) + '-01'
else
begin
set @num=cast(substring(@userid,10,2) as int)
set @num=@num + 1
if @num&lt;10
set @userid='jzxd' + substring(convert(varchar(10),getdate(),112),5,4) + '-0' + cast(@num as varchar(2))
else
set @userid='jzxd' + substring(convert(varchar(10),getdate(),112),5,4) + '-' + cast(@num as varchar(2))
end
select @username=username from inserted
rollback
insert into usertable values(@userid,@username)
go
--测试数据
insert into usertable(username) values('aa')
go
insert into usertable(username) values('bb')
go
insert into usertable(username) values('cc')
go
--显示数据
select * from usertable
go

另外一法

–try
大多数的单据都需要有个单据号。有的单据号就是顺序编号如:000001,000002……。有的单据号是有一定意义的,如我遇见过的 一个需求:单据号共12位,1位帐套号(区分使用单位的),1位单据标识号(表示该单是什么单,如:E表示订货单,X表示销售单),2位年号(05表示 2005年),2位月号,2位日号,4位编号(按当天的顺序,最大9999,超过9999的就用9999表示)。JE0505070001就表示某某单位2005年5月7日的第一单订货单。用编程实现这个要求当然不算太难,不过要将单据号生成方法放到存储过程中去 就要费点心思了。

下面就以插入订单为例,其中有一段代码是可提取到一个单独的存储存储过程中的,这样可增加通用性。

-插入客户订单
CREATE PROCEDURE InsertOrder
(
@CustomerId int,
@MX nvarchar(4000),
@Incom smallint
)

AS

SET NOCOUNT ON

--这一个部分还可单独提取到一个存储过程中通过传入“单据标识号”和“单据表名”为参数-

--找帐套字头号
DECLARE @IH char(1)
SELECT @IH = LEFT(IncID,1) FROM accounts WHERE ID = @Incom

--编号年月部分
DECLARE @YM char(6)
SET @YM = CONVERT(char(6),GETDATE(),12)
--单据字头
DECLARE @DJHH char(8)
SET @DJHH = @IH + 'E' + @YM

--找编号的基值(方法:用当天的编号到排序取最大的一个。如当前最大编号为0001那么它的基值为1,这样就能得出下个编号为0002)
DECLARE @MNO INT --当天最大的单据号(数值)
SET @MNO = 1
select TOP 1 @MNO = CONVERT(int,RIGHT(DJH,4))+1 from Orders where left(DJH,8) = @DJHH and incom = @Incom Orders by DJH desc

DECLARE @DJH char(12)

--扩充成4位十进制编号(最大可显示9999)
IF @MNO &lt; 9999
IF @MNO &lt; 999
IF @MNO &lt; 99
IF @MNO &lt; 9
SET @DJH = @DJHH + '000' + CONVERT(char(1),@MNO)
ELSE
SET @DJH = @DJHH + '00' + CONVERT(char(2),@MNO)
ELSE
SET @DJH = @DJHH + '0' + CONVERT(char(3),@MNO)
ELSE
SET @DJH = @DJHH + CONVERT(char(4),@MNO)
ELSE
SET @DJH = @DJHH + '9999'

----(可提取的部分结束)------------------------------------

--插入订单
INSERT INTO Orders (DJH, CustomerId, MX, InCom) VALUES (@DJH, @CustomerId, @MX, @Incom)
RETURN
GO

[转载]Swift游戏实战-跑酷熊猫 03 熊猫跑动动画 - 老镇 - 博客园

mikel阅读(807)

[转载]Swift游戏实战-跑酷熊猫 03 熊猫跑动动画 – 老镇 – 博客园.

Swift游戏实战-跑酷熊猫 03 熊猫跑动动画

 

这节内容,我们一起来利用SKAction的来为熊猫创建动画,我们将学会通过纹理组产生动画,使用永远循环的SKAction让熊猫不停的跑动。

要点:

枚举的使用:用来记录熊猫的动作状态

 enum Status:Int{
  case run=1,jump,jump2,roll //当run被赋值为1的时候,后面的jump,jump2,roll会被自动赋值为2,3,4
}

 

通过序列帧纹理产生动画:

SKAction.animatWithTextures(texture数组,播放的间隔时间)

 

永远循环动画:

SKAction.repeatActionForever()

项目文件地址

http://yun.baidu.com/share/link?shareid=3824235955&uk=541995622

 

Swift游戏实战-跑酷熊猫系列

00 游戏预览

01 创建工程导入素材

02 创建熊猫类