当前位置: 首页 > 面试题库 >

使用SQL Filestream时出现OutOfMemoryException

韩博简
2023-03-14
问题内容

我正在尝试将一个约600 MB的zip文件上传到SQL 2008
FILESTREAM表,但出现OutOfMemoryException。我使用一个SqlFileStream类上传的文件(在本教程中描述-
http://www.aghausman.net/dotnet/saving-and-retrieving-file-using-filestream-
sql-server-2008.html
。如果有问题,我有一台具有4GB内存的32位Vista计算机,并且正在使用VS 2010,Entity Framework 4。

这是我的代码段-

public static void AddItem(RepositoryFile repository)
    {
        var contents = repository.Data; // I get the exception at this line.
        repository.Data = System.Text.Encoding.ASCII.GetBytes("0x00");

        using (var scope = new TransactionScope())
        {
            using (var db = new MyEntities())
            {
                db.RepositoryTable.AddObject(repository);
                db.SaveChanges();
            }

            using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            using (var cmd = new SqlCommand("SELECT Data.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM dbo.RepositoryTable", con))
            {
                cmd.Connection.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var path = reader.GetString(0);
                        var transactionContext = reader.GetSqlBytes(1).Buffer;
                        var fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write);

                        fileStream.Write(contents, 0, contents.Length);
                        fileStream.Close();
                    }
                }
            }

            scope.Complete();
        }
    }

如何上传文件而没有任何错误?

谢谢!


问题答案:

我发现了问题。这是我的代码-

private void AddFile()
    {
        if (!fupFile.HasFile)
        {
            lblMessage.Text = "Please select a file.";                
            return;
        }

        var data = new byte[(int) fupFile.FileContent.Length];
        fupFile.FileContent.Read(data, 0, data.Length);

        if (fupFile.FileContent.Length > 0)
        {
            var repositoryFile = new Repository
                                     {
                                         ID = Guid.NewGuid(),
                                         Name = Path.GetFileName(fupFile.PostedFile.FileName),                                             
                                         Data = System.Text.Encoding.ASCII.GetBytes("0x00")
                                     };

            RepositoryController.AddItem(repositoryFile, data); // Calling DAL class.
        }
    }

// DAL method
public static void AddItem(RepositoryFile repository, byte[] data)
{
    using (var scope = new TransactionScope())
    {
        using (var db = new MyEntities()) // DBContext
        {
            db.RepositoryTable.AddObject(repository);
            db.SaveChanges();
        }

        using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
        using (var cmd = new SqlCommand(string.Format("SELECT Data.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM dbo.RepositoryTable WHERE ID='{0}'", repository.ID), con)) // "Data" is the column name which has the FILESTREAM. Data.PathName() gives me the local path to the file.
        {
            cmd.Connection.Open();
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    var path = reader.GetString(0);
                    var transactionContext = reader.GetSqlBytes(1).Buffer;
                    var fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write);

                    fileStream.Write(contents, 0, contents.Length); //Write contents to the file.
                    fileStream.Close();
                }
            }
        }

        scope.Complete();
    }
}


 类似资料:
  • 问题内容: 我正在尝试从中删除一些元素,但即使是最简单的示例,如本答案或本示例中的示例,也将无法使用。 使用法线代替a 并没有帮助。我想念什么?我正在使用Java 7。 问题答案: 返回由原始数组支持的列表。您对列表所做的更改也将反映在您传入的数组中。由于您无法向数组添加或删除元素,因此对列表进行这种创建也是不可能的,这就是调用失败的原因。如果要能够动态添加和删除元素,则需要使用(,等)的不同实现

  • 问题内容: 我的python列表中有以下字符串(来自命令提示符): 进一步将默认编码也更改为utf-16。但是仍然抛出异常如下: 无法确定此类字符串需要哪种转换才能正常工作。 问题答案: 无法使用utf-8,utf-16编码进行解码。 尝试latin-1编码: 或者,指定,以使其不尝试解码字符串。

  • 问题内容: 我有一个像这样的numpy数组: 我想将数组中的数字四舍五入到小数点后两位或三位。我尝试使用numpy.around和numpy.round,但是它们都给我以下错误: 我曾经 和 难道我做错了什么?还有其他方法可以有效地对大型阵列执行此操作吗? 问题答案: 您不能对作为对象的numpy数组进行四舍五入,只要可以将数组安全地转换为float即可更改此值: 对于字符串,unicode,vo

  • 问题内容: 那我在做什么错呢? 但是,我只会 问题答案: 您正在使用而不是python 2,它将输入评估为python代码。 相当于 输入 raw_input 另外,您正在尝试将“烧杯”转换为整数,这没有多大意义。 您可以这样替换您脑海中的输入: 和:

  • 我使用 我编写了一些以块结尾的jruby代码,在运行所有代码后,出现了NullPointerException。但代码以任何其他语句结尾,不会发生异常。 版本:1.7.19 在ARGV。java vars.get变量返回null,因为在BiVariableM中isReceiverIdentical返回falseap.java 在ISReceiver中,此方法只需将接收器与双变量的接收器usgin'

  • 我试图使用JavaCV从我的webcamera.but捕获快照,当我运行下面的代码时,我得到了一个执行。它说找不到com/googlecode/javacpp/Pointer类。我能做些什么来解决这个错误... 例外