RSS 2.0 Feed
2004-03 Entries
摘要:GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值。 GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。 世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。 在这次开发 ASP.NET 应用时,我大量使用了类型为 GUID 的 ID 列作为各实体表的关键字(键)。由于其唯一、易产生的特性,给应用程序处理带来诸多好处。 1、在 SQL Server 中使用 GUID 如果在 SQL Server 的表定义中将列类型指定为 uniqueidentifier,则列的值就为 GUID 类型。 SQL Server 中的 NewID() 函数可以产生 GUID 唯一值,使用此函数的几种方式如下: 1) 作为列默认值 将 uniqueidentifier 的列的默认值设为 NewID(),这样当新行插入表中时,会自动生成此列 GUID 值。2)使用 T-SQL 在 T-SQL 中使用 NewID()函数,如“INSERT INTO Table(ID,... ) VALUES(NewID(),...)”来生成此列的 GUID 值。 3)提前获取 GUID 值 由于特殊功能需要,需要预先获知新行的 ID 值,也可以使用如下 C# 代码提前获得 GUID 的值,再存储到数据库中:  SqlCommand cmd = New SqlCommand(); cmd.CommandText = "SELECT NewID()"; string rowID = (string) cmd.ExecuteScalar(); cmd.CommandText = "INSERT INTO Table(ID,...) VALUES(@ID,...) cmd.Parameters.Add("@ID",SqlDbType.UniqueIdentifier).Value = new Guid(rowID); cmd.ExecuteNoQuery(); uniqueidentifier 值不能进行算术运算,但可以进行(意义不大的)比较操作和 NULL 检查;它不能象 IDENTITY 列一样,可以获知每行的增加时间的先后顺序,只能通过增加其它时间或时间戳列来完成此功能。 2、在 .NET 中使用 GUID GUID 在 .NET 中使用非常广泛,而且 .NET......[阅读全文]

posted @ | Feedback (38) | Filed Under [ 程序设计 软件技术 ]

摘要:如果大家用过 SharePoint Portal Server 2001,一定会记得增加型文件夹中的一些很不错的特性,如文档检出/检入、发布、审批流程等,其中最吸引我的就是它通过在文档的图标上加一个特别的标记,来表示文档的状态,如下图所示: 自己在做文档管理系统时,也借鉴了这种做法,其实和给图片加水印的作法类似,主要代码如下: function codedisplay() { if(document.all("code").style.display == "none") { document.all("code").style.display = ""; document.all("codeop").innerText = "Hide Code>>"; } else { document.all("code").style.display = "none"; document.all("codeop").innerText = "Show Code>>"; } } Show Code>> //取源图像Image imgPhoto = Image.FromFile(sSourceFile);Bitmap bmPhoto = new Bitmap(imgPhoto.Width, imgPhoto.Height, PixelFormat.Format24bppRgb);bmPhoto.MakeTransparent();//设置绘图面属性,呈现质量等   Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.SmoothingMode = SmoothingMode.AntiAlias; grPhoto.DrawImage( imgPhoto, new Rectangle(0, 0, imgPhoto.Width, imgPhoto.Height), 0, 0, imgPhoto.Width, mgPhoto.Height, GraphicsUnit.Pixel); //打开要附加的水印图片Image imgWatermark = new Bitmap(sWatermarkFile);Bitmap bmWatermark = new Bitmap(bmPhoto); bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);Graphics grWatermark = Graphics.FromImage(bmWatermark); int xPosOfWm = imgPhoto.Width - imgWatermark.Width;int yPosOfWm = imgPhoto.Height - imgWatermark.Height; //画grWatermark.DrawImage(imgWatermark,    new Rectangle(xPosOfWm,yPosOfWm,imgWatermark.Width,imgWatermark.Height),   0,                     0,                      imgWatermark.Width,               imgWatermark.Height,         GraphicsUnit.Pixel); //保存最终图片imgPhoto = bmWatermark;imgPhoto.Save(sIconFileName,ImageFormat.Png); 如果文档有审阅流程,那文档的流转图就非常受欢迎了,这样用户可以方便地查看文档正处于那个阶段。其实与工作流有关软件可能都有这样要求,我目前没有找到更好的办法,利用 <table> ,将各个阶段用线条和图形表示出来,办法虽有点笨,但好象显示效果还不错。 曾经试过 VML ,发现要动态地画这种图,就得很精确地控制屏幕上位置,比较麻烦,后来放弃了这种作法。 还曾经想用 Visio Automation 来试一下,发现 Visio 的对象模型和 VBA 比 Word 和 Excel 的难多了,工作量更大。...[阅读全文]

