ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 各种类型文件在SQL Server中存储的解决方案

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

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

关系图如下
           

     图1存储文件的表
(2)创建存储过程
1.         写入数据库的存储过程
/************************************************************
*  Purpose: Test For UpLoad File To Sql Server                                                       *
*  Author:    登峰                                                                                                     *
*  Blog:  http://www.cnblogs.com/supercode                                                             *
*  Date:       2005-6-12                                                                                             *
*****************************************************************
/

 
CREATE proc  SetFileToDB
@_FileName  as  nvarchar(255= null,
@_FileType  as nvarchar(50= null
@_FileContent as image = null
@_FileSize as int =null,
@_FileUploader as nvarchar(50)=null,
@_UploadDate  as datetime =null,
@_Icon as nvarchar(50)=null
AS
 
--声明SQL变量
   declare @CreateTabSql as nvarchar(100);
 
--声明错误处理变量
   declare @CurrentError int
 
 
 
     
  
--  事务开始
    BEGIN TRANSACTION
   
--插入表
   insert  into FileLib(FName,FileType,FileContent,FileSize,FileUploader,UploadDate,Icon)
                               
values@_FileName,@_FileType,@_FileContent,@_FileSize,@_FileUploader,@_UploadDate,@_Icon)
 
 
 
   
select @CurrentError = @@Error
    
IF @CurrentError != 0
        
BEGIN
             
GOTO ERROR_HANDLER
        
END
  
-- 事务结束
    COMMIT TRANSACTION
 
 
-- 成功的话返回0
    RETURN 0
  ERROR_HANDLER:
        
ROLLBACK TRANSACTION
          
RETURN @CurrentError
GO
 
3. 逻辑层实现各种类型文件的自动转化
   引用这层的目的就是简要说明一下层次的问题,本来数据层也独立出来,但这文章的目的不在于此,所以附带而过,而且这逻辑层也非常简单,为了方便起见,把相关的类和操作都放在一起文件里
(3.1)定义文件实体类
class FileEntity
    
{
          
private int _ID;
          
private string _FileName;
          
private string _FileType;
          
private byte[] _FileContent;
          
private int _FileSize;
          
private string _FileUploader;
          
private DateTime _UploadDate;
          
private string _Icon;
        
        
#region 属性
 
        
public int ID
        
{
            
set{_ID=value;}
            
getreturn ID;}
        }

 
        
public string FileName
        
{
            
set{_FileName=value;}
            
getreturn _FileName;}
        }

 
        
public string FileType
        
{
            
set{_FileType=value;}
            
getreturn _FileType;}
        }

 
        
public byte[] FileContent
        
{
            
set{_FileContent=value;}
            
getreturn _FileContent;}
        }

 
        
public int FileSize
        
{
            
set{_FileSize=value;}
            
getreturn _FileSize;}
        }

 
        
public string FileUploader
        
{
            
set{_FileUploader=value;}
            
getreturn _FileUploader;}
        }

 
        
public DateTime UploadDate
        
请登录后发表评论 登录
全部评论

注册时间:2008-10-17

  • 博文量
    1319
  • 访问量
    2101494