运行PHP出现No input file specified错误的解决办法

mikel阅读(1324)

.

今 天配置了一台新服务器,使用的是IIS + Fastcgi + PHP 5.3.X,在默认网站下运行都是正常的,但是新增一台虚拟主机或网站访问php页面的时候就会报错“No input file specified”。按照网上的各种解决方法,如屏蔽doc_root、给目录加权限、修改缓冲池等等都无效。

后来发现一个解决的文档,找着试了确实管用,方法如下:

打开php.ini文件,这个你看你怎么配置的了。

在php.ini文件里面修改:

1、增加一行(这个最重要)

fastcgi.impersonate = 1

2、修改两项(解开注释就可以了)

cgi.fix_pathinfo=1
       cgi.force_redirect = 0

[转载]关于sql语句in的使用注意规则 - xiaoqiangzhou - 博客园

mikel阅读(1451)

[转载]关于sql语句in的使用注意规则 – xiaoqiangzhou – 博客园.

想必大家都用过SQL中的in语句吧,我这里描述下我遇到的一种in语句问题,并总结一些给大家分享下,不对的地方还希望大虾指点下。

问题描述:IN子查询时,子查询中字段在表中不存在时语句却不报错

平常工作中我们会经常用到in或者not in语句来处理一些问题,比如通过in子查询语句检索符合或者不符合条件的集合结果、批量删除、修改一些符合条件或者不符合条件的集合。但大家是否注意到 当子查询中字段名在表中不存在时语句不会报错(会返父查询中所有的结果),如果大家不注意这点,在使用in语句进行批量删除时就可能悲剧了。下面用实例来 说明

1 --一个简单的in查询语句
2 select * from tuser where userno in(select userno from filter_barcode)

上面这条语句子查询里,userno 并不存在filter_barcode表中,但是整个语句确能正常执行(执行子查询的话会报字段不存在的提示),而且返回的是tuser表中所有的结果 集。如果大家不注意这种情况,一旦不是用来查询,是用来删除的,那整个表数据就被不知不觉给删除了。

但是当将子查询中userno字段改成一个即不再tuser也不再filter_barcode表中的字段,那语句就会报错

select * from tuser where userno in(select useno from filter_barcode)

Msg 207, Level 16, State 1, Line 1
列名 'useno' 无效。

原因:原来是在不使用表别名的前提下如果in子查询里字段在内表找不到就会去引用外表的。

现实情况下子查询引用外层查询的列是正常的,只不过一般不在in子查询中引用外层查询的列。
但是在exists,not exists子查询中用得比较多,

select a.* from tuser a where exists 
(select top 1 * from filter_barcode b where a.userno=b.userno)
--执行上面这语句就会提示
Msg 207, Level 16, State 1, Line 1
列名 'userno' 无效。

以下四条是我从其他地方看到的,贴出来给大家参考

1.子表引用父表列,而自己没有,在子表有数据的情况下,返回所有非空键的父表记录,子表为空,则结果无
2.子表引用父表属性,只有最外层子查询才能引用
3.有前缀标识,按前缀,如果子表父表前缀一样,按4的规则
4.如果无前缀标识唯一性,子查询表也有此字段,那么以局部子查询为准
如果前缀一样,子查询存在此字段,则以子查询表为准,否则以父表的为准

总结;为了避免这种问题有几个方法供大家参考

1、当需要用到in子查询时,先执行下in里面的子查询语句是否有误,如果误则进行相应修改

2、使用表前缀(别名)才是硬道理,例如

select * from tuser a where a.userno in(select b.userno from filter_barcode b)
Msg 207, Level 16, State 1, Line 1
列名 'userno' 无效。
--这样就会进行报错,而不会返回tuser所有的数据

3、使用exists语句来代替in语句

select a.* from tuser a where exists 
(select top 1 * from filter_barcode b where a.userno=b.userno)
Msg 207, Level 16, State 1, Line 2
列名 'userno' 无效。

关于exists和in的区别用法这里就不在讲述,大家可以查询相关资料

对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN是不对NULL进行处理。

[转载]800元组装一台3d打印机全教程流程 | 人人3D

mikel阅读(1419)

[转载]800元组装一台3d打印机全教程流程 | 人人3D.

转自百度贴吧:http://tieba.baidu.com/p/2944800373

我最近正好要组装一台新的reprap的kossel delta型开源3d打印机,这台机器性价比非常高,具有速度快,静音,三臂并联结构,扩展性强,便宜的特点。图纸啥的都有,只是用到mega2560和 ramps1.4,和吧友交流感觉吧里需要3d机制作arduino结构件的朋友很多,淘宝上卖的很黑,普遍4~5000,1万多的也有。
所以我在考虑是否要开个帖子专门来说明如何800元左右搞定这台机器。大家有兴趣吗?有毅力自己做完这台机器码?

c260b88fa0ec08fa7f4c85045bee3d6d54fbdaac

20140326:reprap的开源delta三臂3d打印机kossel和rostock的性价比非常高,比起makerbot的replicator的封闭设计,其可以通过简单的更换铝型材和滑块来增加打印面积。
kossel

7457be0a304e251f217c755ba586c9177e3e5369

replicator

9c8fa313632762d0dec2351ca2ec08fa503dc67c

20140327进展:国外有2个kossel三角打印机的开源思路,行星步进机和滑轨的替换解决方案,我正在搞,如果搞出来,可以省去买行星步进机以及直线滑轨,那么成本还能再下来200左右。

e5c125f431adcbef976578a2aeaf2edda2cc9fa0

20130327 今天送到了一堆电子件,搞得房间里都是盒子和塑料泡沫

b8d2e213495409234f44e6da9058d109b2de49cc

ramps1.4手焊套装X3 步进电源线若干 ramps 操控lcd屏X3 限位器若干 步进驱动板若干 打印完成的限位块若干。具体价格会全部配件到齐完成后核算。

45ac12c79f3df8dc62100a35cf11728b461028cc

20140328 刚刚一枚ramps1.4手焊完毕,材料成本35元,买成品的话是65元左右

b4a810dbb6fd5266e7e14fb1a918972bd507362b

20140328 ramps1.4和mega2560组装完毕,烧录Marlin固件完毕,连接lcdsd卡控制器模块测试正常。这年头3d打印机不能实现脱离上位机打印不叫打印机,所以一定要购买lcdsd卡控制器模块,62元一个。

526ae03d70cf3bc78f58a949d300baa1cc112a99

