我想上傳一個約600MB的壓縮文件到SQL 2008 FILESTREAM表,我得到OutOfMemoryException。我正在使用SqlFileStream類來上傳文件(如本教程中所述 - http://www.aghausman.net/dotnet/saving-and-retrieving-file-using-filestream-sql-server-2008.html)。我有一個32位的Vista機器4GB內存,如果該事項和我使用VS 2010,實體框架4OutOfMemoryException當使用SQL文件流
這裏是我的代碼片段 -
public static void AddItem(RepositoryFile repository)
{
var contents = repository.Data; // I get the exception at this line.
repository.Data = System.Text.Encoding.ASCII.GetBytes("0x00");
using (var scope = new TransactionScope())
{
using (var db = new MyEntities())
{
db.RepositoryTable.AddObject(repository);
db.SaveChanges();
}
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
using (var cmd = new SqlCommand("SELECT Data.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM dbo.RepositoryTable", con))
{
cmd.Connection.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var path = reader.GetString(0);
var transactionContext = reader.GetSqlBytes(1).Buffer;
var fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write);
fileStream.Write(contents, 0, contents.Length);
fileStream.Close();
}
}
}
scope.Complete();
}
}
如何上傳文件時不進行錯誤?
謝謝!
我已經更新了片段,以指示它引發錯誤(var contents = repository.Data;)的位置。實際上我做了一個副本,並在第一次運行時向FILESTREAM寫入一個字節,並在稍後使用副本寫入實際字節。我認爲在用單個字節覆蓋字節之前,內存會保存文件字節的兩個副本(一個位於repository.Data中,另一個位於內容中)。我認爲這是造成這個問題的原因。我也在尋找如何上傳大塊文件。 – tempid 2010-12-14 16:23:03
什麼是repository.Data,它是如何設置的? – 2010-12-14 16:30:55
爲不完整的細節道歉。 repository.Data被設置在我的aspx的代碼隱藏中。我已經解決了我的問題,並使用新代碼發佈了新帖子。感謝Brian! – tempid 2010-12-14 18:53:06