2013-04-08 42 views
0

我有一些LinqToSQL对象。 其中有一个'Binary'列,我认为它是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(); 

,关于如何提高这任何提示吗?

+1

如果它是你处理更大的字节数据 - 也许将其移出DB的,保持一个参考到文件系统 - 和追加那里 - 哪个更好。另一方面,它可能因为那个'NewObjectToDatabase'而抛出(如果你也保存在那里),那只是一个猜测。 – NSGaga 2013-04-08 17:18:25

+0

@NSGaga谢谢,这是绝对和改进:)我改变了它;但同样的问题仍然存在。我不认为这会引发我将对象保存在NewObjectToDatabase中,我的意思是:当我尝试在Bytes_Data中写入(在对象内部)时,抛出的线条为什么仅在有时才这样做? – 2013-04-08 17:40:27

+0

我提出了一个答案,所以你可以投票等(因为它至少有助于修复它的一半以上 - 其余更容易)。另一方面 - 你可以发布你的模型,什么是PK等 - 它可能是相关的。 – NSGaga 2013-04-08 17:44:33

回答

0

没有一个是最佳的。

  1. 你不应该大文件存储在数据库中
  2. LINQ的2 SQL是不是做了优化它
  3. 此外,它〜不是一个好主意,在内存中一次全部处理文件 - 他们可能是大的,你会得到和OOM异常

我会建议你:

  1. 将文件保存在其他地方一样@NSGaga在他的评论中说:
  2. 如果您必须至少使用FileStream列保存数据库(这非常节省数据库磁盘)。
  3. 做到在this article喜欢解释的,所以你能够追加到文件
1

如果它处理的是较大的字节数据 - 可能将其移出Db ,将引用保留在文件系统中并附加到那里 - 这会更好。

在其他的事情 - 只是一个想法...

currentSavedBytes - 为什么你记住这成为会员?可能是一个共同性问题(如果共享) - 尝试在该方法的范围内移动它。

+0

'currentSavedBytes' - 为什么你保持这个成员?可能是'List'问题 - 尝试在该方法的范围内移动它。 – NSGaga 2013-04-08 17:47:29

相关问题