mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
dev
dev

Android模拟器快捷键

  Home键(小房子键) 在键盘上映射的就是home键,这倒是很好记。 Menu键 用于打开菜单的按键,在键盘上映射的是F2键,PgUp键同样可以。另外,看英文原文的意思,貌似这个键在某些机型上会被设计为左软件(left softkey) Start键 这个键在模拟器和G1真机上我都没有找到到底是哪个键。映射的是Shift+F2或PgDn,某些机型会被设计为右软键(right softkey)。 Back键 返回键,用户返回上一个UI或者退出当前程序。键盘上映射ESC键。 Call/Dial键(电话键) 接听来电或启动拨号面板,这是一部手机最基本的功能键。PC键盘映射为F3键。 Hangup/Light Off键(挂机键) 挂断电话或关闭背灯用。键盘映射F4键。 Search键 在提供了Search功能的应用里快速打开Search对话框,比如在Browser里可以快速打开地址搜索栏。键盘映射F5。 Power Down键(关闭电源) 对应模拟器左上边缘的电源按钮,不过似乎在模拟器上按这个键并没什么用处。键盘映射F7。 Volume Up (增大音量) 键盘映射Ctrl+5,也可以使用小数字键盘的”+”键。 Volume Down(减小音量) 键盘映射Ctrl+6,也可以使用小数字键盘的”-”键。 Camera 键 键盘映射Ctrl+F3。不过也许是我设置有问题,在模拟上用这个快捷键似乎没任何反应。

2011-02-19 0comments 129hotness 0likes mikebai Read all
dev

SQL2005表结构一览SQL文

