2013-06-12 1 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

멀티 바이트 인코딩으로 인한 문제가 있습니다.

Â와 같은 유니 코드 문자의 길이는 하나이지만 바이트 수는 6입니다. 대신

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로 저장하면 확장명을 다시 저장할 수 있습니다.

관련 문제