首页 > 代码库 > GridView控件通过bit值显示复选框状态

GridView控件通过bit值显示复选框状态

                前几天用VS2013做了一个Asp.net下用GridView控件显示数据选中状态的小例子,引发了关于bit的一些新认识。


     先简单说说我这个例子吧。

     在VS里新建一个web窗体,然后拖入一个GridView控件,绑定Sql Server数据库里的数据源,再通过设置模板添加一个新列。在这个列中加入一个CheckBox控件,然后绑定到数据库里的字段。

     开始我设置这个字段的类型为varchar,字段的值为True、False等。绑定后却无法达到想要的效果,即F5后网页内数据库isText字段值为True的数据行没有默认被选中。

     网上查了一下,原来是isText字段类型的问题,要把varchar改成bit。表示不理解。

     原来做项目或例子时,从来也没用过bit类型,更没想过要把身为布尔值的True或False改为bit型。

     那么,为什么要改了它呢?

     这要从bit类型说起。

     位数据类型用bit关键字声明,位类型数据只有两种取值:0和1。在输入0以外的其他值时,系统均把它们当作1看待。这种数据类型常作为逻辑变量使用,用来表示真、假或是、否等二值选择。

     在SQL Server2008中可以直接使用True/False作为bit列的输入值,SQL Server会自动把输入的True/False转换为1/0。

            我们看一个例子:

     

Declare @var1 bit, @var2 bit 
set @var1 = 10 
set @var2 = 0 
select '@var1 ' = @var1, '@var2 ' = @var2 
其执行结果为: 
@var1 @var2 
1 0 


                所以,我们原来经常用的varchar是不合理的。

     注:在Sql Server2000中,没有布尔值,bit只有0,1,null三种情況。

     那么,用bit作为逻辑判断数据类型有什么好处?

     首先,bit类型本身表示1位,作为单独的个体存在的话,最多占用一字节,最少占用一位。有人可能会产生疑问,怎么还最多最少的?同一类型的数据在数据库中所占的空间难道不固定?

 

     不得不说,要是这么想就对了。那么bit在数据库中是怎么存在的?怎么能体现出它的节省空间特点来?仅仅因为它所需空间小?


     下面我们看看SqlServer数据库是怎么存储bit类型数据的。   

     实际上SQL Server BIT类型占用的空间与BIT类型的列所在表的位置有关,有些情况下BIT占用了一个字节,有些情况下BIT实际占用了几个位(几个BIT类型的列共用一个字节)。

     下面就来具体分析一下:

     1、单独的BIT类型的列将占用一个字节,即一个BIT类型的列的左边定长列和右边定长列都不是BIT类型。  

     示例:int(定长列)  bit   char(定长列)
 
     SQL Server在存储表中的数据时先是将表中的列按照原有顺序分为定长和变长(变长就是长度不固定的数据类型,如varchar,nvarchar,varbinary等)两组。在数据页中存储数据时先存储所有定长的数据,然后再存储变长的数据。

     这里由于bit列的左边是int类型,右边是char类型,都是定长的,而且不是SQL Server BIT类型,所以int和char之间必须留出一个字节来存储bit,虽然它只用到了其中的一个位。

 

     2.多个BIT类型的列之间使用变长数据类型列分开,则去掉变长列,然后看它们保持连续的列的个数,每列占用一个位,如果多于8列那就再占用更多的字节。

     示例:bit  varchar(变长) bit  nvarchar(变长) bit  int(定长)
     这里将变长列筛选出来后就变成了bit、bit、bit、int,有3个BIT类型列是连续的,所以这三个将公用一个字节。

 

     3.一个表中有多个SQL Server BIT类型的列,其顺序是否连续决定了它们是否可以共享一个字节。SQL Server中按照列顺序存储,第一列和最后一列都是BIT数据类型列,不可以共用一个字节。

     也就是说下面的表t1和表t2占用的空间是不同的,t1数据占用了7字节,t2数据占用了8字节。

    

CREATE TABLE t1   
(   
a INT PRIMARY KEY,   
b BIT NOT NULL,   
c BIT NOT NULL,   
d CHAR(2) NOT NULL   
)   
CREATE TABLE t2   
(   
a INT PRIMARY KEY,   
b BIT NOT NULL,   
c CHAR(2) NOT NULL,   
d BIT NOT NULL   
) 


 
            但是在下面的t3和t4表中,由于中间是变长数据类型,所以他们的BIT列占用的数据空间是相同的。

 

CREATE TABLE t3  
(   
a INT NOT NULL,   
b BIT NOT NULL,   
c VARCHAR(2) NOT NULL,   
d BIT NOT NULL   
)   
CREATE TABLE t4   
(   
a INT NOT NULL,   
b BIT NOT NULL,   
c BIT NOT NULL,   
d VARCHAR(2) NOT NULL   
)  


 

    以上的相关内容就是对SQL Server bit类型到底占用了多少空间的介绍,望你能有所收获。

  

GridView控件通过bit值显示复选框状态