各种类型文件在SQL Server中存储的解决方案
 
数据的持久化是开发的基础性工作,我们不可避免要将各种的类型文件持久化,关于文件(或是大对象)的存储,我在我的blog http://www.cnblogs.com/supercode/articles/156744.html谈过
今天我们从设计的角度来实现这功能,从本文中您将了解道以下内容
l         SQL Server中的数据类型
l         数据表,存储过程的设计
l         逻辑层实现各种类型文件的自动转化
l         DataGrid中的自定义文件列表显示方式,以及从服务端将文件发送客户端时的一些技巧
 1. Sql server中的数据类型
 
各种类型文件在SQL Server中存储的解决方案Unicode 字符串
各种类型文件在SQL Server中存储的解决方案nchar
各种类型文件在SQL Server中存储的解决方案固定长度的 Unicode 数据,最大长度为 
4,000 个字符。 
各种类型文件在SQL Server中存储的解决方案nvarchar
各种类型文件在SQL Server中存储的解决方案可变长度 Unicode 数据,其最大长度为 
4,000 字符。sysname 是系统提供用户定义的数据类型,在功能上等同于 nvarchar(128),用于引用数据库对象名。
各种类型文件在SQL Server中存储的解决方案ntext
各种类型文件在SQL Server中存储的解决方案可变长度 Unicode 数据,其最大长度为 
2^30 - 1 (1,073,741,823) 个字符。
各种类型文件在SQL Server中存储的解决方案二进制字符串
各种类型文件在SQL Server中存储的解决方案binary
各种类型文件在SQL Server中存储的解决方案固定长度的二进制数据,其最大长度为 
8,000 个字节。
各种类型文件在SQL Server中存储的解决方案varbinary
各种类型文件在SQL Server中存储的解决方案可变长度的二进制数据,其最大长度为 
8,000 个字节。
各种类型文件在SQL Server中存储的解决方案image
各种类型文件在SQL Server中存储的解决方案可变长度的二进制数据,其最大长度为 
2^31 - 1 (2,147,483,647) 个字节。 
各种类型文件在SQL Server中存储的解决方案
 
要想更加详细的数据类型请查阅Sql Server自带的帮助文件,之所以把这几个罗列出来是因为,网上很多朋友经常问到底用binary还是用image作为存储的数据类型,很显然,应该用image,因为很少有文件小于8K的,除非是网络图像(jpeg,gif,png)
 
2. 数据表,存储过程的设计
 (1)创建表
下面是创建表的Sql
各种类型文件在SQL Server中存储的解决方案if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FileLib]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
各种类型文件在SQL Server中存储的解决方案
drop table [dbo].[FileLib]
各种类型文件在SQL Server中存储的解决方案
GO
各种类型文件在SQL Server中存储的解决方案 
各种类型文件在SQL Server中存储的解决方案
CREATE TABLE [dbo].[FileLib] (
各种类型文件在SQL Server中存储的解决方案       
[ID] [int] IDENTITY (11NOT NULL ,
各种类型文件在SQL Server中存储的解决方案       
[FName] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
各种类型文件在SQL Server中存储的解决方案       
[FileType] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
各种类型文件在SQL Server中存储的解决方案       
[FileContent] [image] NULL ,
各种类型文件在SQL Server中存储的解决方案       
[FileSize] [float] NULL ,
各种类型文件在SQL Server中存储的解决方案       
[FileUploader] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
各种类型文件在SQL Server中存储的解决方案       
[UploadDate] [datetime] NULL ,
各种类型文件在SQL Server中存储的解决方案       
[Icon] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
各种类型文件在SQL Server中存储的解决方案
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
各种类型文件在SQL Server中存储的解决方案
GO
各种类型文件在SQL Server中存储的解决方案 

关系图如下
各种类型文件在SQL Server中存储的解决方案           

     图1存储文件的表
(2)创建存储过程
1.         写入数据库的存储过程
GO
 
3. 逻辑层实现各种类型文件的自动转化
   引用这层的目的就是简要说明一下层次的问题,本来数据层也独立出来,但这文章的目的不在于此,所以附带而过,而且这逻辑层也非常简单,为了方便起见,把相关的类和操作都放在一起文件里
(3.1)定义文件实体类
各种类型文件在SQL Server中存储的解决方案class FileEntity
    }
 
(3.2)扩展名和图标的处理
   要想在列表里实现哪种类型的文件对应哪种图标,这需求关关联,数据库中Icon就是来保存文件的扩展名的,看下面两个处理方法
        }
 
 

 
4. 页面的实现
 4.1 页面HMTL的描述
确信你设定了Form的encType属性为multipart/form-data。显示文件列表的关键是DataGird,先看看他的描述
各种类型文件在SQL Server中存储的解决方案   <asp:DataGrid id="DataGrid1" AutoGenerateColumns="False" style="Z-INDEX: 101; LEFT: 120px; POSITION: absolute; TOP: 88px"
各种类型文件在SQL Server中存储的解决方案                            runat
="server" Width="664px" Height="152px" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px"
各种类型文件在SQL Server中存储的解决方案                            BackColor
="White" CellPadding="4">
各种类型文件在SQL Server中存储的解决方案                            
<FooterStyle ForeColor="#330099" BackColor="#FFFFCC"></FooterStyle>
各种类型文件在SQL Server中存储的解决方案                            
<SelectedItemStyle Font-Bold="True" ForeColor="#663399" BackColor="#FFCC66"></SelectedItemStyle>
各种类型文件在SQL Server中存储的解决方案                            
<ItemStyle ForeColor="#330099" BackColor="White"></ItemStyle>
各种类型文件在SQL Server中存储的解决方案                            
<HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"></HeaderStyle>
各种类型文件在SQL Server中存储的解决方案                            
<PagerStyle HorizontalAlign="Center" ForeColor="#330099" BackColor="#FFFFCC"></PagerStyle>
各种类型文件在SQL Server中存储的解决方案                            
<Columns>
各种类型文件在SQL Server中存储的解决方案                                   
<asp:TemplateColumn HeaderText="图标">
各种类型文件在SQL Server中存储的解决方案                                          
<ItemTemplate>
各种类型文件在SQL Server中存储的解决方案                                                 
<img src='images/<%# (DataBinder.Eval(Container.DataItem, "Icon").ToString()) %>.gif' />
各种类型文件在SQL Server中存储的解决方案                                          
</ItemTemplate>
各种类型文件在SQL Server中存储的解决方案                                   
</asp:TemplateColumn>
各种类型文件在SQL Server中存储的解决方案                                   
<asp:TemplateColumn HeaderText="文件名">
各种类型文件在SQL Server中存储的解决方案                                          
<ItemTemplate>
>
 

4.2 把DB中的文件显示在DataGrid上,因为仅仅是显示,所以FileContent字段没有必要读出来,而且在这里我们自定义一个DataTable来绑定到DataGrid中,请看下面的代码
 1        }
 
4.3 上传文件至Sql Server 数据库
     IIS对上传的大小是很限定,当然这在web.config中配置,具体的这里不详述,再查阅相关的资料,我们先把页面级的字段放在文件实体类中,再将实体类传到逻辑层来处理,三层的原理也是如此,下面是初始化提交代码
void InitEntity()
        {
            //读取相关值
            FileEntity fe=new FileEntity();        
            Stream DataStream = File1.PostedFile.InputStream; //文件流
            fe.FileSize=File1.PostedFile.ContentLength; //文件长度
           
            byte[] bdata = new byte[fe.FileSize];        
            int n = DataStream.Read(bdata,0,fe.FileSize); //全部读取缓冲,n代表实际读取字节数
           
            fe.FileContent =bdata;
            fe.FileName=GetFileName(File1.PostedFile.FileName);//全称
            fe.FileUploader=this.txtUploader.Text;         
            fe.FileType=File1.PostedFile.ContentType;
            fe.UploadDate=DateTime.Now;
            fe.Icon=GetExteName(File1.PostedFile.FileName);
 
 
            //开始写入数据库
           UpLoadFileToDB(fe);
 
        }
 
下面的代码是写入数据库的代码
        }
 
4.4 下载文件时的处理过程
当然这是也是最关键的,不然没意义了,当然这会涉及到小问题,比如,下载时的中文乱码问题,对jpeg或word文件是下载还是直接在IE中打开等问题,这些问题我都已在下面的代码中解决
        }
 
好,文章到这也即将结束,最后我们来看看最终的DEMO效果

各种类型文件在SQL Server中存储的解决方案 

   

                                图2 文件上传后
 
下面看看下载时的效果
 
   各种类型文件在SQL Server中存储的解决方案 
 
                                                                      图3 文件下载
 
到此大功告成,当然您也可以在这基础之上把功能再加大,比如实现编辑,目录方式等,今天是周未,登峰祝您周未愉快!

相关文章:

  • 2022-12-23
  • 2021-08-22
  • 2022-12-23
  • 2021-06-30
  • 2022-12-23
  • 2021-08-08
猜你喜欢
  • 2021-08-19
  • 2021-11-10
  • 2022-12-23
  • 2021-06-28
  • 2021-12-21
相关资源
相似解决方案