在sql server中插入文件

时间:2013-06-12 13:36:32

标签: sql-server file ms-word store

问候!

我在支持的系统上遇到了一些问题。 有一种情况是用户可以将他们的简历上传到数据库(MS SQL Server 2005),并且决定应用程序应该将这些文档存储在带有varbinary列的表中。我尝试了很多在互联网上找到的例子,但我无法弄清楚为什么应用程序不存储来自微软word文档(.doc)的字节。如果我尝试存储更新版本(.docx或xlsx)甚至是.txt,则功能完美无缺。

我尝试过将pdf文件存储在同一列中,但也没有用。 我想这是文档格式的东西,我不知道

你们可以帮忙吗?我迫切希望找到一个解决方案。

这是我为我的表创建的脚本:

CREATE TABLE [dbo].[resumes](
    [id_professional] [int] NOT NULL,
[professional_name] [varchar](50)  NULL,
[file_type] [varchar](50) NULL,
[data] [varbinary](max)  NULL,
CONSTRAINT [PK_resumes] PRIMARY KEY CLUSTERED 
(
    id_professional] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

这是我正在尝试使用的代码:

foreach (string upload in Request.Files)
{
    //create byte array of size equal to file input stream
byte[] fileData = new byte[Request.Files[upload].InputStream.Length];
//add file input stream into byte array
Request.Files[upload].InputStream.Read(fileData, 0,
    Convert.ToInt32(Request.Files[upload].InputStream.Length));
//create system.data.linq object using byte array
System.Data.Linq.Binary binaryFile = new System.Data.Linq.Binary(fileData);

Resume objResume = new Resume()
objResume.data= binaryFile;

ResumeDAO.Save(objResume);
}

顺便说一句,我在这个应用程序中使用了linq to sql。

2 个答案:

答案 0 :(得分:0)

我觉得问题源于多字节编码。

像☃这样的unicode字符的“长度”是1,但字节数是6。

而不是

Convert.ToInt32(Request.Files[upload].InputStream.Length)

使用

Request.Files[upload].ContentLength

答案 1 :(得分:0)

单行将任何文件插入表格。 并且,一个写回硬盘的动态程序... 可能你正在寻找这个::

--FIRST CHANGE THE CONFIGURATION TO ACTIVATE THIS FEATURE
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ole Automation Procedures';
GO
---------------------------------------------------------

--HOW TO WRITE FILES TO DIRECTLY SQL SERVER FROM DISC
CREATE TABLE [dbo].[tblTemp](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ImageType] [varchar] (10) NULL,
[ImageFile] [image] NULL
) ON [PRIMARY]

Insert [tblTemp] (ImageFile) Select '.PDF',BulkColumn from Openrowset( Bulk 'C:\mak\A.PDF', Single_Blob) as tb
-----------------------------------------------------

--HOW TO WRITE FILE TO DISC FROM SQL SERVER
--WriteBinaryToDisc 'C:\NEWF\','MAK','.PDF','DOC_TABLE','DOC_ID','DOC_IMAGE','WHERE DOC_ID=''25'''
ALTER PROCEDURE WriteBinaryToDisc 
(
@Path VARCHAR(255),
@Filename VARCHAR(100),
@FileExt VARCHAR(4),
@TblName varchar(50),
@IDField VARCHAR(50),
@ImageField VARCHAR(50),
@WHERE VARCHAR(300)
    )
AS
set nocount on
EXEC ('
DECLARE @SOURCEPATH VARBINARY(MAX),
@DESTPATH VARCHAR(MAX),
@ObjectToken INT,
@image_ID BIGINT

DECLARE IMGPATH CURSOR FAST_FORWARD FOR SELECT '+@ImageField+','+@IDField+' from     '+@TblName+' '+@WHERE+' 
OPEN IMGPATH

FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID

WHILE @@FETCH_STATUS = 0
BEGIN
SET @DESTPATH = '''+@Path+'\'+@Filename+'''+ CAST(@image_ID AS     varchar)+'''+@FileExt+'''

EXEC sp_OACreate ''ADODB.Stream'', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, ''Type'', 1
EXEC sp_OAMethod @ObjectToken, ''Open''
EXEC sp_OAMethod @ObjectToken, ''Write'', NULL, @SOURCEPATH
EXEC sp_OAMethod @ObjectToken, ''SaveToFile'', NULL, @DESTPATH, 2
EXEC sp_OAMethod @ObjectToken, ''Close''
EXEC sp_OADestroy @ObjectToken

FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID
END

CLOSE IMGPATH
DEALLOCATE IMGPATH
')
---------------------------------------------------------------

这里你需要做的是,首先将文件上传到服务器并通过修改作为你的要求来执行上面的语句。我使用图像数据类型,它支持任何文件。因此,存储扩展名以便稍后再次将其保存回hdd作为文件时,您可以再次附加该扩展名。