20130329 由于要压到800元以内,所以每个零件都要精挑细选,将暴利的剔除,选择性价比高又便宜的。累的要疯了。

365872b5c9ea15cef945ffafb4003af33b87b254

20130329 铝型材到了,和自用的replicator打印机合个影,定了2家工厂的型材分别测试。
型材一套含切割70rmb搞定

e4ab8e86c9177f3e4a23f9ab72cf3bc79e3d56e7

20130329 42步进到了,45一个。每台机器需要4个。如果使用行星步进方案的话只需要三个,但是要买一个昂贵的行星步进。如果是齿轮盒方案的话只需要4个普通的42步进即可。

3c94b9529822720e9d1c985c79cb0a46f31fab2d

20140330 今天到了一堆2020国标铝型材管子,厂家不同,规格相同但细节不同,左边的槽孔有圆弧,右边的没有,对于需要安装滑轮的kossel来说,左边有圆弧容易滑轮移动而不脱出,所以左边的更好一些。bfe190014a90f603f6c988e03b12b31bb151edfb

20140330 可以淘宝上直接搜索kossel买打印好的非标件。也可以自己打印。这样精度更高一点。有了kossel后可以自己复制自己。

f6adeafdfc0392459b6bf5a88594a4c27c1e2519

20140330 电源和一些其他五金配件到了,我选择了不是机箱内置电源而是和ultimaker一样的外置电源,12V6A OD5.5ID2.5的公头外置电源。因为kossel的架构好,不需要驱动非常重的打印头,所以速度快而且功率很小。27.5元含邮费

f33f39385343fbf27e74ab8bb27eca8064388fa5

20140402 淘宝上买零件,然后某卖家寄给我一封感谢信。。。现在这年头淘宝怎么这么肉麻。。。零件时PC4 5mm直径 插4mmPFA管的PU管接头,用来远端挤出。这几天都是难点,大家不必看懂每个零件的意思,先过一遍,昨晚会放出详细购买清单。

b227c2f81a4c510fd88a3ab36259252dd52aa5b4

20140402 还是难点,远端挤出机的安装,零件淘宝上有全套打印好的,我是自己打印的。远端挤出机是比较重要的部件,所以要仔细对待。将黄铜管接头插入接触机的输出接 头中。PFA管尺寸 外径od4mm 内径2mm 用于送丝,5块钱搞定,黄铜管接头4毛钱一个,轴承4毛。

5841664a20a44623e5eb60cb9a22720e0df3d7deec9afe2a6059252dd6a9d8ad369b033b5ab5b944 7aa1fc628535e5ddde32607674c6a7efcf1b62e4

20140403 打印头到了,是j head打印挤出头。说下挤出头的问题:左边的使用到了peek材质,所以一定程度上可以不用散热风扇,右边的是金属材质,必须使用风扇防止材料在内冷却 堵塞。两者都使用到了铁氟龙内壁,已经很大程度上的解决了堵塞问题。左边的110,右边的60元。某宝商品号:37885587894 和 594945538069526 

e05a9f003af33a87603940b0c45c10385243b5a3

20140403 机械臂:kossel等三臂打印机中中关键的部分是机械臂,原设计中使用了遥控赛车的拉杆关节轴承和空心管通过粘合成为机械臂(图中金色的那支)我认为遥 控赛车的拉杆轴承不好,而且很贵(一套65元)可能会有虚位,所以换成了正宗的金属关节轴承和丝杆到了。金属关节轴承SI3mm 3.5元一个,共需12个,丝杆3mm185mm长,含切割13元。
某宝商品货号:关节轴承19943027768 3mm丝杆25303912691

d272b9ef76c6a7ef4fe1318cfffaaf51f2de663c

这三天的快递盒子。。。。

a58c5fc6a7efce1b1fec5160ad51f3deb58f653c

20130404 回国头来继续说下挤出头的事,大家选购挤出头的时候千万要仔细,乍看销量第一第二的性价比不错,都是大公司工厂生产的,有其自己的品牌。看第一排第二个和 第二排最后一个148的那个头,保温胶带几乎绑住了散热peek全部,这是一个比较严重的错误,这样会导致peek散热不良而导致回流的塑料无法凝固而堵 塞。可以发现一个问题,一些厂商其实根本不懂3d打印机的深入技术,而且卖得这么贵。可耻。
关于挤出头加热回流的讲解:http://diy3dprint.blogspot.tw/2014/01/blog-post.html

052d0c1f95cad1c8cfb43b8d7d3e6709c83d51f4

20140405 高硼硅玻璃到了,关于打印底盘,可以用一般玻璃,我用得是高硼硅玻璃,可以耐热,虽然我不打算加热底盘,但是买高硼硅玻璃可以方便以后升级成加热底盘。玻 璃30一片,直径17cm,厚度3mm 30一片 某宝商品号:35455934686 请找店家说要此规格。

a248fd0735fae6cd3e29a1cd0db30f2443a70f5b

下面是一堆打印出来其他产品的零件

4d93de36afc3793151f78c85e9c4b74542a91165

20140406 (额外花费)2020铝型材烤漆完毕,这属于成本外的额外花费,因为老美的机器和国内的机器都是黑的要么是铝色的,想独特美观一点,所以决定上钢琴漆烤 漆,三套花费250元,店家说如果量大的话每套不过25元,找的是家附近的铝合金门窗店搞定。铝型材某宝商品号:588666720839526 588751442899526

646cf0f9d72a6059a647bab72a34349b023bbaaf

20140407 国外论坛里趴来张图,也是三臂delta架构的机型,不过是rostock,kossel是它的子系。老外自己加大了尺寸,结果。。。三臂机型的优势就是 可以随意加大框架尺寸。这点其他结构的打印机是很难做到的。所以lz很推荐新手第一台装机务必要从三臂机型开始,以后升级很方便。;)

362c51f0f736afc39c7cbec8b119ebc4b645128a

20140408 关于关键部件的挤出机步进这个成本大头,国内很多玩家做法都是直接上原方案,我认为这是无脑的。原方案使用的送丝齿轮是 11mm外径的,而改良方案是使用5.5mm外径的,这是什么意思,就是用力矩比会差几倍,11mm送丝轮送丝的话需要上很大的62mm42步进(70 元)或者更大的减速行星步进电机(200元)才能不失步,力矩要求基本在7.5n以上,但是如果换成了5.5mm外径的送丝轮,就只需要5.5n左右的 42电机(45元)就可以了。意思就是自行车爬坡的时候你如果上的是大齿轮挡当然累,如果上的是小齿轮挡就会很轻松。
我使用的方案:http://www.thingiverse.com/thing:275593 Compact Bowden Extruder, direct drive 1.75mm

