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

时间:2013-04-08 17:04:59

标签: c# sql-server linq-to-sql

我有一些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. 提交更改。
  4. 低速运转。

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

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

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

2 个答案:

答案 0 :(得分:1)

  

如果你正在处理更大的字节数据 - 可能会将其移出Db   ,保留一个参考文件系统 - 并附加在那里 - 这是更好的。

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

currentSavedBytes - 为什么要将其保留为会员?可能是一个确定性问题(如果共享) - 尝试在方法的范围内移动它。

答案 1 :(得分:0)

这些都不是最佳的。

  1. 您不应将大文件存储在数据库中
  2. Linq 2 Sql未针对此进行优化
  3. 此外,在内存中同时处理文件并不是一个好主意 - 它们可能很大而且你得到了OOM异常
  4. 我建议你:

    1. 将文件保存在其他地方,如@NSGaga在评论中所说的
    2. 如果必须保存在数据库中,至少使用FileStream列(这几乎可以保存到数据库磁盘中)。
    3. 执行this article中说明的操作,以便您可以附加到文件