posted @ | Feedback (35) | Filed Under [ 程序设计 ]

摘要:最近做了一个 ASP.NET 的文档管理程序,有点类似于简化的 SharePoint Portal Server 2001,有兴趣的可以看看程序运行的截图 (多图)。 在开发过程中,陆续碰到和解决了一些不常见的问题,我会慢慢把这些问题和解决的办法都写出来。代码目前还有点乱,过两天再整理一下,请 Ma Qi、JGTM'2004、kaneboy 等几位高手帮我做一下 Code Review 或 Refactory。 前两天,在修改 ASPX 页面时,发现一个奇怪的问题,链接的CSS 文件里指定的其它设置都管用,就是字体名称设置不管用,如果直接在 ASPX 页面中指定字体名称(Style="font-family:宋体")就是正常的。 为了测试,我用 FrontPage 新建了一个 HTML 页面并链接了CSS 文件,页面显示正常,但当我把 HTM 后缀改成 ASPX 后,又失效了。 难道是 ASPX 和 CSS 有冲突? 可这两个东西风马牛不相及呀,于是仔细对比 HTM 和 ASPX 页面的源码,没有发现任何不同的地方,真是百思不得其解。最后终于无意中发现,HTM 页面和 ASPX 页面的编码方式不一样,HTM 是 GB2312 ,ASPX 是 UTF-8(即使其中含有 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 的标记)。 到此时我才明白,原来就是因为 ASPX 的输出编码为 Unicode,在处理 CSS 中的中文字体名(如“宋体”,“黑体”)时出错了错误,导致不能正确显示指定的字体。 处理办法: 1) 将 ASP.NET 的默认编码方式由 UTF-8 改为 GB2312 ;     不过,现在都搞全环化、国际化,还是用 UTF-8 好。 2) 将 CSS 文件中的中文字体名变为英文名称;    如 "Font-Family: 宋体" 改为 "Font-Family: SimSun" ,其它字体的英文名称如:SimYou 幼圆; SimHei 黑体; SimKai 楷体; SimFang 仿宋; SimLi 隶书等。 3) 将 CSS 文件中的中文字体名改为 Unicode 表示(\u...)     此种方法未试验,不知是否可行。 至于为什么我一定要用中文字体呢,原因是中文字体是等宽的,在处理页面时,能很精确控制元素的宽度,这样有利于版面的设计,我对软件界面的要求是很高的 ...[阅读全文]

posted @ | Feedback (25) | Filed Under [ 程序设计 ]

摘要:前几天看到 mvm 在一篇“细节体现差距”的 blog 讲 HK 的 ATM 是先吐卡后吐钱,而北京的 ATM 是先吐钱后吐卡,从而使 mvm 的朋友拿钱走人,却把卡丢失了。 既然是说“细节”,那我也来凑凑热闹,深究这个细节。 首先要说明的是,在北京各个银行 ATM 的先吐钱还是先吐卡的顺序并不相同,中国银行的 ATM 就是先吐卡,后吐钱,而其它的好几个银行就是先吐钱,后吐卡,所以 mvm 根据此“细节”来说明大陆和 HK 的金融服务差距,并不恰当  : P 。 其次,说说两种方式的优缺点: 1、先吐卡,后吐钱 优点:确保银行卡不会丢失,很少有人蠢到把卡拿走了,却把钱忘记了的这种程度,因为他(她)到 ATM 上就是去取钱的。 缺点:可能造成操作繁琐,给银行客户带来不必要的麻烦。 为什么呢?因为银行为了防范风险,在 ATM 上每次取现金的数额有限制,由 1000 - 3000 不等(一般每日最多支取 5000 元),如果我要在一个单次限额为 1000 的 ATM 上取 5000 ,就得插五次卡,如果我最后还想查询一下余额,又得插一次卡,“比较烦,比较烦,我最近比较烦”... 2、先吐钱,后吐卡 优点:可以在一次插卡后完成所有的操作(查询、取款、再取款、再查询...),给用户提供了完美的用户体验。 缺点:拿钱后乐晕了,忘记了拿卡。不过,现在好多 ATM 支持自动吞卡功能,即如果你忘记了拿卡,指定时间过后,ATM 会吞卡以免落后其它个人手中,到时候只能去柜台领取了。 别忘记了,现在有的 ATM 还打印凭条,这样钱、卡、凭条的先后顺序就更值得研究了,各个银行可能面对不同的客户群体,还要考虑他们的特点和使用习惯,学问哪 ... 先吐卡,后吐钱,先吐钱,后吐卡 ... ,都快成绕口令了。...[阅读全文]

posted @ | Feedback (11) | Filed Under [ IT 人生 ]