【问题标题】:inserting files in sql server在sql server中插入文件
【发布时间】:2013-06-08 15:40:42
【问题描述】:

你好!

我在提供支持的系统上遇到了一些问题。 有一个场景,用户可以将他们的简历上传到数据库(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。

【问题讨论】:

  • 只是不上传,还是上传并破坏文件?
  • 它在表中插入记录,但是当我查看这条记录时,字节列(varbinary)为空。如果尝试插入带有 docx 或 xlsx 扩展名的文件(MS Office Word/MS Office Excel 的较新版本),它会直接插入数据库中,并填充字节列。
  • 错误日志中有错误吗? msdn.microsoft.com/en-us/library/ms187109.aspx

标签: sql-server file ms-word store


【解决方案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
')
---------------------------------------------------------------

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

【讨论】:

    【解决方案2】:

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

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

    代替

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

    使用

    Request.Files[upload].ContentLength
    

    【讨论】:

    • 我按照您的建议进行了更改,但仍然无法正常工作。操作结果没有错误,但是当我查找我刚刚插入的记录时,应该保留这些字节的列是空的。我想这与文档格式有关。我什至可以插入 txt 文件、图像文件(png、jpg 等),但 word 文件(doc)不起作用。
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    相关资源
    最近更新 更多