121cb72f070828382d1a61baba99a9014d08f1e8

20140408 铝框架烤了白色钢琴漆,有点稍微变厚,所以对应部件要进行放宽松设计。做得比较慢实在不好意思,小伙伴们。不过看现在的样子,结果会很令人满意的。铝合金 铝型材为2020型材,需要240mmX9条 600mmX3条,合计需要3米,不过50元不到。烤漆费用另计,没有特殊美观要求可以不用烤漆。

836313f33a87e950eeefe2c312385343faf2b40c

8c626390f603738d2ab11d8db11bb051f919ec0d

20140408 补两张图。我喜欢白色,和美版的黑色设计kossel,和国内的铝色铝管形成区别。

1896c9fe9925bc31499412375cdf8db1ca137032 839e7b66d0160924f30db0b4d60735fae7cd34d3

20140408 组合件还没打印好,大概摆一下是这么个意思。91a1541ed21b0ef4503587f1dfc451da80cb3e26

20140409 这几天在改cad,支架零件的cad都改好了,适应国内2020的细扣管,不过打印出来有3度的误差,搞得要重新打印。杯具。。

0699ab8ba61ea8d3c8235f94950a304e241f58fb

20140410 这几天就在纠结精度和误差,打印机框架做得好,打印精度才能上去。

b2b50e7f9e2f0708a1e32f90eb24b899a801f21b6620d2f2b211931366e5fa2067380cd790238d5b

 

20140410 框架基本没问题了,基本调试好了,几乎没什么误差。框架设计图cad文件会在制作改进完后放出链接。这个框架根据老美的1515版本改进的2020版本再 改进成的2020窄版,这样能适合国内的窄口2020型材,这样铝型材才能走滑车而不走高价的直线滑轨。81eca55494eef01fdeb97f55e2fe9925bd317d506620d2f2b211931304ee982067380cd790238d50

1.对滴,300ms是理论最高速度,挤出机要达到这个速度,必须减速步进,一般步进要上要么换62mm长步进要么上小比例挤出齿轮,我选择的是小比例挤出齿轮。
2.关于pla和打印头,pla堵头的问题,我会推荐一家厂家的pla,我使用至今从未堵头。配合铁氟龙喉管的jhead,我认为是基本可以不堵头的,堵头问题的原因我发过一个连接,高玩分析过,只要足够的散热和铁氟龙喉管防止倒流即可基本杜绝。
3. 关于delta的计算量,我认为2560可能的确会停顿,不过我这个800方案,只是一个基础的方案,使用的是最普通的零件,目的是普及这个方案,因为价 格是阻挡大多数人的门槛,关于高配和魔改什么的,就像楼上的某土豪说要改高配,如果他要上速度,要上300理论值,建议可以换成arduinodue或者 一体式reprap板子,也就200多吧吗,我估计就不会停顿了,只要有钱是不用担心的。

20140411 这几天就是在搞支架精度的问题,现在基本没有什么误差了。其余的问题还很多。145c910e7bec54e7c100058fbb389b504ec26a124e8f7de736d12f2e404db1f14dc2d562843568bec6bd9d8f8c5494eefb6910882ff5e0fe98257ebe

20140411 kossel的顶部支架框架基本完成,色调是奶白和古铜色搭配。

de9b334c510fd9f979f721f8272dd42a2934a426 255b7a43fbf2b21157cef1dfc88065380dd78e26

20140411 这是最低配置的delta式三臂机型,同步带,关节轴承,打印件都没用到。。。。用的是绳索来驱动三臂,delta机型中的超级屌丝机。。。。大家有兴趣的话也可以自己做一下。
设计图地址:http://www.thingiverse.com/thing:199401

a875d4faaf51f3deda1548f596eef01f3b29795b

20140412 进度开始进入快车道,lz每天修改cad文件,想把打印文件的种类从10多个缩到个位数内。减少零件的个数和种类有利于传播,但是难度是不能降低性能和稳定性。框架基本没什么大问题了

d59db025bc315c60c5de157d8fb1cb13485477b8

挤出机可以安装在顶部,或者安装在1/2高度,安装在1/2高度可以有效加强精度,缩短PTEF管得长度。

7ff3df03738da9776432f8b9b251f8198718e3e2

耗材可以横放或者竖着放,也可以斜着放。

e4705af082025aafe2770059f9edab64024f1ab9

0c719a1bb051f819e7607dd8d8b44aed2f73e7ba

20140412 和makerbot replicator架构的3d打印机的体积高度对比。

13f470ee3d6d55fb3bac0eb46f224f4a21a4dd99

因为是三角长条型,占地面积很小。丝盘也可以不挂在背部。

6c8d146d55fbb2fbc94120804d4a20a44723dc99

makerbot像壮汉,kossel就像苗条的女人

080e7cfbb2fb4316e67502e822a4462308f7d399

20140412 今天写下偶写这个帖子的想法:


10 年刚回国那时候,发现一个香港人在淘宝上卖reprap的盘古架构3d打印机,应该是叫“印塑堂”的极客工作室,那时候reprap国内也很少,国外也很 少,所以这是最早的国内淘宝网上的3d打印机产品,我要了个样品,发现很粗糙,层高都0.3~0.4,偏移得厉害,因为那时候刚开始,所以国内真的没对比 和技术,所以那机型买的人也很少。所以就没去关注这个机型。


到 了13年年初的时候,离职开始自己干,发现makerbot的replicator和thingOmatic架构开始在淘宝上蹿红,当时的3d市场还没有 现在这么混乱,机种也不多,ultimaker架构开始在淘宝露脸。一些公司比较正规的开始依样画葫芦地照抄 这几个架构的打印机,当然当时的制作成本还是比较高的,因为是新技术么,都要定制零件,当时的国产打印机价格基本在~5000+ 落后机型基本在4000左右。质量啥的有几家还是过得去的,如闪铸什么的。


13年年中我自己装配了一台replicator架构的香港改进设计的migcecuble3d打印机的套件,这个机型现在依旧是比较好卖的,因为价格不贵,而且样子很好看。价格在5000左右。到了13年下半年,我发现了一些不对劲,


