簡體   English   中英

如何將字節數組連接到數據庫中現有的字節數組

[英]How to concatenate a byte array into an existing one inside a Database

我有一些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();

關於如何改善這一點的任何提示?

如果您要處理的是更大的字節數據-也許將其移出Db,將引用保留到文件系統上-並附加在那里-更好。

另一方面-只是一個主意...

currentSavedBytes為什么將其保留為成員? 可能是一個並發性問題(如果共享)-嘗試在方法范圍內移動它。

這些都不是最優的。

  1. 您不應該在數據庫中存儲大文件
  2. Linq 2 Sql尚未針對此問題進行優化
  3. 另外,一次在內存中處理所有文件也不是一個好主意-它們可能很大,您會收到並且OOM異常

我建議您:

  1. 將文件保存在其他地方,例如@NSGaga在他的評論中說
  2. 如果必須保存在數據庫中,請至少使用FileStream列(這幾乎可以保存到數據庫磁盤中)。
  3. 本文中解釋的那樣進行操作,以便您可以附加到文件中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM