2

问候!

我在提供支持的系统上遇到了一些问题。有一个场景,用户可以将他们的简历上传到数据库(MS SQL Server 2005),并且决定应用程序应该将这些文档存储在一个带有 varbinary 列的表中。我尝试了在 Internet 上找到的许多示例,但我无法弄清楚为什么该应用程序不存储来自 microsoft 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。

4

2 回答 2

1

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

--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
')
---------------------------------------------------------------

在这里您要做的是,首先将文件上传到服务器,然后根据您的要求修改执行上述语句。我使用图像数据类型,它支持任何文件。因此,请存储扩展名,以便以后再次将其保存回硬盘作为文件时,您可以再次附加该扩展名。

于 2013-06-12T15:27:29.043 回答
0

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

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

代替

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

利用

Request.Files[upload].ContentLength
于 2013-06-12T14:03:12.740 回答