2

ファイルバイトをチャンクアップして各チャンクをデータベースに保存するアプリがあります(各チャンクに関する情報をログに記録しています)。次に、データベースからチャンクを取得し、それらを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

レコードは、次の構造でSQLAzureテーブルに書き込まれます。

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

後で、次のクエリでファイルチャンクを受信しようとします。

SELECT * FROM [FileChunk] ORDER BY [Number]

次に、FileChunkCLRオブジェクトに次のようにデータを入力しようとします。

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)バイトを元に戻します

ありがとうございました

4

1 に答える 1

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"];
}

余談ですが、LINQ to SQL や Entity Framework などの ORM ソリューションの代わりに ADO.NET を使用する特定の理由はありますか? ADO.NET コードのシェアを書いたので、最近では、ステートメントを手動で作成する必要がある場合など、非常に特定のプロジェクトにのみ使用します。

于 2012-08-10T20:51:04.993 に答える