私はFileForUploading
クラスをデータベースにアップロードする必要があります。データベースへのストリームのアップロード
public class FileForUploading
{
public FileForUploading(string filename, Stream stream)
{
this.Filename = filename;
this.Stream = stream;
}
public string Filename { get; private set; }
public Stream Stream { get; private set; }
}
しかし私は、唯一のFilename
プロパティが含まれている非常に単純なクラスですFileForUploadingEntity
に変換するエンティティフレームワークを使用しています。 Stream
をメモリに保存するのではなく、直接データベースにアップロードします。
Stream
を直接データベースに「ストリーム」するにはどうすればよいでしょうか?
これまでのところ、私はこの
private void UploadStream(string name, Stream stream)
{
var sqlQuery = @"UPDATE dbo.FilesForUpload SET Content [email protected] WHERE [email protected];";
var nameParameter = new SqlParameter()
{
ParameterName = "@name",
Value = name
};
var contentParameter = new SqlParameter()
{
ParameterName = "@content",
Value = ConvertStream(stream),
SqlDbType = SqlDbType.Binary
};
// the database context used throughout the application.
this.context.Database.ExecuteSqlCommand(sqlQuery, contentParameter, nameParameter);
}
を思い付くそしてここbyte[]
にStream
を変換し、私のConvertStream
でいます。 (データベース内のvarbinary(MAX)
として格納されている。
private static byte[] ConvertStream(Stream stream)
{
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
が十分に上記の溶液は良いですか?Stream
が大きい場合、それは私がストリームを保存したくない?
上記のソリューションでは、最初に言及したアプリケーションのメモリ内のストリームの内容が、まだ回避しようとしていたものであることを提案しました。 「私はストリームをメモリに保存するのではなく、直接データベースにアップロードしたい」 – Igor
これがなぜそうであるかについてもう少し具体的にできますか?だから私は何を変えなければならないかを知っている。 – pgerchev
AFAIK、あなたはストリーミング 'INSERT'だけをストリーミング' UPDATE'することはできません。 SQLBulkCopy()はこれを行うための1つの方法です。 – RBarryYoung