SELECT  *FROM    syscolumnsWHERE   id = OBJECT_ID('fs_ads_stat')ORDER BY colorder ASC SELECT    --A.id,        表名 = D.NAME ,  --表名 = CASE WHEN A.COLORDER = 1 THEN D.NAME  --           ELSE ' '  --           END ,        字段序号 = A.COLORDER ,        字段名 = A.NAME ,        标识 = CASE WHEN COLUMNPROPERTY(A.ID, A.NAME, 'ISIDENTITY ') = 1                  THEN '√ '                  ELSE ' '             END ,        主键 = CASE WHEN EXISTS ( SELECT  1                                FROM    SYSOBJECTS                                WHERE   XTYPE = 'PK '                                        AND PARENT_OBJ = A.ID                                        AND NAME IN (                                        SELECT  NAME                                        FROM    SYSINDEXES                                        WHERE   INDID IN (                                                SELECT  INDID                                                FROM    SYSINDEXKEYS                                                WHERE   ID = A.ID                                  

2010-09-21 0comments 121hotness 0likes mikebai Read all
dev

文本框获得焦点并删除原内容

如果文本框内已经有用户输入的内容了,那么就不应该进行清除文本款内容这个动作了。 blueprince给出了如下代码:<script type="text/javascript">function OnEnter( field ) { if( field.value == field.defaultValue ) { field.value = ""; } }function OnExit( field ) { if( field.value == "" ) { field.value = field.defaultValue; } }</script><input type=text value="预设文字" onmouseover="this.focus(); OnEnter(this)" onmouseout="this.blur(); OnExit(this)"> 不过上面的代码有一个非常奇怪的行为,就是当鼠标移出文本框后,文本框就会失去焦点,从而造成用户输入无效,应该是由OnExit函数造成的。而浏览器的默认行为应该是:只要用户不点击页面其它部分或者是按tab键,已经获得焦点的表单就不应该失去焦点。我们稍微修改一下代码就可以让文本框的行为回归正常,效果和代码如下:<script type="text/javascript">function OnEnter(field){ field.focus(); if(field.value == field.defaultValue){ field.value = ""; } }function OnExit(field){ if(field.value == ""){ field.value = field.defaultValue; } field.focus();}</script>

2010-04-16 0comments 126hotness 0likes mikebai Read all
dev

SQLServer2005常用服务、数据库创建的相关内容

一、SQL Server 2005常用服务查看服务:右击我的电脑--管理--服务和应用程序--服务1、SQL Server(MS SQL Server):SQL Server的核心服务,引擎,此服务停止后,SQL Server则无法使用说明:MS SQL Server为实例,表示每个服务都有自己的服务2、SQL Server Active Directory Helper:与AD(Active Directory活动目录)集成服务3、SQL Server Agent(MS SQL Server):代理服务4、SQL Server Analysis Services(MS SQL Server):分析服务,(OLAP)联机分析(SQL Server 2005新增)5、SQL Server Browser:SQL Server浏览服务6、SQL Server FullText Search(MS SQL Server):SQL Server全文检索7、SQL Server Integration Services:集成服务与(OLAP)一起来用(SQL Server 2005新增)8、SQL Server Reporting Services(MS SQL Server):报表服务(SQL Server 2005新增)9、SQL Server Vss Write:卷影服务(VSS编辑器)说明:A、掌握如何启动、暂停、停止核心服务:停止:断开所有的用户连接暂停:不允许新用户的连接,但如果已经连接可以继续使用B、SQL Server的启动过程:开始 -- 程序 -- Microsoft SQL Server 2005 -- SQL Server Management Studio(SSMS)C、SQL Server身份验证:登录名:Sa -- SQL Server的管理员密码:dufei 二、数据库1、图形界面:右击数据库--新建数据库--数据库名称--确定2、系统自带数据库:master:核心数据库,存放系统的配置信息model:模板数据库,为用户数据库提供一个原始数据msdb:代理服务数据库,为代理、任务、作业提供一个临时的存储空间tempdb:临时数据库,存放的是一些临时数据ReportServer:用于存放报表服务的数据库ReportServerTempDB:报表服务临时数据库说明:从C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data里面可删除数据库的内容3、示例数据库的安装:菜单栏CD--Capture ISO Image ... -- 放入SQL Server 2005企业版的第二张盘 -- 安装好后取消--开始 -- 设置--控制面板--添加或删除程序--Microsoft SQL Server 2005--更改--工作站组件--更改已安装的组件--4、任何一个数据库由数据文件和事务日志文件组成数据文件:用于存放具体数据,扩展名为.mdf事务日志文件:用于存放用户对数据库的操作(如增加、删除、更新),扩展名为.ldf 说明:A、网络版区分于单机版的一个重要特点--事务B、事务示例:原子性--不可分割,如银行转帐一致性--数据的一致性,如意太得香肠病毒、银行的秘密帐号、word中输入“胡”字、Excel表格中的塞车游戏隔离性--事务之间具有隔离性永久性--事务对数据的操作永久生效 三、SQL命令1、新建查询:创建数据库:语法:create database 数据库名称on(数据文件)log on(事务日志文件)具体语法:create database 数据库名称on(name = '数据文件逻辑名',filename = '数据文件的路径及全称',size = 初始大小,maxsize = 最大容量, filegrowth = 递增量)log on(name = '事务日志文件逻辑名',filename = '事务日志文件的路径及全称',size = 初始大小,maxsize = 最大容量,filegrowth = 递增量)实例:创建数据库 dufeicreate database dufeion(name = 'dufei_data',filename = 'C:\SQL2005\dufei.mdf',size = 5mb,maxsize = 10mb,filegrowth = 5mb )log on(name = 'dufei_log',filename = 'C:\sql2005\dufei.ldf',size = 1mb,maxsize = 50mb,filegrowth = 5mb ) 2、最简单的语法:create database 数据库名称示例:创建数据库 db3 、db4、db5 create database db3 create database db4on(name = 'db4_date',filename = 'c:\sql2005\db4.mdf', ) create database db5on(name = 'db5_data',filename = 'c:\sql2005\db5.mdf',size = 3mb, --这里的大小要大于或等于model的大小 maxsize = 10mb,filegrowth = 5mb ) 说明:默认情况:一个数据文件、一个事务日志多个数据文件及多个事务日志文件好处:提高效率实例:创建一个数据库:dufei有两个数据文件两个事务日志文件图形界面:命令方式:说明:有多个数据文件时,主数据文件的扩展名为.mdf,次数据文件的扩展名为.ndfdrop database dufei --去掉文件实例:create database dufeion(name = 'dufei01_data',filename = 'c:\sql2005\dufei01.mdf',size = 5mb,maxsize = 100mb,filegrowth = 5mb ) ,(name = 'dufei02_data',filename = 'c:\sql2005\dufei02.ndf',size = 6mb,maxsize = 50mb,filegrowth = 5mb ) log on(name ='dufei03_log',filename='c:\sql2005\dufei03.ldf',size = 4mb,maxsize = 50mb,filegrowth = 5mb ),(name = 'dufei04_log',filename = 'c:\sql2005\dufei04.ldf',size = 4mb,maxsize = 50mb,filegrowth = 5mb )3、一个数据库可以由多个数据文件和多个事务日志文件:主数据文件 .mdf次数据文件 .ndf事务日志文件 .ldf4、默认的文件组:primary 主文件组,所有的数据文件默认都在此文件组5、实例:创建一个数据库,由三个文件组primary、fg1、fg2primary 文件组有一个数据文件fg1、fg2文件组有两个数据文件,一个事务日志文件使用命令:create database dufeion(name = 'dufei_data',filename = 'c:\sql2005\dufei.mdf',size = 10mb,maxsize = 100mb,filegrowth = 5mb ) ,filegroup fg1 --增加一个文件组(name = 'dufeifg1_1_data',filename = 'c:\sql2005\dufeifg1_1.ndf',size = 20mb,maxsize = 50mb,filegrowth = 10%

2010-04-13 0comments 106hotness 0likes mikebai Read all
dev

日志处理

--最好备份日志,以后可通过日志恢复数据。。。以下为日志处理方法一般不建议做第4,6两步第4步不安全,有可能损坏数据库或丢失数据第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.--*/--下面的所有库名都指你要处理的数据库的库名1.清空日志DUMP TRANSACTION 库名 WITH NO_LOG2.截断事务日志:BACKUP LOG 库名 WITH NO_LOG3.收缩数据库文件(如果不压缩,数据库的文件不会减小企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了也可以用SQL语句来完成 --收缩数据库DBCC SHRINKDATABASE(库名)--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfilesDBCC SHRINKFILE(1)4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)a.分离数据库:企业管理器--服务器--数据库--右键--分离数据库b.在我的电脑中删除LOG文件c.附加数据库:企业管理器--服务器--数据库--右键--附加数据库此法将生成新的LOG,大小只有500多K或用代码: 下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。a.分离EXEC sp_detach_db @dbname = '库名'b.删除日志文件c.再附加EXEC sp_attach_single_file_db @dbname = '库名'

2010-04-13 0comments 122hotness 0likes mikebai Read all
dev

ECT 与 SET 对变量赋值的区别(存储过程)

SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT。对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种方式还是有很多差别的。 SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。 下表列出 SET 与 SELECT 的区别。请特别注意红色部分。 set select 同时对多个变量同时赋值 不支持 支持 表达式返回多个值时 出错 将返回的最后一个值赋给变量 表达式未返回值 变量被赋null值 变量保持原值 下面以具体示例来说明问题: create table chinadba1(userid int ,addr varchar(128) )goinsert into chinadba1(userid,addr) values(1,'addr1')insert into chinadba1(userid,addr) values(2,'addr2')insert into chinadba1(userid,addr) values(3,'addr3')go表达式返回多个值时,使用 SET 赋值 declare @addr varchar(128)set @addr = (select addr from chinadba1)/*--出错信息为服务器: 消息 512,级别 16,状态 1,行 2子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。*/go表达式返回多个值时,使用 SELECT 赋值 declare @addr varchar(128)select @addr = addr from chinadba1print @addr --结果集中最后一个 addr 列的值--结果: addr3 go表达式未返回值时,使用 SET 赋值 declare @addr varchar(128)set @addr = '初始值'set @addr = (select addr from chinadba1 where userid = 4 )print @addr --null值 go表达式未返回值时,使用 SELECT 赋值 declare @addr varchar(128)set @addr = '初始值'select @addr = addr from chinadba1 where userid = 4print @addr --保持原值go 需要注意的是,SELECT 也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为 null 值。此时与 使用 SET 赋值是完全相同的对标量子查询的概念大家应该都觉得陌生,举个例子就能说明 declare @addr varchar(128)set @addr = '初始值'--select addr from chinadba1 where userid = 4 为标量子查询语句select @addr = (select addr from chinadba1 where userid = 4) print

2010-04-09 0comments 111hotness 0likes mikebai Read all
dev

[原创]SQL2005分页用存储过程

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER PROC [dbo].[Proc_Paging2005]    @SqlAllFields NVARCHAR(MAX) ,--所有字段    @SqlTablesAndWhere NVARCHAR(MAX) ,--from 之后的 order 之前的部分    @OrderFields NVARCHAR(MAX) ,--排序用字段    @PageSize INT ,--每页显示的数量    @PageIndex INT OUTPUT ,--要显示的页码,设置为OUTPUT用于判断请求页码的有效性    @RecordCount INT OUTPUT ,--总记录数    @PageCount INT OUTPUT --总页数AS     DECLARE @sql NVARCHAR(MAX)    SET @sql = 'SELECT @RecordCount = count(*) from ' + @SqlTablesAndWhere ;    EXEC sp_executesql @sql, N'@RecordCount int output', @RecordCount OUTPUT ;  --获得总页数    IF @RecordCount % @PageSize = 0         SET @PageCount = @RecordCount / @PageSize ;    ELSE         SET @PageCount = @RecordCount / @PageSize + 1 ;          --判断当前页码    SET @PageIndex = ISNULL(@PageIndex, 1) ;    IF @PageIndex > @PageCount         SET @PageIndex = @PageCount ;    IF @PageIndex < 1         SET @PageIndex = 1 ;     DECLARE @start_row_num AS INT ;    DECLARE @end_row_num AS INT ;    SET @start_row_num = ( ( @PageIndex - 1 ) * @PageSize ) + 1 ;    SET @end_row_num = ( @start_row_num + @PageSize ) - 1 ;     SET @sql = 'select * from (select row_number() over (' + @OrderFields        + ') as RowNumber,' + @SqlAllFields + ' from ' + @SqlTablesAndWhere        + ') as temptable where RowNumber between ' + STR(@start_row_num)        + ' and ' + STR(@end_row_num)     EXECUTE(@sql)    

2010-04-08 0comments 134hotness 0likes mikebai Read all
dev

获取影响行数和ID的存储过程

方法一:  1DECLARE @SQL NVARCHAR(256) 2DECLARE @ReturnID INT 3 4SET @SQL = 'SELECT [InfoID] FROM TM_TeachInfo WHERE [CourseID]=1 and [infosort]=1' 5 6EXEC(@SQL) 7 8SELECT @ReturnID = @@Rowcount

2010-04-08 0comments 103hotness 0likes mikebai Read all
dev

使用Visual Studio 2008 开发php

过年了,想趁的这段长假期间,抽空研究一下wordpress源码。以前编辑php代码,都是用editplus,editplus小巧,支持php高亮语法,编写小的php程序还是很不错,不过研究源码最需要是可以调试、跟踪源码,这点显然editplus就做不到了。在开发工具中,我用的最多的就是Visual Studio的,有没有办法可以用Visual Studio 来编译调试php呢?google了一下,嗯,发现了一个工具:vs.php,下载试用一下,感觉不错。vs.php 是Visual Studio的插件 分三个版本:VS.Php for Visual Studio 2008 、VS.Php for Visual Studio 2005和VS.Php Standalone Edition,前面两个版本安装Visual Studio 2008或 Visual Studio 2005的用户,最后一个版本适合没有安装Visual Studio的用户或安装了Visual Studio 2005以下版本的用户。在编写、调试php方面非常适合经常使用Visual Studio的程序员,很平滑的过渡到php开发。为什么这么说呢?1、强大php编辑器:支持php语法高亮是最基本的。自动创建文档注释php语法智能提示数组智能提示代码折叠、大纲查看代码块2、灵活编译、调试功能。支持php调试支持javascript调试支持dbg和xdebug两种调试引擎支持php4和php5两种运行环境3、程序结构基于项目和开发有关net的项目非常类似,基于项目的形式组织程序vs.php 调试php程序,会启动Apache web服务器,同时会把运行的IE进程临时添加到项目里来进行调试运行。 整个调试的过程,对net程序员来说,没有什么难度。对于已经开发好的php,可以按本来的目录形式组织成项目文件,以wordpress代码为例,在vs2008里步骤如下:1、菜单:文件+php project from existing code2、选择路径wordpress程序3、选择项目类型和运行环境4、选择项目包含的目录。添加完成后,如下图所示:不错吧,有兴趣下载来试试。试用版只有30天试用期,正式版要99.99美刀呢。下载的地址:http://www.jcxsoftware.com/download.php

2010-03-19 0comments 119hotness 0likes mikebai Read all
dev

小议SQL Server主键和自动编号问题[转载]

  所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。  当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。  常见的数据库主键选取方式有:  ◆自动增长字段  ◆手动增长字段  ◆UniqueIdentifier  ◆“COMB(Combine)”类型  一、自动增长型字段  很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主键键值。  尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:  Order(OrderID, OrderDate)  OrderDetial(OrderID, LineNum, ProductID, Price)  Order 表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:  首先,为了能在 OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个 OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。  听棠.NET指出:主档放在事务中提交时,通过@@IDENTITY 就可以取到生成值的,因此可以传给明细当外键用,而且在事务发生错误回滚时,主档记录也会被回滚取消的。  吕震宇补充:使用自动增长字段会增加网络的roundTrip。尽管可以使用@@IDENTITY取得主键的值,但在更新过程中,不得不增加一次数据往返(以C/S结构为例):  1、客户端发送开始事务命令  2、客户端提交主表更新  3、服务器返回@@IDENTITY  4、客户端根据返回的主键更新从表缓冲  5、客户端将从表提交服务器更新  6、客户端提交事务  在这里多了一次往返就会增加了事务处理的时间。降低并发性能。  如果不用自动增长型字段,将是以下情景:  1、客户端发送开始事务命令  2、客户端提交主表更新  3、客户端提交从表更新  4、客户端提交事务  因此我不赞成使用自动增长型字段作为主键与外键链接的纽带。  除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?  ADO.NET允许我们在 DataSet中将某一个字段设置为自动增长型字段,但千万记住,这个自动增长字段仅仅是个占位符而已,当数据库进行更新时,数据库生成的值会自动取代 ADO.NET分配的值。所以为了防止用户产生误解,建议大家将ADO.NET中的自动增长初始值以及增量都设置成-1。此外,在ADO.NET中,我们可以为两张表建立DataRelation,这样存在级联关系的两张表更新时,一张表更新后另外一张表对应键的值也会自动发生变化,这会大大减少了我们对存在级联关系的两表间更新时自动增长型字段带来的麻烦。  二、手动增长型字段  既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个 KeyName,就可以知道目前的KeyValue是什么,然后手工实现键值数据递增。在SQL Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:CREATE PROCEDURE [GetKey]  @KeyName char(10), @KeyValue int OUTPUT AS UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName GO  这样,通过调用存储过程,我们可以获得最新键值,确保不会出现重复。若将OrderID字段设置为手动增长型字段,我们的程序可以由以下几步来实现:首先调用存储过程,获得一个OrderID,然后使用这个OrderID填充Order表与OrderDetail表,最后在事务保护下对两表进行更新。  使用手动增长型字段作为主键在进行数据库间数据复制时,可以确保数据合并过程中不会出现键值冲突,只要我们为不同的数据库分配不同的主键取值段就行了。但是,使用手动增长型字段会增加网络的RoundTrip,我们必须通过增加一次数据库访问来获取当前主键键值,这会增加网络和数据库的负载,当处于一个低速或断开的网络环境中时,这种做法会有很大的弊端。同时,手工维护主键还要考虑并发冲突等种种因素,这更会增加系统的复杂程度。  三、使用UniqueIdentifier  SQL Server为我们提供了UniqueIdentifier数据类型,并提供了一个生成函数NEWID( ),使用NEWID( )可以生成一个唯一的UniqueIdentifier。UniqueIdentifier在数据库中占用16个字节,出现重复的概率非常小,以至于可以认为是0。我们经常从注册表中看到类似{45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}的东西实际上就是一个UniqueIdentifier,Windows用它来做COM组件以及接口的标识,防止出现重复。在.NET里管UniqueIdentifier称之为GUID(Global Unique Identifier)。在C#中可以使用如下命令生成一个GUID:Guid u = System.Guid.NewGuid();   对于上面提到的Order与OrderDetail的程序,如果选用UniqueIdentifier作为主键的话,我们完全可以避免上面提到的增加网络 RoundTrip的问题。通过程序直接生成GUID填充主键,不用考虑是否会出现重复。  UniqueIdentifier 字段也存在严重的缺陷:首先,它的长度是16字节,是整数的4倍长,会占用大量存储空间。更为严重的是,UniqueIdentifier的生成毫无规律可言,要想在上面建立索引(绝大多数数据库在主键上都有索引)是一个非常耗时的操作。有人做过实验,插入同样的数据量,使用 UniqueIdentifier型数据做主键要比使用Integer型数据慢,所以,出于效率考虑,尽可能避免使用UniqueIdentifier型数据库作为主键键值。  四、使用“COMB(Combine)”类型  既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以解决呢?答案是肯定的。通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的),可以在三者之间找到一个很好的平衡点。  COMB 数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与 UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心 UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:DECLARE @aGuid UNIQUEIDENTIFIER  SET @aGui

2010-03-11 0comments 116hotness 0likes mikebai Read all
1…2122232425

Recent Posts

  • c# winform适配高dpi
  • com.microsoft.sqlserver.jdbc.SQLServerException “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server建立安全连接
  • java -cp 用法介绍
  • HTML 容器元素
  • MVC的cshtml的介绍

Recent Comments

No comments to show.

COPYRIGHT © 2025 mikebai.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang