0

我有一些 LinqToSQL 对象。其中一个有一个“二进制”列,我认为它是 SQL 上的 VarBinary(max)。

时不时地,我需要为某一行添加/连接一个字节数组到该列中。我就是这样做的:

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();

关于如何改善这一点的任何提示?

4

2 回答 2

1

如果您正在处理的是较大的字节数据 - 可能将其移出 Db ,将 ref 保留到 File System - 并附加到那里 - 这更好。

另一方面 - 只是一个想法......

currentSavedBytes- 你为什么保留它作为会员?可能是一个并发问题(如果共享) - 尝试在方法范围内移动它。

于 2013-04-08T17:42:04.243 回答
0

这些都不是最佳的。

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

我建议你:

  1. 将文件保存在其他地方,如@NSGaga 在他的评论中所说
  2. 如果您必须保存在数据库中,至少使用FileStream列(这几乎可以保存到数据库磁盘中)。
  3. 按照本文中的说明进行操作,以便您能够附加到文件中
于 2013-04-08T17:46:11.500 回答