System.OutOfMemoryException - 当实体框架查询 Varbinary 类型的太大数据时

2023-11-30

我正在尝试查询varbinary包含文件 (1.2 Gb) 的列。

我正在使用实体框架。见下文:

要测试的数据库

CREATE TABLE [dbo].[BIGDATA]
(
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [BIGDATA] [varbinary](max) NULL, 

    CONSTRAINT [PK_BIGDATA] PRIMARY KEY CLUSTERED ([id] ASC) 
) ON [PRIMARY]

要测试的数据(任何 1 Gb 的文件)

INSERT INTO [dbo].[BIGDATA]([BIGDATA])
VALUES
   ((SELECT BulkColumn FROM OPENROWSET(BULK N'C:\BigTest.txt', SINGLE_BLOB) AS Document))

控制器下载文件

public FileResult Download()
{
        try
        {
            var context = new Models.ELOGTESTEEntities();

            var idArquivo = Convert.ToInt32(1);

            // The problem is here, when trying send command to SQL Server to read register
            var arquivo = (from item in context.BIGDATA
                           where item.id.Equals(idArquivo)
                           select item).Single();
            var mimeType = ".txt";              

            byte[] bytes = System.Text.Encoding.GetEncoding("iso-8859-8").GetBytes("BigTest.txt");
            return File(arquivo.BIGDATA1, mimeType, System.Text.Encoding.UTF8.GetString(bytes));
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

我可以在 SQL Server 上正常查询Select * From BigData.

但是,在实体框架(或使用 ADO 的命令)中,我收到此异常:

系统内存不足异常

有人知道如何解决这个问题吗?


哇,这是很多数据。我真的认为你不需要使用 EF 来获取这些数据,而是使用好的 'ol SqlDataReader。

鉴于您的 .net 4.0 限制,我找到了从大量 varbinary 列流式读取的自定义实现。除了检查代码并确保其中没有 .net 4.5 快捷方式之外,我对此没有任何功劳:

http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/

Mods - 让我知道是否应该将类似的内容复制/粘贴到答案中,因为原始 URL 可能不会持久。

编辑: 以下是链接中的代码,以防 URL 消失:

Usage:

// reading and returning data to the client
VarbinaryStream filestream = new VarbinaryStream(
                                DbContext.Database.Connection.ConnectionString, 
                                "FileContents", 
                                "Content", 
                                "ID", 
                                (int)filepost.ID, 
                                true);

// Do what you want with the stream here.

代码:

public class VarbinaryStream : Stream
{
    private SqlConnection _Connection;

    private string  _TableName;
    private string  _BinaryColumn;
    private string  _KeyColumn;
    private int     _KeyValue;

    private long    _Offset;

    private SqlDataReader _SQLReader;
    private long _SQLReadPosition;

    private bool _AllowedToRead = false;

    public VarbinaryStream(
        string ConnectionString,
        string TableName,
        string BinaryColumn,
        string KeyColumn,
        int KeyValue,
        bool AllowRead = false)
    {
        // create own connection with the connection string.
        _Connection = new SqlConnection(ConnectionString);

        _TableName = TableName;
        _BinaryColumn = BinaryColumn;
        _KeyColumn = KeyColumn;
        _KeyValue = KeyValue;


        // only query the database for a result if we are going to be reading, otherwise skip.
        _AllowedToRead = AllowRead;
        if (_AllowedToRead == true)
        {
            try
            {
                if (_Connection.State != ConnectionState.Open)
                    _Connection.Open();

                SqlCommand cmd = new SqlCommand(
                                @"SELECT TOP 1 [" + _BinaryColumn + @"]
                                FROM [dbo].[" + _TableName + @"]
                                WHERE [" + _KeyColumn + "] = @id",
                            _Connection);

                cmd.Parameters.Add(new SqlParameter("@id", _KeyValue));

                _SQLReader = cmd.ExecuteReader(
                    CommandBehavior.SequentialAccess |
                    CommandBehavior.SingleResult |
                    CommandBehavior.SingleRow |
                    CommandBehavior.CloseConnection);

                _SQLReader.Read();
            }
            catch (Exception e)
            {
                // log errors here
            }
        }
    }

    // this method will be called as part of the Stream ímplementation when we try to write to our VarbinaryStream class.
    public override void Write(byte[] buffer, int index, int count)
    {
        try
        {
            if (_Connection.State != ConnectionState.Open)
                _Connection.Open();

            if (_Offset == 0)
            {
                // for the first write we just send the bytes to the Column
                SqlCommand cmd = new SqlCommand(
                                            @"UPDATE [dbo].[" + _TableName + @"]
                                                SET [" + _BinaryColumn + @"] = @firstchunk 
                                            WHERE [" + _KeyColumn + "] = @id",
                                        _Connection);

                cmd.Parameters.Add(new SqlParameter("@firstchunk", buffer));
                cmd.Parameters.Add(new SqlParameter("@id", _KeyValue));

                cmd.ExecuteNonQuery();

                _Offset = count;
            }
            else
            {
                // for all updates after the first one we use the TSQL command .WRITE() to append the data in the database
                SqlCommand cmd = new SqlCommand(
                                        @"UPDATE [dbo].[" + _TableName + @"]
                                            SET [" + _BinaryColumn + @"].WRITE(@chunk, NULL, @length)
                                        WHERE [" + _KeyColumn + "] = @id",
                                     _Connection);

                cmd.Parameters.Add(new SqlParameter("@chunk", buffer));
                cmd.Parameters.Add(new SqlParameter("@length", count));
                cmd.Parameters.Add(new SqlParameter("@id", _KeyValue));

                cmd.ExecuteNonQuery();

                _Offset += count;
            }
        }
        catch (Exception e)
        {
            // log errors here
        }
    }

    // this method will be called as part of the Stream ímplementation when we try to read from our VarbinaryStream class.
    public override int Read(byte[] buffer, int offset, int count)
    {
        try
        {
            long bytesRead = _SQLReader.GetBytes(0, _SQLReadPosition, buffer, offset, count);
            _SQLReadPosition += bytesRead;
            return (int)bytesRead;
        }
        catch (Exception e)
        {
            // log errors here
        }
        return -1;
    }
    public override bool CanRead
    {
        get { return _AllowedToRead; }
    }

    #region unimplemented methods
    public override bool CanSeek
    {
        get { return false; }
    }

    public override bool CanWrite
    {
        get { return true; }
    }

    public override void Flush()
    {
        throw new NotImplementedException();
    }

    public override long Length
    {
        get { throw new NotImplementedException(); }
    }

    public override long Position
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new NotImplementedException();
    }

    public override void SetLength(long value)
    {
        throw new NotImplementedException();
    }
    #endregion unimplemented methods
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.OutOfMemoryException - 当实体框架查询 Varbinary 类型的太大数据时 的相关文章

随机推荐

  • iphone:如何以编程方式检测最后一个来电号码?

    有什么方法可以检测 iPhone 上的最后来电号码和通话时长 我能够获取所有通知 核心电话 但不知道如何获取来电号码 你不能 API 不允许你这样做 我认为出于隐私考虑 苹果永远不会允许这样做
  • 学说实体关系

    我有一个实体模板和另一个请求 本质上 模板代表一个 html 表单 请求将代表表单填充的值的集合以及对模板 ID 的引用 class Request Id Column type integer GeneratedValue private
  • 安卓锁屏

    有没有办法在锁屏上显示文字 喜欢有关未读短信的信息或喜欢锁定屏幕上带有播放 暂停按钮的音乐播放器 Thanks 是的 也不是 他们没有公共 API 来创建或修改锁定屏幕 无论是谁在您的设备上构建了操作系统版本 都创建了您的锁定屏幕 一些制造
  • 如何使用 fastcgi_finish_request() 的示例

    有人可以展示一个关于如何使用的简单示例吗fastcgi finish request 功能 我用谷歌搜索 但只发现了一些一般性的提及 有些人说他们成功地使用了它 但我找不到带有代码的单个示例 例如 我有一个 PHP 对象 为了向浏览器发送响
  • 如何让Javascript忽略或保留空格,而不是删除它们

    我试图让一个函数用破折号覆盖多单词区域 但不用 JavaScript 中的破折号覆盖单词之间的空格 所以 我基本上需要 JS 来忽略空格 或者维护然后 但我在网上找到的只是如何从字符串中删除空格 如果我这样做 那么覆盖该区域的破折号之间仍然
  • jquery遍历查找父级的父级

    HTML li class comment div class p comm div class avatar img src img 1 jpg div div class c auth author a class del title
  • 如何从电子邮件地址中提取“域”

    我的专栏中有以下模式 email protected email protected 现在 我想在之后提取文本 和之前 即 gmail 和 hotmail 我能够在之后提取文本 用下面的代码 sub email 我如何修改上述内容以适合我的
  • 如何在 Marklogic 中构建一个简单的搜索应用程序?

    我想在 Marklogic 中构建一个简单的搜索应用程序 但我不想使用应用程序生成器 我想编写自己的 xqy 文件 我想从用户那里获取名字 姓氏和地址的输入 用户可以按名字 姓氏或地址进行搜索 他还可以通过输入所有三个字段来进行搜索 也可以
  • python 中的哨兵循环

    因此 我从用户那里获取要存储到列表中的输入 并且使用哨兵循环不断要求用户输入数字 出现的问题是 当用户完成输入值后 我使用 停止 结束循环时 出现错误 ValueError 以 10 为基数的 int 的文字无效 停止 我不知道为什么 如果
  • 按键对哈希值进行排序,然后在 Ruby 中返回哈希值

    这是对哈希进行排序并返回哈希对象 而不是数组 的最佳方法吗 h a gt 1 c gt 3 b gt 2 d gt 4 gt a gt 1 c gt 3 b gt 2 d gt 4 Hash h sort gt a gt 1 b gt 2
  • GWT 编译的一些微妙之处 - “gwt 模块可能需要(重新)编译。”

    我正在将应用程序部署到 GAE 我在 Eclipse 中设置了一个项目 其中包含三个独立的 GWT 模块 每个模块都有自己的 HTML 页面 入口点等 它们共享大量代码 当我将应用程序部署到 appengine 时 其中两个模块工作正常 我
  • getstream.io 中的用户身份验证和配置文件

    我想知道是否可以直接使用 getstream io 管理用户配置文件和用户身份验证 我浏览了示例 但不明白用户是如何创建的 目前无法在 Stream 中管理用户帐户 配置文件和身份验证 Stream 最好与处理这些事情和其他功能 应用程序逻
  • OpenCV、Qt、imread、namedWindow、imshow 不起作用

    In the pro file QT core QT gui TARGET latihan 2 CONFIG console CONFIG app bundle TEMPLATE app SOURCES main cpp INCLUDEPA
  • 有人对 Play 框架有什么好的 A/B 测试策略吗?

    我对好的策略感兴趣A B 或拆分测试与 Play 框架 显而易见的选择是使用 Google 网站优化工具 但出于以下几个原因我不想这样做 只允许您测试表示层中的内容 很难根据收入等因素 而不是点击或转化等二元事件 进行测试 不得不用 Jav
  • 在 Click 事件上查找按钮的父 ListViewItem

    我有一个按钮作为每个 ListViewItem 的最后一列 当按下按钮时 我需要在单击事件中找到按钮 发送者 父列表视图项 我努力了 ListViewItem itemToCancel sender as System Windows Co
  • 通过指向派生类的基指针增强序列化[重复]

    这个问题在这里已经有答案了 可能的重复 使用多态档案增强序列化 我试图使用指向派生类的基指针来序列化我的类 但这仅序列化基类 我刚刚读过http www boost org doc libs 1 32 0 libs serializatio
  • contextMenu 破坏 FullCalendar 事件拖动

    因此 我最近使用 jQuery contextMenu http abeautifulsite net blog 2008 09 jquery context menu plugin 在 FullCalendar 中的事件中添加了一个上下文
  • .Net 中“InvokeRequired”和“Invoke”是什么意思?

    我在我正在开发的几个程序中做了很多线程方面的工作 并且我一直很好奇到底有些东西在做什么 以以下代码为例 该代码从线程运行以更新 UI Public Sub UpdateGrid If Me InvokeRequired Then Me In
  • iPhone 应用程序本地化,针对不同市场发布单独的应用程序

    我在瑞典应用商店上有一个应用程序 我打算将其适应其他一些市场 在这种情况下 本地化最重要的部分是改变应用程序针对不同市场 国家 的工作方式的某些方面 因此这主要不是语言适应 也许 我不会使用正常的内置机制进行本地化 相反 我考虑为不同的市场
  • System.OutOfMemoryException - 当实体框架查询 Varbinary 类型的太大数据时

    我正在尝试查询varbinary包含文件 1 2 Gb 的列 我正在使用实体框架 见下文 要测试的数据库 CREATE TABLE dbo BIGDATA id bigint IDENTITY 1 1 NOT NULL BIGDATA va