2013-06-12 4 views
1

приветствия!Вставка файлов в sql-сервер

У меня возникли проблемы с системой, которую я поддерживаю. Существует сценарий, в котором пользователи могут загружать свое резюме в базу данных (MS SQL Server 2005), и было решено, что приложение должно хранить эти документы в таблице с столбцом varbinary. Я пробовал множество примеров, найденных в Интернете, но я не могу понять, почему приложение не хранит байты из документа 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 к sql в этом приложении.

+0

Он просто не загружается, или он загружает и качает файл? –

+0

Вставляет запись в таблицу, но когда я смотрю эту запись, столбец байтов (varbinary) пуст. Если вы пытаетесь вставить файлы с расширениями docx или xlsx (более новая версия MS Office Word/MS Office Excel), она вставляется прямо в базу данных с заполненным байтом. – TuLePe

+0

Любые ошибки в журнале ошибок? http://msdn.microsoft.com/en-us/library/ms187109.aspx –

ответ

0

У меня возникло чувство, связанное с многобайтовой кодировкой.

«Длина» символа юникода, такого как ☃, равна единице, но число байтов равно шестью.

Вместо

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

использования

Request.Files[upload].ContentLength 
+0

Я изменил, как вы мне предложили, но он все еще не работает. Результат действия работает без ошибок, но когда я ищу запись, которую я только что вставлял, столбец, который должен содержать эти байты, пуст. Я думаю, что это что-то вроде формата документа. Я даже могу вставить файлы txt, файлы изображений (png, jpg и т. Д.), Но файлы слов (doc) просто не работают. – TuLePe

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 '[email protected]+','[email protected]+' from  '[email protected]+' '[email protected]+' 
OPEN IMGPATH 

FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @DESTPATH = '''[email protected]+'\'[email protected]+'''+ CAST(@image_ID AS  varchar)+'''[email protected]+''' 

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

Вот что вам нужно сделать, это, первый загрузить файл на сервер и выполнение заявление выше, изменив ваше требование. Im использует тип данных изображения, который поддерживает любой файл. Итак, сохраните расширение так позже, когда вы снова сохраните его обратно в hdd как файл, вы можете снова добавить это расширение.

Смежные вопросы