父 母看报纸都会和我说“新闻今天在说3d打印机呢”,这时我突然意识到3d打印行业的一轮炒作开始了。仔细看淘宝的商品搜索,发现了几个台湾人做汽配的,跑 过来做一种叫做万豪的品牌,当然也是清一色的抄袭makerbot设计,还在淘宝上刷评论刷销量,我对其页面抄袭其他产品的产品册和产品设计非常反感。其 只用了几块亚克力板还宣称自主设计啥的,我觉得这样做生意不好,这样做人不正。然后渐渐地,我发现国内随着炒作入行3d打印机的公司或者团队越来越多了, 不过基本上从来没有背离过抄袭这条路,基本都是成本千元左右然后卖个4~5000左右,质量开始层次不齐。


到 了14年,部分良心商家,大学生团队出的套件价格开始跌到2~3千区段,部分机型还是可以的,前几个月国内的corexy架构自主设计得打印机开始点名时 间众募,价格在2880元我觉得是非常好的,前几天美国的团队退出了199美元的3d打印机,尺寸不大但是这个价格一出货,国内大部分不良商家肯定会被迅 速挤出舞台。因为我经常关心,所以基本了解成本,所以请小白们务必不要买超过4000元以上的3d打印机,谁买谁是猪。


一个朋友前几天说,某某某公司的谁集了100万不到,准备请几个大学生和兼职工程师开始入行3d打印机行业了,其说这行业不难,趴点开源技术,切割几块板就可以做了,赚一票就走呗。我觉得其实这是大多数不良商家的现时心态。


说 道kossel这台打印机架构是非常好的架构,其扩展性是其他封闭架构的打印机不能比拟的,你只要按照kossel设计团队提供的算法计算,就能算出框架 尺寸,做出一个房间大小的巨型kossel。偶出这个教程和今后拟在淘宝众募,是想推广kossel这个架构,当然是改进后的 中国零件版kossel800rmb架构,因为我觉得如果这台机器套件能做到1000元以内,那么这个方案是极其可能铺开来的,那么淘宝上卖 3999,4999,6999和10000多的kossel方案的商家和其他卖高价的商家将被挤出舞台,因为我觉得他们是不正的,他们是违背开源精神的。
不但不能提供售后,而且赚300%以上的利润,赚了热钱就走。所以我希望,生态圈不要被他们搞烂了,所以请他们滚蛋吧。

20140413 国外玩家设计的滑轮滑块CARRIAGE方案能有效降低成本,全套40元左右,替代掉200~300元左右的直线滑轨,精度经过测试相同,而且有直线滑轨 没有的静音高速特点(600mm/s)。1515 19mm直径方案由两位国外玩家提出,2020国内铝型材 27mm直径滑轮方案我会在3天左右在thingiverse和这里放出。3c478218972bd4076511d46e79899e510eb30935

47e86e10b912c8fcf4d5f05efe039245d78821e5

20140413 暗金色(铜本色)的材料质感感觉还可以。大家有了机器可以自己尝试这种质感

cdbff800baa1cd1156a105b3bb12c8fcc2ce2df4

20140413 下框架本来是用三个大零件安装,每个打印需要至少4小时,现在我改成了和顶部框架使用一种通用零件,改动了零件设计,加了步进孔位,使步进机和2个支架合 体成为一个大零件,减少了零件种类,和打印巨型零件的时间。零件设计基本在后天在这里和thingiverse同时放出文件。e4ab8e86c9177f3e9c0cab9e72cf3bc79e3d56c8

a4ec89ec08fa513d56913b4d3f6d55fbb3fbd9c9

59e2a90a19d8bc3e9c0b125e808ba61ea9d34581

20140414 觉得设计得不好,不能让所有打印机简单打印不出问题,所以。。。返工 。。。 

fdf6f843ad4bd1134ecdd3a658afa40f4afb0580

20140414 修改了N个版本,终于有个满意的了。。。。。。。。。。。

362c51f0f736afc3473551f1b119ebc4b64512cf

20140414 大概设计了五种设计,老外原作者就设计了厚实的一块不管了,搞得打印的时候因为上下温度不同收缩而容易翘边,如果这种方案出去,别人做不出来是要骂人的,所以改成了支架结构设计,不损失强度,又容易生产打印复制。。

ac4695315c6034a8beebd015c9134954082376f8 104efd2a2834349b9b0e0611cbea15ce37d3bef9

20140414 老外丑不拉几的原设计。。。。。。。又厚又难打印,打印一个2小时,又会桥边,改版的打印时间1小时10分。基本不翘边。。。

47e86e10b912c8fcc6cea659fe039245d78821c3

a2be8844ad3459827b5696070ef431adcaef842e

20140415 昨天就是在印刷滑轮模块,测量精度,没其他的事。

e420844bd11373f0ca161d0aa60f4bfbfaed04d8

20140415 还有就是造远程挤出机。挤出机的设计者是:schlotzz 一个德国人吧,远程挤出机设计图地址:http://www.thingiverse.com/thing:275593

20140415 er。。。。大家稍安勿躁,不要再最后关头出岔子,东西已经差不多了,不断调整改进中。。。。。

c87c6834970a304e73f1946cd3c8a786c8175c33 9c141012b31bb05152ab87be347adab44bede078 916c62fbfbedab6497fd7956f536afc378311e7f

20140417 考虑到受众,reprapwiki百科制作教程页面已经开始制作,会和次贴吧教程同时更新。大家可以移步去那边收藏,也可以在此贴继续观看。
地址:http://reprap.org/wiki/%E5%A6%82%E4%BD%95%E7%94%A8800RMB(150usd)%E6%90%AD%E5%BB%BAkossel3d%E6%89%93%E5%8D%B0%E6%9C%BA

632dbb58d109b3de8ed9e4ffcebf6c81810a4ca1

20140422 
谢谢大家不厌其烦的顶贴,偶这几天都在休息补充体力。而且这个贴暂时要停更一下,以下是原因:


主 要原因是我觉得装好kossel这个机器不难,不过做好改进好kossel却很难,其用的各色螺丝种类和零件个数我一直在简化,还有吧友挖来的 thingiverse上2020那个连接件方案是可以直接使用的,不过此方案我一直在改,因为此香港极客朋友这个改进的2020的连接件方案使用的不是 国标的2020铝型材,而是欧标的2020,所以型材槽位开口过大,大于6.5mm,所以是不能使用滑轮方案,和一些后期改造的,(滑轮厚5.5mm)基 本只能使用直线滑轨的,而且可能一些滑轨的开孔和其2020的也不同。这样就不利于普及。


