<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Early sow,early mow</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/5712/rss</id><updated>2011-04-20T01:57:15Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/5712/rss"/><entry><id>http://www.cnblogs.com/emosen/archive/2011/04/20/2021896.html</id><title type="text">Win7 不能安装SQL Server 2005 Management Studio Express.msi解决办法</title><summary type="text">在Win7中安装SQL Server 2005 Management Studio Express.msi会出现一下提示：“错误码29506．．．．．．．”。解决方案如下：安装新版本：Microsoft SQL Server Management Studio Express Service Pack 3下载地址：http://www.microsoft.com/downloads/details.aspx?familyid=5D76230D-580D-4874-8C7D-93491A29DB15&amp;amp;displaylang=zh-cn新建一个文本文件，输入msiexec /i d:\SQ</summary><published>2011-04-20T01:42:00Z</published><updated>2011-04-20T01:42:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2011/04/20/2021896.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2011/04/20/2021896.html"/><content type="html">&lt;p&gt;在Win7中安装SQL Server 2005 Management Studio Express.msi会出现一下提示：&amp;#8220;错误码29506．．．．．．．&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red"&gt;解决方案如下：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;wbr&gt;&lt;/p&gt;&#xD;
&lt;p&gt;安装新版本：&lt;font style="font-size: 14px"&gt;Microsoft SQL Server Management Studio Express Service Pack 3&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载地址：&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=5D76230D-580D-4874-8C7D-93491A29DB15&amp;amp;displaylang=zh-cn"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=5D76230D-580D-4874-8C7D-93491A29DB15&amp;amp;displaylang=zh-cn&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="font-size: 14px" color="#000000"&gt;新建一个文本文件，输入msiexec /i d:\SQLServer2005_SSMSEE.msi&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="font-size: 14px" color="#000000"&gt;（假设下载的文件名为SQLServer2005_SSMSEE.msi ，放在d盘根目录下，即是安装程序的绝对路劲）&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="font-size: 14px" color="#000000"&gt;保存改扩展名为.cmd格式&lt;br /&gt;右键鼠标----然后以管理员身份运行这个程序就可以。&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/emosen/aggbug/2021896.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/emosen/archive/2011/04/20/2021896.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/emosen/archive/2010/08/26/1808960.html</id><title type="text">WINDOWS 画空心字</title><summary type="text">private void Form1_Paint(object sender, PaintEventArgs e) { System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath(); gp.AddString("新年快乐！", this.Font.FontFamily, (int)Fon...</summary><published>2010-08-26T04:30:00Z</published><updated>2010-08-26T04:30:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2010/08/26/1808960.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2010/08/26/1808960.html"/><content type="html">&lt;p&gt;private void Form1_Paint(object sender, PaintEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gp.AddString("新年快乐！", this.Font.FontFamily, (int)FontStyle.Bold, 50, new RectangleF(0, 0, 400, 50), null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics.DrawPath(Pens.Black, gp);&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&lt;img src="http://www.cnblogs.com/emosen/aggbug/1808960.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/emosen/archive/2010/08/26/1808960.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/emosen/archive/2010/08/26/1808924.html</id><title type="text">ZT--文本显示尺寸计算（关于控件的尺寸定义）</title><summary type="text">WM系统的特点之一就是：尺寸比较小。因此，在ＵＩ设计时，控件大小、位置、布局，就显得尤为重要，力求在有限的空间中，完整的显示文本信息。之前提到的跑马灯控件，也是类似的功能。　　用于文本显示的，主要有两种控件：ＬＡＢＥＬ和ＴＥＸＴＢＯＸ。这两种控件，在一定程度上，都支持自动换行。但是要使其显示完整信息，就必须定义一个合适的尺寸（ＬＡＢＥＬ显示高度不够时，文字被遮蔽，ＴＥＸＴＢＯＸ则会显示滚动条）。　...</summary><published>2010-08-26T03:43:00Z</published><updated>2010-08-26T03:43:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2010/08/26/1808924.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2010/08/26/1808924.html"/><content type="html">&lt;p&gt;WM系统的特点之一就是：尺寸比较小。因此，在ＵＩ设计时，控件大小、位置、布局，就显得尤为重要，力求在有限的空间中，完整的显示文本信息。之前提到的跑马灯控件，也是类似的功能。&lt;/p&gt;&#xD;
&lt;p&gt;用于文本显示的，主要有两种控件：ＬＡＢＥＬ和ＴＥＸＴＢＯＸ。这两种控件，在一定程度上，都支持自动换行。但是要使其显示完整信息，就必须定义一个合适的尺寸（ＬＡＢＥＬ显示高度不够时，文字被遮蔽，ＴＥＸＴＢＯＸ则会显示滚动条）。&lt;/p&gt;&#xD;
&lt;p&gt;情况一、ＬＡＢＥＬ不换行，但需要显示完整的内容，即动态设置ＬＡＢＥＬ的长度。 &lt;/p&gt;&#xD;
&lt;p&gt;在NET2.0的桌面系统中，可以用以下方法：&lt;br /&gt;　　TextRenderer.MeasureText 方法 (String, Font)&lt;br /&gt;　　在使用指定字体绘制时，提供指定文本的尺寸（以像素为单位）。&lt;/p&gt;&#xD;
&lt;p&gt;NETCF可以用以下方式：&lt;br /&gt;&amp;nbsp; 　　Graphics g = this.CreateGraphics();&lt;br /&gt;&amp;nbsp; 　　SizeF siF = g.MeasureString(内容, 字体);&lt;br /&gt;&amp;nbsp; 　　label2.Width = (int)siF.Width;&lt;/p&gt;&#xD;
&lt;p&gt;情况二、在LABEL显示时，需要自动换行，并根据实际高度，设置控件的尺寸。&lt;br /&gt;　　思路，计算出一行显示需要的尺寸，除以希望每行显示的尺寸，得到行数。 再根据行数得到高度。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　情况三、在TEXTBOX中，根据文本，需要计算文本需要显示的高度。&lt;br /&gt;　　一般思路，文字的FONT决定了高度，只要知道行数，就可以得到需要显示的高度了。但是，用topic.Font.Height当行数很多时存在误差。 所以， 要获得一行文字所占的实际高度，需要借鉴Graphics方法。&lt;/p&gt;&#xD;
&lt;p&gt;以下是获得行数的方法（获得行数的方法，只支持2005）：&lt;/p&gt;&#xD;
&lt;p&gt;[DllImport("coredll.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;private void button1_Click(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //获得TEXTBOX中文本的实际高度&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int EM_GETLINECOUNT = 0x00BA;//获取总行数的消息号&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int lc = SendMessage(this.textBox1.Handle, EM_GETLINECOUNT, IntPtr.Zero, "");//行数&lt;/p&gt;&#xD;
&lt;p&gt;Graphics g = this.CreateGraphics();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SizeF siF = g.MeasureString("TEST", textBox1.Font);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.Dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sf = (int)siF.Height * lc;&lt;/p&gt;&#xD;
&lt;p&gt;this.textBox1.ClientSize = new Size(this.textBox1.ClientSize.Width, sf + 5);&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;针对2003获得行数，需要下面的方法（获得控件句柄）：&lt;br /&gt;&amp;nbsp;[DllImport("coredll.dll")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static extern IntPtr GetFocus();&lt;br /&gt;&amp;nbsp;IntPtr hWnd = GetFocus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int lc3 = SendMessage(hWnd, EM_GETLINECOUNT, IntPtr.Zero, "");//行数&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文来自CSDN博客，转载请标明出处：&lt;a href="http://blog.csdn.net/zhaojiangang/archive/2009/02/09/3869683.aspx"&gt;http://blog.csdn.net/zhaojiangang/archive/2009/02/09/3869683.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/emosen/aggbug/1808924.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/emosen/archive/2010/08/26/1808924.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/emosen/archive/2010/07/28/1786958.html</id><title type="text">create database link</title><summary type="text">如果本地的tnsnames.ora中已经建立了远程的数据库连接，那么就是用2，否则就是用11：create database link geelyin96　　 connect to geelyin identified by geelyinpassword 　　 using '(DESCRIPTION = 　　 (ADDRESS_LIST = 　　 (ADDRESS = (PROTOCOL = T...</summary><published>2010-07-28T05:46:00Z</published><updated>2010-07-28T05:46:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2010/07/28/1786958.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2010/07/28/1786958.html"/><content type="html">&lt;p&gt;如果本地的tnsnames.ora中已经建立了远程的数据库连接，那么就是用2，否则就是用1&lt;/p&gt;&#xD;
&lt;p&gt;1：create database link geelyin96&lt;br /&gt;　　 connect to geelyin identified by geelyinpassword &lt;br /&gt;　　 using '(DESCRIPTION = &lt;br /&gt;　　 (ADDRESS_LIST = &lt;br /&gt;　　 (ADDRESS = (PROTOCOL = TCP)(HOST = 10.86.1.96)(PORT = 1521)) &lt;br /&gt;　　 ) &lt;br /&gt;　　 (CONNECT_DA&lt;wbr&gt;TA = &lt;br /&gt;　　 (SERVICE_NAME = appdb) &lt;br /&gt;　　 ) &lt;br /&gt;　　 )'; &lt;/p&gt;&#xD;
&lt;p&gt;说明：geelyin96为database link的名字，geelyin为远程数据库的用户名，geelyinpassword 为远程数据库的密码&lt;/p&gt;&#xD;
&lt;p&gt;host为远程数据库的ip，port为远程数据库的端口号，service_name为ssid的名字&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;2：create database link geelyin96&lt;/p&gt;&#xD;
&lt;p&gt;connect to geelyin identified by&amp;nbsp; geelyinpassword &lt;/p&gt;&#xD;
&lt;p&gt;using '10.86.1.96'; &lt;br /&gt;说明：geelyin96为database link的名字，geelyin为远程数据库的用户名，geelyinpassword 为远程数据库的密码，&lt;/p&gt;&#xD;
&lt;p&gt;'10.86.1.96' 为tnsnames.ora中远程连接数据库的链接名字&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;查询语句sql-&amp;gt;select&amp;nbsp; * from &lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#116;&amp;#97;&amp;#98;&amp;#108;&amp;#101;&amp;#110;&amp;#97;&amp;#109;&amp;#101;&amp;#64;&amp;#103;&amp;#101;&amp;#101;&amp;#108;&amp;#121;&amp;#105;&amp;#110;&amp;#57;&amp;#54;"&gt;&lt;font color="#206b9f"&gt;tablename@geelyin96&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;select *&amp;nbsp;&amp;nbsp; from dba_objects where object_type='DATABASE LINK' 查询所有database link&lt;/p&gt;&lt;img src="http://www.cnblogs.com/emosen/aggbug/1786958.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/emosen/archive/2010/07/28/1786958.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/emosen/archive/2010/04/19/1715367.html</id><title type="text">数据库主键设计之思考</title><summary type="text">主键的必要性有些朋友可能不提倡数据库表必须要主键，但在我的思考中，觉得每个表都应该具有主键，不管是单主键还是双主键，主键的存在就代表着表结构的完整性，表的记录必须得有唯一区分的字段，主键主要是用于其他表的外键关联，本记录的修改与删除，当我们没有主键时，这些操作会变的非常麻烦。主键的无意义性我强调主键不应该具有实际的意义，这可能对于一些朋友来说不太认同，比如订单表吧，会有&amp;#8220;订单编号&amp;#8...</summary><published>2010-04-19T06:19:00Z</published><updated>2010-04-19T06:19:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2010/04/19/1715367.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2010/04/19/1715367.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;主键的必要性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有些朋友可能不提倡&lt;a target="_self"&gt;&lt;span style="text-decoration: underline"&gt;&lt;strong&gt;&lt;font color="#108ac6"&gt;数据库&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;表必须要主键，但在我的思考中，觉得每个表都应该具有主键，不管是单主键还是双主键，主键的存在就代表着表结构的完整性，表的记录必须得有唯一区分的字段，主键主要是用于其他表的外键关联，本记录的修改与删除，当我们没有主键时，这些操作会变的非常麻烦。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主键的无意义性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我强调主键不应该具有实际的意义，这可能对于一些朋友来说不太认同，比如订单表吧，会有&amp;#8220;订单编号&amp;#8221;字段，而这个字段呢在业务实际中本身就是应该具有唯一性，具有唯一标识记录的功能，但我是不推荐采用订单编号字段作为主键的，因为具有实际意义的字段，具有&amp;#8220;意义更改&amp;#8221;的可能性，比如订单编号在刚开始的时候我们一切顺利，后来客户说&amp;#8220;订单可以作废，并重新生成订单，而且订单号要保持原订单号一致&amp;#8221;，这样原来的主键就面临危险了。因此，具有唯一性的实际字段也代表可以作为主键。因此，我推荐是新设一个字段专门用为主键，此主键本身在业务逻辑上不体现，不具有实际意义。而这种主键在一定程序增加了复杂度，所以要视实际系统的规模大小而定，对于小项目，以后扩展不会很大的话，也查允许用实际唯一的字段作主键的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主键的选择&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们现在在思考一下，应该采用什么来作表的主键比较合理，申明一下，主键的设计没有一个定论，各人有各人的方法，哪怕同一个，在不同的项目中，也会采用不同的主键设计原则。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第一：编号作主键&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此方法就是采用实际业务中的唯一字段的&amp;#8220;编号&amp;#8221;作为主键设计，这在小型的项目中是推荐这样做的，因为这可以使项目比较简单化，但在使用中却可能带来一些麻烦，比如要进行&amp;#8220;编号修改&amp;#8221;时，可能要涉及到很多相关联的其他表，就象黎叔说的&amp;#8220;后果很严重&amp;#8221;;还有就是上面提到的&amp;#8220;业务要求允许编号重复时&amp;#8221;，我们再那么先知，都无法知道业务将会修改成什么?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第二：自动编号主键&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这种方法也是很多朋友在使用的，就是新建一个ID字段，自动增长，非常方便也满足主键的原则，优点是：数据库自动编号，速度快，而且是增量增长，聚集型主键按顺序存放，对于检索非常有利;数字型的，占用空间小，易排序，在程序中传递也方便;如果通过非系统增加记录(比如手动录入，或是用其他工具直接在表里插入新记录，或老系统数据导入)时，非常方便，不用担心主键重复问题。&lt;/p&gt;&#xD;
&lt;p&gt;缺点：其实缺点也就是来自其优点，就是因为自动增长，在手动要插入指定ID的记录时会显得麻烦，尤其是当系统与其他系统集成时，需要数据导入时，很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的);如果其他系统主键不是数字型那就麻烦更大了，会导致修改主键数据类型了，这也会导致其他相关表的修改，后果同样很严重;就算其他系统也是数字型的，在导入时，为了区分新老数据，可能想在老数据主键前统一加一个&amp;#8220;o&amp;#8221;(old)来表示这是老数据，那么自动增长的数字型又面临一个挑战。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第三：Max加一&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于自动编号存在那些问题，所以有些朋友就采用自己生成，同样是数字型的，只是把自动增长去掉了，采用在Insert时，读取Max值后加一，这种方法可以避免自动编号的问题，但也存在一个效率问题，如果记录非常大的话，那么Max()也会影响效率的;更严重的是并发性问题，如果同时有两人读到相同的Max后，加一后插入的ID值会重复，这已经是有经验教训的了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第四：自制加一&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;考虑Max加一的效率后，有人采用自制加一，也就是建一个特别的表，字段为：表名，当前序列值。这样在往表中插入值时，先从此表中找到相应表的最大值后加一，进行插入，有人可能发现，也可能会存在并发处理，这个并发处理，我们可以采用lock线程的方式来避免，在生成此值的时，先Lock，取到值以后，再unLock出来，这样不会有两人同时生成了。这比Max加一的速度要快多了。但同样存在一个问题：在与其他系统集成时，脱离了系统中的生成方法后，很麻烦保证自制表中的最大值与导入后的保持一致，而且数字型都存在上面讲到的&amp;#8220;o&amp;#8221;老数据的导入问题。因此在&amp;#8220;自制加一&amp;#8221;中可以把主键设为字符型的。字符型的自制加一我倒是蛮推荐的，应该字符型主键可以应付很多我们意想不到的情况。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第五：GUID主键&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;目前一个比较好的主键是采用GUID，当然我是推荐主键还是字符型的，但值由GUID生成，GUID是可以自动生成，也可以程序生成，而且键值不可能重复，可以解决系统集成问题，几个系统的GUID值导到一起时，也不会发生重复，就算有&amp;#8220;o&amp;#8221;老数据也可以区分，而且效率很高，在.NET里可以直接使用System.Guid.NewGuid()进行生成，在&lt;a target="_self"&gt;&lt;span style="text-decoration: underline"&gt;&lt;strong&gt;&lt;font color="#108ac6"&gt;SQL&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;里也可以使用 NewID()生成。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;优点是：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;同 IDENTITY 列相比，uniqueidentifier 列可以通过 NewID() 函数提前得知新增加的行 ID，为应用程序的后续处理提供了很大方便。&lt;/p&gt;&#xD;
&lt;p&gt;便于数据库移植，其它数据库中并不一定具有 IDENTITY 列，而 Guid 列可以作为字符型列转换到其它数据库中，同时将应用程序中产生的 GUID 值存入数据库，它不会对原有数据带来影响。&lt;/p&gt;&#xD;
&lt;p&gt;便于数据库初始化，如果应用程序要加载一些初始数据， IDENTITY 列的处理方式就比较麻烦，而 uniqueidentifier 列则无需任何处理，直接用 T-SQL 加载即可。&lt;/p&gt;&#xD;
&lt;p&gt;便于对某些对象或常量进行永久标识，如类的 ClassID，对象的实例标识，UDDI 中的联系人、服务接口、tModel标识定义等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;缺点是：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;GUID 值较长，不容易记忆和输入，而且这个值是随机、无顺序的。&lt;/p&gt;&#xD;
&lt;p&gt;GUID 的值有 16 个字节，与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键，可能会带来两方面的消极影响：存储空间增大;索引时间较慢。&lt;/p&gt;&#xD;
&lt;p&gt;我也不是推荐GUID最好，其实在不同的情况，我们都可以采用上面的某一种方式，思考了一些利与弊，也方便大家在进行设计时参考。这些也只是我的一点思考而已，而且可能我知识面限制，会有一些误论在里面，希望大家有什么想法欢迎讨论。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/emosen/aggbug/1715367.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/emosen/archive/2010/04/19/1715367.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/emosen/archive/2009/09/24/1573368.html</id><title type="text">开始→运行→输入的命令集锦</title><summary type="text">mstsc--远程桌面连接 logoff--注销命令 rononce －p --15秒关机 tsshutdn--60秒倒计时关机命令 iexpress--木马捆绑工具，系统自带 tourstart--xp简介（安装完成后出现的漫游xp程序） winchat--XP自带局域网聊天 sndrec32--录音机 Nslookup--IP地址侦测器 explorer--打开资源管理器 lusrmgr.ms...</summary><published>2009-09-24T07:41:00Z</published><updated>2009-09-24T07:41:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2009/09/24/1573368.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2009/09/24/1573368.html"/></entry><entry><id>http://www.cnblogs.com/emosen/archive/2009/09/24/1573352.html</id><title type="text">开发人员一定要加入收藏夹的网站</title><summary type="text">http://www.gotapi.com/语言：英语简介：HTML,CSS,XPATH,XSL,JAVASCRIPT等API的查询网站。http://www.w3schools.com/语言：英语简介：W3C制定的标准诸如XML,HTML,XSL等等的在线学习教程。http://www.xml.org.cn/语言：中文简介：可以说是XML的中国官方网吧。W3C标准的翻译组织与XML系列技术交流社...</summary><published>2009-09-24T07:29:00Z</published><updated>2009-09-24T07:29:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2009/09/24/1573352.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2009/09/24/1573352.html"/></entry><entry><id>http://www.cnblogs.com/emosen/archive/2009/07/06/1517765.html</id><title type="text">SQL Server 2005 Express 远程访问设置方法</title><summary type="text">SQL Server 2005 Express 作为微软数据库的低端解决方案，在开发小型应用和WEB应用中有广泛的使用。但是SQL Server 2005 Exrpress在默认安装下只允许本机访问，如何启用网络访问功能就很有必要，现在我简单的介绍一下。1、 确认成功安装SQL Server 2005 Express和 数据库服务已经启动。安装完成后，可以通过随SQL Server 2005 Ex...</summary><published>2009-07-06T07:49:00Z</published><updated>2009-07-06T07:49:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2009/07/06/1517765.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2009/07/06/1517765.html"/></entry><entry><id>http://www.cnblogs.com/emosen/archive/2009/07/06/1517723.html</id><title type="text">Microsoft SQL Server 2005 Express 远程访问设置详述，100%成功篇</title><summary type="text">概述　　Microsoft SQL Server 2005 Express Edition是Microsoft数据库的低端解决方案，是免费的，并且可以随软件免费发布，而就其数据库功能对于一般的企业级应用已足够了。但 默认安装时只允许本地访问，而不能远程访问。为了解决这种问题，网上有不少文章进行了介绍，但是都不全，如果你照着做，大都只完成了部份功能，而不能完全成功。本人查了大量资料，几次都想放弃，最...</summary><published>2009-07-06T07:15:00Z</published><updated>2009-07-06T07:15:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2009/07/06/1517723.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2009/07/06/1517723.html"/></entry><entry><id>http://www.cnblogs.com/emosen/archive/2009/06/12/1502240.html</id><title type="text">编程十诫</title><summary type="text">1.- DRY: Don&amp;#8217;t repeat yourself.DRY 是一个最简单的法则，也是最容易被理解的。但它也可能是最难被应用的（因为要做到这样，我们需要在泛型设计上做相当的努力，这并不是一件容易的事）。它意味着，当我们在两个或多个地方的时候发现一些相似的代码的时候，我们需要把他们的共性抽象出来形一个唯一的新方法，并且改变现有的地方的代码让他们以一些合适的参数调用这个新的方法。D...</summary><published>2009-06-12T08:57:00Z</published><updated>2009-06-12T08:57:00Z</updated><author><name>Emosen</name><uri>http://www.cnblogs.com/emosen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/emosen/archive/2009/06/12/1502240.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/emosen/archive/2009/06/12/1502240.html"/></entry></feed>
