崔文远 Troy Cui 老崔先生的上海生活、技术博客

361篮球鞋

上次[URL=http://www.cuiwenyuan.com/shanghai/post/my-basketball-shoes-bought-from-decathlon.html]迪卡侬买的篮球鞋[/URL]被穿的开胶,右脚大脚趾左侧鞋帮开了个口。本打算再去迪卡侬买的,这不周日下午就得穿,索性京东上买了[URL=http://item.jd.com/1068281512.html]双361的马布里代言款[/URL],上一双穿了1年半,希望这双也能穿个1年半。



Tags:

发布: cuiwenyuan 分类: 技术管理与生活 评论: 0 浏览: 106

这个项目要多久开发完成?

 对于标题所述的问题,很多从事IT软件开发的人员会被经常问到,而我就几乎每周都会被问到。巧合的事今天读到一篇文章《How long would this project take?》的中文翻译,索性直接转过来,借由抒发一下心中的感慨。

More...

Tags:

发布: cuiwenyuan 分类: 五音五色 评论: 0 浏览: 102

锅边

近期明显懒了,这不又有好几个周没写博客了。今天天气不错,下午篮球队的固定活动2点半正常开始,趁着这点时间,写几句。

锅边是福州的美食,上个月有幸品尝了一下,大大的一海碗,陈医师帮我点好后才知道分量这么多,更没想到的是居然也能吃完,你可以想想有多好吃了。这里再次感谢陈医师。

除了锅边其实还有一个意外的收获,那就是雾霾茶,陈医生得知上海、北京空气污染严重,雾霾频繁,根据经方理论、精心配伍,弄了一副雾霾茶,并通过中药厂加工,弄成免煎的冲剂,每天一杯,帮助身体排出吸进去的雾霾颗粒。

仔细想想,面对如此的环境污染,我们能做的有限,从不能每天都带着口罩,也不能光在室内呼吸经过空气净化器过滤过的空气,总要在室外活动,总要吸进去雾霾的颗粒,时间久了,留在身体里面,对肺、心脏、大肠都不好。

附上茶的介绍,有需要的朋友可以联系我品尝体验。我还做了一个独立的博客,记录对抗雾霾的一些资料,请访问:[URL=http://www.wumaitea.com]雾霾茶[/URL]

<br/>黄金肺肠茶<br/>GOLDEN BODY CLEAN<br/>此茶是经方明师陈杰宽按照中医经方理论设计,清理大气污染,雾霾对肺造成的毒害,同时清除垃圾食品对大肠的伤害。并有保精阳,增精气,护元神,长寿安康之效果。 <br/> <br/>功效:清理雾霾污染引起肺的毒积,痰积,寒积,湿积,热毒。同时清除垃圾食品对大肠的伤害。通过对肺肠的高度清理,对鼻敏感,咳嗽,哮喘,声沙,慢性咽炎,皮肤湿疹,暗疮,黑斑也有缓急的作用。一茶多效。从而达到长寿安康,保精之作用。<br/>

Tags:

发布: cuiwenyuan 分类: 技术管理与生活 评论: 0 浏览: 123

Windows 2008 R2 64位 Web服务器设置点滴

老服务器被黑了很久,也一直没清理掉木马,昨天开始把服务器升级到2008了。默认安装好IIS以后,在做了基本的服务器安全设置(所有盘符只给SYSTEM权限)以后,访问网站出现如下错误,这里记录一下解决办法。

第一个是401权限问题,报错如下:

<br/>401 - 未授权: 由于凭据无效,访问被拒绝。<br/>您无权使用所提供的凭据查看此目录或页面。<br/>



解决方案如下:

<br/>1、打开“IIS信息服务管理器”——》选择你发布的网站——》选择功能视图中的“身份验证”——》右键匿名身份验证,选择“编辑”,选择并确认“特定用户IUSR”;<br/>2、右键要发布的网站文件夹,选择“安全”——》“编辑”——》“添加”——》“高级”——》“立刻查询”——》选择“IUSR”用户,然后保存;<br/>



第二个报错是ASP网站无法解析,解决方法如下:

应用程序池启用32位的程序支持


ASP全局设置启用父目录


如果是有Access数据库,还需要给ASP网站下的可修改的目录及文件修改和编辑的权限。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 1 浏览: 142

MSSQL 2008 R2附加数据库出现Readonly只读的处理

今天在新弄得MSSQL 2008 R2测试服务器上附加数据库时,一直出现附加后Readonly(只读)的情况,经过网络搜索,虽然其他方案也能解决问题,但还是根据以前的《[URL=http://www.cuiwenyuan.com/shanghai/post/Operating-system-error-5-5failed-to-retrieve-text-for-this-error-Reason-15105-Microsoft-SQL-Server-Error-5120.html]Win7 64位 + SQL 2008 R2下Attach Database的一个错误:Operating system error 5[/URL]》找出了如下解决办法。



<br/>1、打开该数据库文件及日志的属性窗口,选择“属性”菜单->选择“安全”标签->选择“编辑”按钮。<br/>2、在选择组或用户名列表中,选择Authenticated Users,在权限列表中选中完全控制。<br/>3、选择"确定"按钮关闭对话框。<br/>4、此时再次附加数据库,即可成功<br/>

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 77

越过山丘 还有山丘

电脑里,车载mp3里,一直放着全套的《李宗盛的音乐旅程.不舍.香港版》,以为他不会再唱了,后来喜欢上有他加盟的纵贯线的《出发》,接着又听到了这首《山丘》,明年这2首个会入我车载mp3榜单前三甲了。

附上这段我喜欢的《出发》歌词片段

<br/>出发啦 不要问那路在哪<br/>迎风向前 是唯一的方法<br/>出发啦 不想问那路在哪<br/>运命哎呀 什么关卡<br/>当车声隆隆 梦开始阵痛<br/>它卷起了风 重新雕塑每个面孔<br/>夜雾那么浓 开阔也汹涌<br/>有一种预感 路的终点是迷宫<br/>


还有《山丘》的mtv

Tags:

发布: cuiwenyuan 分类: 五音五色 评论: 0 浏览: 70

升级IIRF from v1.2 to v2.1

用了好多年的IIS下的伪静态利器IIRF,因为服务器的升级计划,也将从1.2升级到2.1了,不多说了,IIRF的最新版本介绍及升级使用注意事项请看[URL=http://iirf.codeplex.com/]官方网站[/URL]。

在ASP时代,这个工具真的是帮助巨大,.Net年代继续发挥余热。即便是现今MVC的Router出现了,这个IIRF还是会需要的。

我安装的是全局调用,在安装后,所有应用程序池会自动停掉,查看系统日志,有报错:IIRF: event ID 3, IIRF: Could not open ini file '' (error: 13, ).



经Google官方的论坛,得到启示是我的站点用户访问权限的问题,只需要给IIRF.ini文件加上IIS_WPG的访问权限即可。



另外需要注意的就是,全局开启IIRF的时候,每个站点根目录下面都需要放置IIRF.ini文件,即便是空文件都行,这点我觉得需要改进。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 1 浏览: 70

速度超快:使用SqlBulkCopy导入DataTable数据到MSSQL数据库

[URL=http://www.cuiwenyuan.com/shanghai/post/Import-Excel-Into-Database-via-NPOI2-In-CSharp-Web-Development.html]上篇文章[/URL]提到使用NPOI导入Excel到数据库,其实只完成了一半的工作,那就是Excel上传到服务器,然后读取到了内存的DataTable,最后面的插入数据库的操作是另一半工作。

相关的参考代码,原理就是创建一个临时表,把读取到内存的Excel数据(DataTable)使用SqlBulkCopy快速导入到数据库,然后再导入真正的业务表。在我导入13800条记录的时候,基本上10秒之内搞定,当然了最初用那个循环DataTable,然后再循环中使用Entity的方式添加,速度不知快了多少倍。

越多的业务开发,越来越感觉到吉日嘎拉的GPM平台的便利,现在基本上有一个数据维护管理类的应用,数据表根据模型建立好之后,基本上当天就能弄好。后期的工作重点要放在报表分析、复杂查询上了,因为这是用户喜欢用OA的理由之一。

<br/>#region public void SqlBulkCopyData(DataTable dt) 利用Net SqlBulkCopy 批量导入数据库,速度超快<br/>        /// <summary><br/>        /// 利用Net SqlBulkCopy 批量导入数据库,速度超快<br/>        /// </summary><br/>        /// <param name="dt">源内存数据表</param><br/>        public void SqlBulkCopyData(DataTable dt)<br/>        {<br/>            // SQL 数据连接<br/>            SqlConnection sqlConnection = null;<br/>            // 打开数据库<br/>            this.Open();<br/>            // 获取连接<br/>            sqlConnection = (SqlConnection)GetDbConnection();<br/>            using (SqlTransaction tran = sqlConnection.BeginTransaction())<br/>            {<br/>                // 批量保存数据,只能用于Sql<br/>                SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, tran);<br/>                // 设置源表名称<br/>                sqlbulkCopy.DestinationTableName = dt.TableName;<br/>                // 设置超时限制<br/>                sqlbulkCopy.BulkCopyTimeout = 1000;<br/><br/>                foreach (DataColumn dtColumn in dt.Columns)<br/>                {<br/>                    sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);<br/>                }<br/>                try<br/>                {<br/>                    // 写入<br/>                    sqlbulkCopy.WriteToServer(dt);<br/>                    // 提交事务<br/>                    tran.Commit();<br/>                }<br/>                catch<br/>                {<br/>                    tran.Rollback();<br/>                    sqlbulkCopy.Close();<br/>                }<br/>                finally<br/>                {<br/>                    sqlbulkCopy.Close();<br/>                    this.Close();<br/>                }<br/>            }<br/>        }<br/>        #endregion<br/>



<br/>if (dt != null)<br/>        {<br/>            // 用循环把数据一行行输出到缓冲流中<br/>            if (dt.Rows.Count <= 100)<br/>            {<br/>                for (int i = 0; i < dt.Rows.Count; i++)<br/>                {<br/>                    PurchasePriceComparisonEntity entity = new PurchasePriceComparisonEntity();<br/>                    entity.BPS = dt.Rows[i]["BPS"].ToString();<br/>                    entity.Family = dt.Rows[i]["Family"].ToString();<br/>                    entity.PartNumber = dt.Rows[i]["PartNumber"].ToString();<br/>                    entity.POPriceCurrentMonth = dt.Rows[i]["POPriceCurrentMonth"].ToString();<br/>                    entity.POPriceCurrentYear = dt.Rows[i]["POPriceCurrentYear"].ToString();<br/>                    entity.POPriceLastMonth = dt.Rows[i]["POPriceLastMonth"].ToString();<br/>                    entity.POPriceLastYear = dt.Rows[i]["POPriceLastYear"].ToString();<br/>                    entity.ProductGroup = dt.Rows[i]["ProductGroup"].ToString();<br/>                    entity.SPG = dt.Rows[i]["SPG"].ToString();<br/>                    entity.Supplier = dt.Rows[i]["Supplier"].ToString();<br/>                    entity.TotalPurchaseYTDSpendCurrentMonthPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendCurrentMonthPOPrice"].ToString();<br/>                    entity.TotalPurchaseYTDSpendCurrentYearPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendCurrentYearPOPrice"].ToString();<br/>                    entity.TotalPurchaseYTDSpendLastMonthPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendLastMonthPOPrice"].ToString();<br/>                    entity.TotalPurchaseYTDSpendLastYearPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendLastYearPOPrice"].ToString();<br/>                    entity.YTDPurchaseQTY = float.Parse(dt.Rows[i]["YTDPurchaseQTY"].ToString());<br/>                    // 追加到数据库<br/>                    manager.Add(entity);<br/>                    // 置空<br/>                    //entity = null;<br/>                }<br/>            }<br/>            // 快速导入<br/>            else<br/>            {<br/>                // 指定表名<br/>                dt.TableName = "PurchasePriceComparisonTemp";<br/>                manager.SqlBulkImport(dt);<br/>            }<br/>        }<br/>        // 清空掉dt里的内容<br/>        dt = null;<br/>

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 1 浏览: 304

C# .Net Web开发中导入Excel到数据库,使用NPOI2支持2003、2007、2010等更高版本

周五花了半天时间搞一个OA里面的Excel报表导入,使用的是吉日嘎拉的GPM架构,但是发现其DotNet.Utilities中的Excel导入类,只能支持Office2003、2007版本,对于2010版本就不支持了,通过搜索[URL=http://code.google.com/p/npoi/]NPOI官方[/URL]文档,终于找到了解决办法,可以不用再担心用户Excel文件版本的问题了。以下2篇文章起到很大作用,特别感谢Tony Qu搞出来这么好的组件。

1、《[URL=http://tonyqus.sinaapp.com/archives/575]NPOI 2教程–1.2 NPOI 2.0模块简介[/URL]》
2、《[URL=http://tonyqus.sinaapp.com/archives/482]NPOI 2.0教程 – 自动识别Excel 2003或2007格式[/URL]》

修改到的文件代码如下,请注意升级NPOI到2的版本,同时请手工添加多个dll引用,貌似1的版本只需要引用一个文件,而2的版本需要应用4个(NPOI.dll, NPOI.OOXML.dll, NPOI.OpenXml4Net.dll, ICSharpCode.SharpZipLib.dll)。

<br/>        /// <summary><br/>        /// 读取Excel<br/>        /// 默认第一行为标头<br/>        /// 支持Office 2007以上版本<br/>        /// 替换原先的方式,不存在非托管方式无法释放资源的问题<br/>        /// 适用于B/S C/S。服务器可免安装Office。<br/>        /// Pcsky 2012.05.01<br/>        /// </summary><br/>        /// <param name="path">excel文档路径</param><br/>        /// <returns></returns><br/>        public static DataTable ImportExcel(string path, int sheetIndex = 0 )<br/>        {<br/>            string columnName;<br/>            var dt = new DataTable();<br/>            //HSSFWorkbook wb;<br/>            IWorkbook wb;<br/>            using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))<br/>            {<br/>                // 只支持2007及以下低版本<br/>                //wb = new HSSFWorkbook(file);<br/>                // 通过接口的方式实现从xls到xlsx 2003、2007以上版本的全部支持<br/>                wb = WorkbookFactory.Create(file);<br/><br/>            }<br/>            ISheet sheet = wb.GetSheetAt(sheetIndex);<br/>            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();<br/>            IRow headerRow = sheet.GetRow(0);<br/>            int cellCount = headerRow.LastCellNum;<br/><br/>            // 添加datatable的标题行<br/><br/><br/>            //for (int i = 0; i < cellCount; i++)<br/>            for (int i = headerRow.FirstCellNum; i < cellCount; i++)<br/>            {<br/>                //ICell cell = headerRow.GetCell(j);<br/>                //dt.Columns.Add(cell.ToString());<br/><br/>                // 2012.09.13 Pcsky 处理空列<br/>                if (headerRow.GetCell(i) == null)<br/>                {<br/>                    columnName = Guid.NewGuid().ToString();<br/>                }<br/>                else<br/>                {<br/>                    columnName = headerRow.GetCell(i).StringCellValue;<br/>                }<br/>                DataColumn column = new DataColumn(columnName);<br/>                dt.Columns.Add(column);<br/>            }<br/><br/>            // 从第2行起添加内容行<br/>            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)<br/>            {<br/>                IRow row = sheet.GetRow(i);<br/>                DataRow dr = dt.NewRow();<br/><br/>                // 2012.09.12 Pcsky 设置dataRow的索引号从0开始<br/>                int k = 0;<br/>                for (int j = row.FirstCellNum; j < cellCount; j++)<br/>                {<br/>                    //if (row.GetCell(j) != null)<br/>                    //{<br/>                    //dataRow[j] = row.GetCell(j).ToString();<br/><br/>                    dr[k] = row.GetCell(j);<br/>                    k++;<br/>                    //}<br/>                }<br/><br/>                dt.Rows.Add(dr);<br/>            }<br/>            wb = null;<br/>            sheet = null;<br/>            return dt;<br/>        }<br/>



现在想想:满足了一下用户的需求,盯了一天的电脑,同事说我眼睛都红了,而内心还挺高兴,也许这就是工作的乐趣、编程的乐趣吧,当然了,坏处就是一旦有啥东西搞不定,就会很沮丧,而影响心情和生活。我们都是凡人,没办法。

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 243

给CuteEditor编辑器添加中文字体的方法及代码

OA开发的前两个应用模块给用户去测试了,反馈回来的意见是CuteEditor网页编辑器中的字体没有中文字体。百度和Google了一下,没有现成的代码,只好根据这篇《[URL=http://www.cnblogs.com/mxh691/archive/2008/07/10/1240166.html]CuteEditor 编辑器添加中文字体[/URL]》,花了20分钟整理出来了常见中文字体的清单代码,分享一下给同样用CuteEditor的朋友,更推荐给[URL=http://www.cnblogs.com/jirigala/]吉日嘎拉[/URL]的GPM用户们,又帮你们省了至少10分钟时间去干点别的挥霍生命。

<br/><item text="SimSun" html="<font size=3 face='SimSun'>宋体</font>">SimSun</item><br/><item text="SimHei" html="<font size=3 face='SimHei'>黑体</font>">SimHei</item><br/><item text="FangSong_GB2312" html="<font size=3 face='FangSong_GB2312'>仿宋_GB2312</font>">FangSong_GB2312</item><br/><item text="KaiTi_GB2312" html="<font size=3 face='KaiTi_GB2312'>楷体_GB2312</font>">KaiTi_GB2312</item><br/><item text="YouYuan" html="<font size=3 face='YouYuan'>幼圆</font>">YouYuan</item><br/><item text="STSong" html="<font size=3 face='STSong'>华文宋体</font>">STSong</item><br/><item text="STZhongsong" html="<font size=3 face='STZhongsong'>华文中宋</font>">STZhongsong</item><br/><item text="STKaiti" html="<font size=3 face='STKaiti'>华文楷体</font>">STKaiti</item><br/><item text="STFangsong" html="<font size=3 face='STFangsong'>华文仿宋</font>">STFangsong</item><br/><item text="STXihei" html="<font size=3 face='STXihei'>华文细黑</font>">STXihei</item><br/><item text="STLiti" html="<font size=3 face='STLiti'>华文隶书</font>">STLiti</item><br/><item text="STXingkai" html="<font size=3 face='STXingkai'>华文行楷</font>">STXingkai</item><br/><item text="STXinwei" html="<font size=3 face='STXinwei'>华文新魏</font>">STXinwei</item><br/><item text="STHupo" html="<font size=3 face='STHupo'>华文琥珀</font>">STHupo</item><br/><item text="STCaiyun " html="<font size=3 face='STCaiyun '>华文彩云</font>">STCaiyun </item><br/><item text="FZYaoTi" html="<font size=3 face='FZYaoTi'>方正姚体简体</font>">FZYaoTi</item><br/><item text="FZShuTi" html="<font size=3 face='FZShuTi'>方正舒体简体</font>">FZShuTi</item><br/><item text="NSimSun" html="<font size=3 face='NSimSun'>新宋体</font>">NSimSun</item><br/><item text="LiSu" html="<font size=3 face='LiSu'>隶书</font>">LiSu</item><br/>



需要修改的文件是CuteSoft_Client\CuteEditor\Configuration\Shared\Common.config,找到FontName的节点即可。

发现贴出来的代码好像给自动浏览器转义了,上传一个文本附件,大家用附件中的代码。

[URL=upload/CuteEditorChinseFonts.txt]CuteEditorChinseFonts.txt[/URL]

Tags:

发布: cuiwenyuan 分类: Web技术 评论: 0 浏览: 121