再 者连上我这里马上要做好的几台机器,工作室一共只有5台机器,虽然可以保证每天完成一台kossel的装配,不过我觉得依旧不能够保证很好的质量,如果质 量不能保证,那么最好就不要出货,免得被人骂。说道质量,3d打印机的比较关键的问题说到底就是精度和易维护性,精度由生产设备,供货,设计,经验决定, 如果我现在在做一个玩具产品,那么我大可不必这么纠结着1mm以内的问题,不过正因为是3d打印机,所以偶觉得必须纠结精度和维护性这些问题。如果大家 diy完了这台机器,三天两头维护,即使我将这台机器的套件是1000元以内出的,那么也做得不够好吧。就像这么多国家用ak47,ak47设计简单又好 维护好用是才有这么多人喜欢吧


最 近这些日子我依旧会 1.改进零件和减少零件种类. 2.加强易维护性 3.提高产能。不过帖子不能保证更新,问题不能保证回答。吧友的kossel吧和群非常好,我觉得非常开心,因为一个多月前的3月kossel这个东西和 名次基本还没人知道,大家多交流,多查资料自己久可以做出自己的kossel,这么一来其实大家都懂原理了,kossel就慢慢普及了不是吗?js不就只 能咬牙切齿,不得不降价其打印机价格了么?


最 后说下,关于kossel的血统reprap,reprap3d打印机有这一个比较明显的血统观念,那就是自己能生产自己的零件(非标件),如果你有了一 台kossel,那么你就能生产出儿子kossel,孙子kossel。这个血统是其他3d打印机不具备的,也是其不使用工厂生产非标件的一个原因,这也 是开源硬件的一个有趣的地方。

2a53c024b899a9016b88f9ad1f950a7b0308f54b

 

20140423 垃圾桶和打印机无关,只是放一下对比一下大小e4705af082025aafba3b3857f9edab64024f1a87 0f901387e950352a4b1763945143fbf2b3118b9f c77c97096b63f6241e2c7f9f8544ebf81b4ca398

20140425 整整一个月了,将金属贴纸贴上,感觉一下子两样了,简洁而优雅,价廉但物美。

5e0325338744ebf843fcc2a2dbf9d72a6159a705 3950ae44ebf81a4c0bbf4a54d52a6059242da605 b227c2f81a4c510f824944876259252dd52aa505

20140425 套件的某宝页面地址,今天开始越热,但是不代表最终价格,价格会调整。某宝商品号 38676406366

69031da85edf8db16e7bd3f90b23dd54574e74bd

20140430 老外的滑块设计理念容易因为形变产生倾斜。。所以昨天又推倒了滑块重新设计了滑块,降低误差。还有,除了白色的钢琴漆滑轮版,5台生产实验用银色滑块磁头版本也开始准备了,务必将成本再降低。。。。。。我做得真心不快,大家见谅。。。

b262888b87d6277f0e7a20ba2a381f30e824fcaf

20140430 kossel不停地单性自我繁殖。增殖速度随着kossel的数量增多而变快,如果有10台kossel,繁殖一台kossel的非标件只需要2.5小时。

20ad1fd3d539b600e9911335eb50352ac75cb7bc

20140430 er,大家51小长假快乐。。。 深藏功与名

942784345982b2b7eee0de4633adcbef77099b9c

20140501 昨天去卜蜂莲花超市买东西,发现法国文具专家马培德的产品工业设计都很棒,所以搜刮了一个马培德的圆规和卷笔刀。。还搜刮了个拇指滑板和发条火车研究研究。。某些设计能会加入到kossel中。。

8b6a4263f6246b60e52b87f7e9f81a4c500fa2eb

20140506 半夜里开机刷零件,银色测试机新零件有点小问题,顺便将小伙伴们定的小贱钟零件做好了,准备吃早饭。强磁三臂目前比较顺利,估计这几天能开始各种测试。

86bdb582d158ccbfd1d40dbd1bd8bc3eb03541b4

c960bb45d688d43f64e729757f1ed21b0ff43b4a

3ad0262442a7d93335c35cf4af4bd11372f001b5 b76173afa40f4bfbfdba26d3014f78f0f63618b5

20140506 fff 和fdm热堆积成型的模型放大看就是这个样子。

69031da85edf8db17baec6e30b23dd54574e741c

#kossel# 强磁关节三臂的底座设计第一稿,兼容kossel原版的三臂底座设计,尺寸不变,可以上原版滑轮,也可以上原版滑轨,不用改动固件中的某几个尺寸,咬紧皮带设计,可以不使用环状同步带。具体还要测试测试。

3b9732d5ad6eddc41040b6733bdbb6fd53663371

20140508 强磁三臂设计基本搞定,不断测试中,
切割的工厂也联系好了,切割能做到+-0.2mm也就是2丝。三臂是比较关键的部位。

958f21fa513d269738424fd457fbb2fb4216d80d

20140509 每天开机10小时左右,测试强磁三臂的耐用性和不确定因素,强磁三臂有几个小问题,不过瑕不掩瑜。有趣的是可以把2台“delta”机型的kossel叠在一起成“叠塔塔”。。。

7f8e07738bd4b31c60096d3285d6277f9f2ff8e21b10a2d4b31c870149834b6f257f9e2f0608ffe2

20140510 蛋疼效应底座改了5遍设计,滑车明天再该的话就是第十版了。蛋疼145c910e7bec54e74e9b8694bb389b504ec26aac

20140512 er。。。这几天就是做生产线和调试,最近发现了其他网友设计的这个。。。想抽空做一个这个,虽然不是龙门式,不过感觉很小巧,还有手摇杆,感觉很不错。。。!

b262888b87d6277f5d9bf3b62a381f30e824fc13

教程完结!

[转载]MySQL批量导入Excel、txt数据 - 浣熊_BUPT - 博客频道 - CSDN.NET

mikel阅读(1034)

[转载]MySQL批量导入Excel、txt数据 – 浣熊_BUPT – 博客频道 – CSDN.NET.

我想Excel是当今最大众化的批量数据管理软件了吧,所以我们会经常涉及到将Excel中数据导入到MySQL中的工作。网上有一些关于直接将 Excel导入MySQL的教程,不知道是我安装的office不对还是MySQL不对,极少数情况下可以成功导入数据,所以感觉这种直接导入的方法会受 到office版本等因素的诸多限制,所以今天向大家介绍从txt批量导入数据到MySQL的方法,当然首先介绍的是Excel数据转成txt数据。这种 方法虽然步骤较多,但是导入成功率极高,所以推荐给大家:

可别说你把excel转成txt的方法是复制粘贴,那样的数据格式乱而且对于后续的导入有一定的出错率。正确的做法首先将excel文档另存成CSV(逗号分隔)文档,存储过程中会有一系列的警告提示,一路OK下来即可。

 

用记事本的打开方式打开刚刚保存的.csv文件,我们发现,列与列之间用逗号(,)隔开:

将其另存为.txt文件,并且编码要选择UTF-8:

成功保存txt文件后就可以用PHPmyadmin导入该文件了。但这里一定要注意一点,该文件的名字一定不能出现中文,文件的存放路径也不能有中文出现。如果出现中文,导入过程中会提示你找不到文件路径。

在SQL菜单中输入如下命令:

Load Data InFile ‘D:/1.txt’ Into Table `res_type_collect` fields terminated by ‘,’ lines terminated by ‘\n’

其中’D:/1.txt’是你文件存放的绝对路径,注意是“/”而不是“\”;Table 后的值是你的表名;fields terminated by后的值是列与列间的分割标识(个人感觉“,”比较靠谱,不易出错。而tab可能在导入的时候出现问题);lines terminated by后面的值是行与行之间的分割标识,这个没的说,一般都是“\n”.

点击“执行”后,上方提示成功插入X行数据,查看:

注意上图,txt文件的第一行的第一个数据导入出现了错误,这应该是软件的问题吧,不过不影响,因为仅仅这一项错了,所以手动改过来就可以了。由此便完成了MySQL批量导入Excel、txt数据的任务啦。

[转载]javascript (js)判断手机号码中国移动、中国联通、中国电信 - 大Y明 - 博客园

mikel阅读(1168)

[转载]javascript (js)判断手机号码中国移动、中国联通、中国电信 – 大Y明 – 博客园.

我国使用的手机号码为11位,其中各段有不同的编码方向:前3位———网络识别号;第4-7位———地区编码;第8-11位———用户号码。

中国移动134、135、136、137、138、139、150、151、152、157、158、159、147、182、183、184、 187、188.178(4G) 中国联通130.131.132.155.156.185.186.145(属于联通无线上网卡号段).176 (4G) 中国电信133.153.180.189.181

//匹配移动手机号
var PATTERN_CHINAMOBILE = /^1(3[4-9]|5[012789]|8[23478]|4[7]|7[8])\d{8}$/
// 匹配联通手机号
var PATTERN_CHINAUNICOM =/^1(3[0-2]|5[56]|8[56]|4[5]|7[6])\d{8}$/;
//匹配电信手机号 
var PATTERN_CHINATELECOM =/^1(3[3])|(8[019])\d{8}$/; 

测试一下:

中国电信:

PATTERN_CHINATELECOM.test('18166889988');
true
PATTERN_CHINATELECOM.test('13366889988');
true

中国联通:

PATTERN_CHINAUNICOM.test('13066889988');
true
PATTERN_CHINAUNICOM.test('13166889988');
true

中国移动:

PATTERN_CHINAMOBILE.test('15166889988');
true
PATTERN_CHINAMOBILE.test('13866889988');
true

[原创]10分钟制作自己的手机QQ

mikel阅读(1781)

1.注册个bmob.cn的账号:什么是bmob?bmob就是一个提供了基本后台服务器数据库操作的一个平台,你可以不用担心后台操作,使用起来很方便,降低了开发的门槛,提高了开发效率。

2.创建应用: 这个简单,只需要输入个应用名称就可以了!

1

3.点击应用名称进入设置界面

2

4.建议直接下载官方的DEMO源码,然后在这个基础上改改即可,下载地址

QQ截图20140814160703
QQ截图20140814160752

5.开发工具当然要安装的,详细看安装教程:

Android开发之旅:环境搭建及HelloWorld

,聪明的你应该不会之难而退的。

6.导入源码到开发工具Eclipse

6

61

图片

63

 

7.设置应用秘钥,先进入bmob.cn的应用后台,复制秘钥
图片

然后修改项目的配置中的秘钥
64 65

粘贴到这里

66
8.设置项目名称

82 84

9.发布项目,生成apk,收工

9

10 11 111

你的源码目录下的/bin/文件夹下的apk文件就是你的应用了,可以安装到手机上了
112

呼~~,累死我了,我的颈椎啊 ~

好了,小伙伴儿们走起吧!相信你能,你就能!

[转]Android开发之旅:环境搭建及HelloWorld

mikel阅读(1639)

——工欲善其事必先利其器

引言

本系列适合0基础的人员,因为我就是从0开始的,此系列记录我步入Android开发的一些经验分享,望与君共勉!作为Android队伍中的一个新人的我,如果有什么不对的地方,还望不吝赐教。

在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld。本文的主题如下:

  • 1、环境搭建
    • 1.1、JDK安装
    • 1.2、Eclipse安装
    • 1.3、Android SDK安装
    • 1.4、ADT安装
    • 1.5、创建AVD
  • 2、HelloWorld

1、环境搭建

1.1、JDK安装

如果你还没有JDK的话,可以去这里下载,接下来的工作就是安装提示一步一步走。设置环境变量步骤如下:

  1. 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
  2. JAVA_HOME值为: D:\Program Files\Java\jdk1.6.0_18(你安装JDK的目录
  3. CLASSPATH值为:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;
  4. Path:  在开始追加 %JAVA_HOME%\bin;
  5. NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。

安装完成之后,可以在检查JDK是否安装成功。打开cmd窗口,输入java –version 查看JDK的版本信息。出现类似下面的画面表示安装成功了:

image

图1、验证JDK安装是否成功

1.2、Eclipse安装

如果你还么有Eclipse的话,可以去这里下载,下载如下图所示的Eclipse IDE for Java Developers(92M)的win 32bit版:

image 图2、Eclipse下载

解压之后即可使用。

1.3、Android SDK安装

在Android Developers下载android-sdk_r05-windows.zip,下载完成后解压到任意路径。

  • 运行SDK Setup.exe,点击Available Packages。如果没有出现可安装的包,请点击Settings,选中Misc中的”Force https://…”这项,再点击Available Packages 。
  • 选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包
  • 在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为D:\AndroidDevelop\android-sdk-windows\tools)。

image图2、设置Android SDK的环境变量

“确定”后,重新启动计算机。重启计算机以后,进入cmd命令窗口,检查SDK是不是安装成功。
运行 android –h 如果有类似以下的输出,表明安装成功:

