如何将字节数组连接到数据库中的现有字节数组

本文关键字:数组 字节数 字节 数据库 连接 | 更新日期: 2023-09-27 18:08:00

我有一些LinqToSQL对象。其中一个有一个"二进制"列,我认为它是VarBinary(最大)SQL。

每隔一段时间,我需要添加/连接一个字节数组到该列的某一行。我是这样做的:

void StoreBytesInDb(IEnumerable<byte> bytesToStore)
    {
        using (var dataBaseContext = new MyDataClasses(DatabaseInfo.ConnectionString))
        {
            if (this.currentObjectId == -1)
            {
                this.NewObjectToDatabase();
                this.currentSavedBytes = new List<byte>();
            }
            this.CurrentObject = dataBaseContext.Objects.Single(e => e.Id_Object == this.currentObjectId);
            this.currentSavedBytes.AddRange(bytesToStore);
            this.CurrentObject.Bytes_Data = this.currentSavedBytes.ToArray();
            dataBaseContext.SubmitChanges();
        }
    }
如你所见,
  1. 我使用Linq来"AddRange"到保存的字节(在堆中)。
  2. 然后我把它放到对象的右列。
  3. 提交更改。

低速运行

当我加速到每秒几次时,问题就出现了。有时会抛出一个'System '。ArgumentException'说:"已经添加了具有相同键的项。"抛出异常的确切行是:

this.CurrentObject.Bytes_Data = currentSavedBytes.ToArray();

有什么改进的建议吗?

如何将字节数组连接到数据库中的现有字节数组

如果它是更大字节的数据,你正在处理-也许把它移出Db,在File System上保留一个ref -并在那里追加-这样更好。

另一件事-只是一个想法…

currentSavedBytes -你为什么保留它作为成员?可能是并发问题(如果共享)-尝试将其移到方法的作用域中。

这些都不是最优的。

  1. 你不应该在数据库中存储大文件
  2. Linq 2 Sql没有被优化。
  3. 同时,在内存中处理所有文件也不是一个好主意——它们可能很大,你会得到一个OOM异常

我建议你:

  1. 将文件保存在其他地方,就像@NSGaga在他的评论中所说的
  2. 如果您必须在数据库中保存,至少使用FileStream列(这几乎是保存到数据库磁盘中)。
  3. 按照本文中解释的方式执行,这样您就可以将
  4. 附加到文件