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

时间:2012-08-10 20:47:32

标签: c# sql

我有一个应用程序,我正在分块文件字节并将每个块存储在数据库中(我在每个块周围记录信息)。然后,我试图从数据库中检索块,将它们放回到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)

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

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)将它们取出

谢谢

1 个答案:

答案 0 :(得分:2)

简单地将reader["ChunkBytes"]转换为字节数组。

没有必要为阅读器的每个字段调用ToString(),然后将其转换为实际类型。它会极大地伤害性能 - 您可以直接将整数转换为int,将varchars等转换为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代码后,我现在只将其用于非常具体的项目 - 例如当你需要手动创建你的陈述时。