2013-04-08 48 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

相關問題