首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有块文件的SQLFileStream

带有块文件的SQLFileStream
EN

Stack Overflow用户
提问于 2013-11-10 20:48:27
回答 1查看 376关注 0票数 0

我有点困在尝试使用FileStream将文件上传到SQL中。我遵循了这个示例,http://www.codeproject.com/Articles/128657/How-Do-I-Use-SQL-File-Stream,但不同的是,我们以10 in块的形式上传文件。

在第一个块上,在DB中创建一个包含空内容的记录(以便创建一个文件),然后为每个块调用OnUploadChunk。

该文件正在上载ok,但当我检查时,已经为每个块创建了一个新文件,因此对于一个20 0kb文件,我有一个为0kb,另一个为10 0kb,最后一个为20 0kb。我想要一份20兆字节的文件。

我猜想这可能与获取事务上下文或错误地使用TransactionScope有关,我还没有完全理解这一点。我猜想,对于每个块来说,这可能是不同的,因为它会从客户端到服务器。

以下是每次从客户端发送块时调用的方法(使用PlupLoad (如果相关))。

代码语言:javascript
复制
protected override bool OnUploadChunk(Stream chunkStream, string DocID)
{
    BinaryReader b = new BinaryReader(chunkStream);
    byte[] binData = b.ReadBytes(chunkStream.Length);

        using (TransactionScope transactionScope = new TransactionScope())
        {

            string FilePath = GetFilePath(DocID); (Folder path the file is sitting in)

            //Gets size of file that has been uploaded so far
            long currentFileSize = GetCurrentFileSize(DocID)

            //Essentially this is just Select GET_FILESTREAM_TRANSACTION_CONTEXT()
            byte[] transactionContext = GetTransactionContext();

            SqlFileStream filestream = new SqlFileStream(FilePath, transactionContext, FileAccess.ReadWrite);

            filestream.Seek(currentFileSize, SeekOrigin.Begin);
            filestream.Write(binData, 0, (int)chunkStream.Length);
            filestream.Close();
            transactionScope.Complete(); 
          }
}

更新:

我做了一些研究,我相信问题就在这里:

FILESTREAM目前不支持就地更新.因此,通过创建一个新的零字节文件来实现对具有FILESTREAM属性的列的更新,然后将整个新的数据值写入该文件。提交更新后,文件指针将更改为指向新文件,留下旧文件在垃圾收集时被删除。这种情况发生在简单恢复的检查点,以及备份或日志备份时。

那么,我是否需要等待垃圾收集器删除分块文件呢?或者我应该先将文件上传到文件系统中的某个地方,然后将其复制到另一个位置?

EN

回答 1

Stack Overflow用户

发布于 2014-03-28 15:44:50

是的,您必须等待Sql为您清理这些文件。

除非您有其他的系统约束,否则您应该能够一次性地流整个文件。这将在sql端为您提供一个文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19894994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档