varbinary(max) & varchar(max) также можно сохранять в базу частями (http://msdn.microsoft.com/en-us/library/ms177523.aspx секция Updating Large Value Data Types )
Код | private const int UploadChankSize = 8040;
protected void UploadButton_OnClick(object sender, EventArgs e) { if(FileUpload1.HasFile) { var buffer = new byte[UploadChankSize]; using (var stream = FileUpload1.FileContent) using(var reader = new BinaryReader(stream)) { buffer = reader.ReadBytes(UploadChankSize);
var dataFile = new DataFile { FileName = FileUpload1.FileName, FileContent = buffer };
using (var context = new TestDataModelDataContext()) { context.DataFiles.InsertOnSubmit(dataFile); context.SubmitChanges();
buffer = reader.ReadBytes(UploadChankSize);
while(buffer.Length > 0) { context.AppendDataFile(dataFile.FileID, buffer); buffer = reader.ReadBytes(UploadChankSize); context.SubmitChanges(); } } } } }
|
Код | CREATE PROCEDURE dbo.AppendDataFile @FileID INT, @FileContent VARBINARY(MAX) AS SET NOCOUNT ON UPDATE dbo.DataFile SET FileContent.WRITE(@FileContent, NULL, 0) WHERE FileID = @FileID; RETURN
|
соответственно заранее смотрите, сколько порций будет в файле и соответственно после каждой записи обновляете прогресс |