如何将字节数组连接到数据库中的现有字节数组
本文关键字:数组 字节数 字节 数据库 连接 | 更新日期: 2023-09-27 18:08:00
我有一些LinqToSQL对象。其中一个有一个"二进制"列,我认为它是VarBinary(最大)SQL。
每隔一段时间,我需要添加/连接一个字节数组到该列的某一行。我是这样做的:
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();
}
}
如你所见,
- 我使用Linq来"AddRange"到保存的字节(在堆中)。
- 然后我把它放到对象的右列。
- 提交更改。
低速运行
当我加速到每秒几次时,问题就出现了。有时会抛出一个'System '。ArgumentException'说:"已经添加了具有相同键的项。"抛出异常的确切行是:
this.CurrentObject.Bytes_Data = currentSavedBytes.ToArray();
有什么改进的建议吗?
如果它是更大字节的数据,你正在处理-也许把它移出Db,在File System上保留一个ref -并在那里追加-这样更好。
另一件事-只是一个想法…
currentSavedBytes
-你为什么保留它作为成员?可能是并发问题(如果共享)-尝试将其移到方法的作用域中。
这些都不是最优的。
- 你不应该在数据库中存储大文件
- Linq 2 Sql没有被优化。
- 同时,在内存中处理所有文件也不是一个好主意——它们可能很大,你会得到一个OOM异常
我建议你:
- 将文件保存在其他地方,就像@NSGaga在他的评论中所说的
- 如果您必须在数据库中保存,至少使用FileStream列(这几乎是保存到数据库磁盘中)。
- 按照本文中解释的方式执行,这样您就可以将 附加到文件