c# - 将文件字节从 C# 序列化到 SQL Server 并再次返回

标签 c# sql

我有一个应用程序,我将文件字节分块并将每个 block 存储在数据库中(我正在记录每个 block 的信息)。然后,我尝试从数据库中检索这些 block ,用 C# 将它们重新组合在一起并写入文件。

目前,我有以下 C# 代码:

string encoded = GetBase64EncodedFile();  // This is just for readability
byte[] fileBytes = Convert.FromBase64String(encoded).ToList().ToArray();

Database database = DatabaseFactory.CreateDatabase();
using (DbCommand command = database.GetStoredProcCommand("SaveFileChunk"))
{
  database.AddInParameter(command, "fileName", DbType.String, fileName);
  database.AddInParameter(command, "offset", DbType.Int32, offset);
  database.AddInParameter(command, "number", DbType.Int32, number);
  database.AddInParameter(command, "chunkBytes", DbType.Binary, fileBytes);

  database.ExecuteNonQuery(command);
}

此时,如果我打印出 fileBytes.Count(),我会看到:152754

该记录将写入具有以下结构的 SQL Azure 表:

FileChunk
---------
Filename nvarchar(max)
Offset int
Number int
ChunkBytes varbinary(max)

后来,我尝试使用以下查询接收文件 block :

SELECT * FROM [FileChunk] ORDER BY [Number]

然后,我尝试按如下方式填充 FileChunk CLR 对象:

public FileChunk(IDataReader reader)
{
  fileName = reader["Filename"].ToString();
  offset = Convert.ToInt32(reader["Offset"].ToString());
  number = Convert.ToInt32(reader["Number"].ToString());
  chunkBytes = reader["ChunkBytes"].ToString().ToCharArray().Select(c => (byte)c).ToArray();
}

当我执行这段代码时,我了解到上面的 chunkBytes.Count() 是 13。

这意味着我遇到了某种序列化或数据类型转换错误。但是,我没有看到它。我如何 a) 将字节放入 SQL Azure b) 将它们取出

谢谢

最佳答案

只需将 reader["ChunkBytes"] 转换为字节数组。

没有必要为阅读器的每个字段调用ToString(),然后将其转换为实际类型。它极大地损害了性能 - 您可以直接将整数转换为 int,将 varchar 等转换为 string,将二进制字段直接转换为 byte[]:

public FileChunk(IDataReader reader)
{
    fileName = (string)reader["Filename"];
    offset = (int)reader["Offset"];
    number = (int)reader["Number"];
    chunkBytes = (byte[])reader["ChunkBytes"];
}

作为旁注 - 您是否有特定原因使用 ADO.NET 而不是某些 ORM 解决方案(例如 LINQ to SQL 或 Entity Framework )?在编写了我的 ADO.NET 代码后,现在我实际上只会将其用于非常特定的项目 - 例如当您需要手动创建语句时。

关于c# - 将文件字节从 C# 序列化到 SQL Server 并再次返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909033/

相关文章:

c# - 从 c# 应用程序设置 Excel power view 设置

MySQL 显示每个团队的第四个最小值

sql - MySQL Sum 基于日期范围和一天中的时间

c# - Windows 8 中的 .NET : AppContract, Marketplace 和 WPF/C# 从开发的角度来看

c# - 使用 MVVM 单击 DataGrid 单个单元格行和列

c# - 资源池 'default' 中的系统内存不足,无法运行此查询。在 SQL 上

sql - 在 Oracle 11g 上双查询的性能如何

mysql - 复杂的 M :N relationship with MySQL tables

c# - 错误CS1729 : The type `System.Collections.Generic.List<string>' does not contain a constructor that takes `5' arguments

c# - 使用 Linq Grouping 如何按特定组排序然后剩余组降序