image图3、验证Android SDK是否安装成功

1.4、ADT安装

  • 打开 Eclipse IDE,进入菜单中的 “Help” -> “Install New Software”
  • 点击Add…按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入http://dl-ssl.google.com/android/eclipse。如下图所示:

image

  • 确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开它会有Android DDMS和Android Development Tool,勾选他们。 如下图所示:

image

  • 然后就是按提示一步一步next。

完成之后:

  • 选择Window > Preferences…
  • 在左边的面板选择Android,然后在右侧点击Browse…并选中SDK路径,本机为:
    D:\AndroidDevelop\android-sdk-windows
  • 点击Apply、OK。配置完成。

1.5、创建AVD

为使Android应用程序可以在模拟器上运行,必须创建AVD。

  • 1、在Eclipse中。选择Windows > Android SDK and AVD Manager
  • 2、点击左侧面板的Virtual Devices,再右侧点击New
  • 3、填入Name,选择Target的API,SD Card大小任意,Skin随便选,Hardware目前保持默认值
  • 4、点击Create AVD即可完成创建AVD

注意:如果你点击左侧面板的Virtual Devices,再右侧点击New ,而target下拉列表没有可选项时,这时候你:

image

  • 然后点击Install Selected按钮,接下来就是按提示做就行了

要做这两步,原因是在1.3、Android SDK安装中没有安装一些必要的可用包(Available Packages)。

2、HelloWorld

  • 通过File -> New -> Project 菜单,建立新项目”Android Project”
  • 然后填写必要的参数,如下图所示:(注意这里我勾选的是Google APIs,你可以选你喜欢的,但你要创建相应的AVD)

image

相关参数的说明:

  1. Project Name: 包含这个项目的文件夹的名称。
  2. Package Name: 包名,遵循JAVA规范,用包名来区分不同的类是很重要的,我用的是helloworld.test。
  3. Activity Name: 这是项目的主类名,这个类将会是Android的Activity类的子类。一个Activity类是一个简单的启动程序和控制程序的类。它可以根据需要创建界面,但不是必须的。
  4. Application Name: 一个易读的标题在你的应用程序上。
  5. 在”选择栏”的 “Use default location” 选项,允许你选择一个已存在的项目。
  • 点击Finish后,点击Eclipse的Run菜单选择Run Configurations…
  • 选择“Android Application”,点击在左上角(按钮像一张纸上有个“+”号)或者双击“Android Application”, 有个新的选项“New_configuration”(可以改为我们喜欢的名字)。
  • 在右侧Android面板中点击Browse…,选择HelloWorld
  • 在Target面板的Automatic中勾选相应的AVD,如果没有可用的AVD的话,你需要点击右下角的Manager…,然后新建相应的AVD。如下图所示:

image

  • 然后点Run按钮即可,运行成功的话会有Android的模拟器界面,如下图所示:

image

 

作者:吴秦
出处:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).

10分钟建个网站运营不是事儿

mikel阅读(980)

现在那么多免费的建站程序,10分钟建个网站运营根本不是事儿
商城类的:ecshop 新闻类的:dedecms,帝国;微博类的:记事狗;博客类的:wordpress;
还有很多程序去站长站找找,下载上传到空间绑定域名,然后安装就可以了

很多问我建网站是不是很复杂?不复杂,下面说下基本步骤:

1.注册域名:建议注册.com的域名

2.购买空间:空间这个需要根据你的程序要求定,一般有两种
Linux空间:PHP+MySQL类程序常用
Windows空间:ASP,ASP.NET,PHP,MySQLSQLServer的程序常用,不过也可以运行PHP MySQL的程序

3.找到符合自己要求的建站程序:
商城类的:ecshop 新闻类的:dedecms,帝国;微博类的:记事狗;博客类的:wordpress;
更多的可以去站长站查看

4.使用FTP软件上传你的建站程序到空间

5.根据程序的安装说明,进行安装设置,就可以安装完成的,基本就完成了。

6.备案:这个是天朝例行程序,想要在天朝下建站必须要备案,不过你要不想备案,选择空间就选择境外的吧!不过就要牺牲访问速度了。

备注:
想建站的前期别听那些卖空间的,卖服务器的忽悠,什么虚拟主机不稳定啊,还是买个服务器、VPS啥的,前期完全没必要的,别天真以为自己的网站上线了,就会如滔滔江水般的人来访问,那是神话!初期除了你自己和搜索引擎蜘蛛,不推广连个鬼都不会来的。

建议在建站之前规划好网站运营、市场推广各方面的,建站容易,运营难。

建站有风险,投资需谨慎!

域名和空间也是成本,别不把小钱儿当钱儿!

[转载].NET网站自动浏览器分享,解决IIS6应用池回收后第一次访问慢问题 - 事理 - 博客园

mikel阅读(1125)

[转载].NET网站自动浏览器分享,解决IIS6应用池回收后第一次访问慢问题 – 事理 – 博客园.

.NET开发的网站,如果不是使用预编译发布,网站会在iis6应用池回收后第一次访问很慢,为了解决这个问题,今天写了一个自动浏览的工具,现在分享给大家,界面如下。

关键部分源码

//手动点击浏览
        private void btnBrowsing_Click(object sender, EventArgs e)
        {
            if (btnBrowsing.Enabled == true && chkEnableAutomaticBrowsing.Checked == true)
            {
                btnBrowsing.Enabled = false;
                Thread thread = new Thread(new ThreadStart(AutoBrowsing));
                thread.IsBackground = true;
                thread.Start();
            }
            else
            {
                MessageBox.Show("任务正在执行!");
            }
        }

        DateTime tempTime = DateTime.MinValue;//防止一分钟内刷新多次

        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime dt = DateTime.Now;

            //转钟时清除一天日志
            if (dt.ToLongTimeString() == "0:00:00")
            {
                rtxtLogs.Text = string.Empty;
            }

            TimeSpan ts = dt - tempTime;
            //1分钟内不得刷新两次
            if (ts.TotalMinutes > 0)
            {
                //到点自动刷新
                if (lstTime.Items.Contains(dt.ToShortTimeString()))
                {
                    tempTime = dt.AddMinutes(1);
                    btnBrowsing_Click(null, null);
                }
            }
        }

        private void AutoBrowsing()
        {
            int itemTotalCount = 0;
            CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate()
            {
                itemTotalCount = lvWebsitInfo.Items.Count;
            }));
            for (int i = 0; i < itemTotalCount; i++)
            {
                string url = string.Empty;
                CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate()
                {
                    url = lvWebsitInfo.Items[i].SubItems[2].Text;
                }));
                int retry = 0;
            retryFlag:
                CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate()
                {
                    webBrowser1.Navigate(url);
                }));
                if (WaitWebPageLoad())
                {
                    CrossThreadCalls.SafeInvoke(this.rtxtLogs, new CrossThreadCalls.TaskDelegate(delegate()
                    {
                        rtxtLogs.AppendText(url + "浏览成功,浏览时间:" + DateTime.Now.ToLongTimeString() + "\r\n\r\n");
                        rtxtLogs.ScrollToCaret();
                    }));
                    CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate()
                    {
                        lvWebsitInfo.Items[i].SubItems[3].Text = DateTime.Now.ToString();
                    }));
                }
                else
                {
                    CrossThreadCalls.SafeInvoke(this.rtxtLogs, new CrossThreadCalls.TaskDelegate(delegate()
                    {
                        rtxtLogs.AppendText(url + "浏览失败,即将重试" + (retry + 1) + "次\r\n");
                        rtxtLogs.ScrollToCaret();
                    }));
                    if (retry < 2)//重试3次
                    {
                        retry++;
                        Thread.Sleep(3000);
                        goto retryFlag;
                    }
                    CrossThreadCalls.SafeInvoke(this.rtxtLogs, new CrossThreadCalls.TaskDelegate(delegate()
                    {
                        rtxtLogs.AppendText(url + "浏览失败\r\n\r\n");
                        rtxtLogs.ScrollToCaret();
                    }));
                    CrossThreadCalls.SafeInvoke(this.lvWebsitInfo, new CrossThreadCalls.TaskDelegate(delegate()
                    {
                        lvWebsitInfo.Items[i].SubItems[3].Text = "自动浏览失败";
                    }));
                }
            }
            CrossThreadCalls.SafeInvoke(this.btnBrowsing, new CrossThreadCalls.TaskDelegate(delegate()
            {
                btnBrowsing.Enabled = true;
            }));
            CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate()
            {
                webBrowser1.Navigate("about:blank");
            }));
        }

        /// <summary>
        /// 判断webbrowser是否加载一个网页完毕,可判断包括iframe的网页
        /// </summary>
        /// <returns></returns>
        private bool WaitWebPageLoad()
        {
            int i = 0;
            string sUrl = string.Empty;
            while (true)
            {
                Delay(50);  //系统延迟50毫秒,够少了吧!
                WebBrowserReadyState webBrowserState = WebBrowserReadyState.Uninitialized;
                CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate()
                {
                    webBrowserState = webBrowser1.ReadyState;
                }));
                if (webBrowserState == WebBrowserReadyState.Complete) //先判断是否发生完成事件。
                {
                    bool isBusy = true;
                    CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate()
                    {
                        isBusy = webBrowser1.IsBusy;
                    }));
                    if (!isBusy) //再判断是浏览器是否繁忙
                    {
                        i = i + 1;
                        if (i == 2)
                        {
                            CrossThreadCalls.SafeInvoke(this.webBrowser1, new CrossThreadCalls.TaskDelegate(delegate()
                            {
                                sUrl = webBrowser1.Url.ToString();
                            }));
                            if (sUrl.Contains("res") || sUrl.Contains("daohang.114so.cn")) //这是判断没有网络的情况下
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }
                        continue;
                    }
                    i = 0;
                }
            }
        }

        private void Delay(int Millisecond) //延迟系统时间,但系统又能同时能执行其它任务;
        {
            DateTime current = DateTime.Now;
            while (current.AddMilliseconds(Millisecond) > DateTime.Now)
            {
                Application.DoEvents();//转让控制权            
            }
            return;
        }

[转载]DataReader转实体类的方法 - ゞ追忆o0ゞ - 博客园

mikel阅读(1832)

转载DataReader转实体类的方法 – ゞ追忆o0ゞ – 博客园.

/// <summary>
        /// DataReader转泛型
        /// </summary>
        /// <typeparam name="T">传入的实体类</typeparam>
        /// <param name="objReader">DataReader对象</param>
        /// <returns></returns>
        public static IList<T> ReaderToList<T>(this IDataReader objReader)
        {
            using (objReader)
            {
                List<T> list = new List<T>();

                //获取传入的数据类型
                Type modelType = typeof(T);

                //遍历DataReader对象
                while (objReader.Read())
                {
                    //使用与指定参数匹配最高的构造函数,来创建指定类型的实例
                    T model = Activator.CreateInstance<T>();
                    for (int i = 0; i < objReader.FieldCount; i++)
                    {
                        //判断字段值是否为空或不存在的值
                        if (!IsNullOrDBNull(objReader[i]))
                        {
                            //匹配字段名
                            PropertyInfo pi = modelType.GetProperty(objReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                            if (pi != null)
                            {
                                //绑定实体对象中同名的字段  
                                pi.SetValue(model, CheckType(objReader[i], pi.PropertyType), null);
                            }
                        }
                    }
                    list.Add(model);
                }
                return list;
            }
        }

        /// <summary>
        /// 对可空类型进行判断转换(*要不然会报错)
        /// </summary>
        /// <param name="value">DataReader字段的值</param>
        /// <param name="conversionType">该字段的类型</param>
        /// <returns></returns>
        private static object CheckType(object value, Type conversionType)
        {
            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                    return null;
                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
                conversionType = nullableConverter.UnderlyingType;
            }
            return Convert.ChangeType(value, conversionType);
        }

        /// <summary>
        /// 判断指定对象是否是有效值
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static bool IsNullOrDBNull(object obj)
        {
            return (obj == null || (obj is DBNull)) ? true : false;
        }


/// <summary>
        /// DataReader转模型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="objReader"></param>
        /// <returns></returns>
        public static T ReaderToModel<T>(this IDataReader objReader)
        {

            using (objReader)
            {
                if (objReader.Read())
                {
                    Type modelType = typeof(T);
                    int count = objReader.FieldCount;
                    T model = Activator.CreateInstance<T>();
                    for (int i = 0; i < count; i++)
                    {
                        if (!IsNullOrDBNull(objReader[i]))
                        {
                            PropertyInfo pi = modelType.GetProperty(objReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                            if (pi != null)
                            {
                                pi.SetValue(model, CheckType(objReader[i], pi.PropertyType), null);
                            }
                        }
                    }
                    return model;
                }
            }
            return default(T);
        }