我已经建立了一个小MVC4网站与代码第一种方法共享文件。 该文件存储在我的数据库
public byte[] Content { get; set; }
伊夫集
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="536870912" />
</requestFiltering>
</security>
和
<httpRuntime targetFramework="4.5" executionTimeout="6000" maxRequestLength="524288"/>
为了限制文件大小为500 MB,因此文件实际上使它成为我的代码(被困在这一点在前)。
当我收到该文件,并尝试将其保存到数据库中的实际问题正在发生,我称之为:
DbContext.SaveChanges()
而得到这个错误:
型“的System.OutOfMemoryException”的异常出现在System.Data.Entity.dll但在用户代码中没有处理
我猜这是因为我打某种限制为多少数据可以存储在数据库中(或多少内存我的过程中允许使用的)..一切正常上传较小的文件,当一个byte []。
数据库服务器是一个SQL 2008 R2标准服务器。
我宁愿避免存储盘为简单起见,在文件..我有哪些选择?
编辑:使用做一个直线上升的SQL查询的建议插入文件让我过去获得的文件到数据库中的第一个问题:
DbContext.Database.ExecuteSqlCommand(
@"UPDATE FileContents
SET Content = @data
WHERE ID = @id",
new SqlParameter("id", content.ID), new SqlParameter("data", bytearray));
但是,试图让该文件从数据库中,而不是当我现在得到确切的同样的错误。 现在,这将导致错误:
byte[] respdata = DbContext.Database.SqlQuery<Byte[]>
("SELECT TOP 1 Content FROM FileContents WHERE ID = @id",
new SqlParameter("id", filepost.File.ID)).Single();
再次,这是工作于较小的文件<100 MB但拍击200个MB的文件。
添加堆栈跟踪按照下面的答案评论质疑:
System.OutOfMemoryException的是由用户代码未处理
的HResult = -2147024882类型“的System.OutOfMemoryException”的消息=引发异常。 来源= mscorlib程序
堆栈跟踪:在System.Object.MemberwiseClone()在System.Array.Clone()在System.Data.Common.CommandTrees.DbConstantExpression..ctor(TypeUsage与resultType,对象的值)在System.Data.Mapping.Update.Internal.UpdateCompiler .GenerateValueExpression(EdmProperty属性,PropagatorResult值)System.Data.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding目标,PropagatorResult行,PropagatorResult originalRow,TableChangeProcessor处理器,布尔插入模式,字典2& outputIdentifiers, DbExpression& returning, Boolean& rowMustBeTouched) at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildInsertCommand(PropagatorResult newRow, TableChangeProcessor processor) at System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode, UpdateCompiler compiler) at System.Data.Mapping.Update.Internal.UpdateTranslator.<ProduceDynamicCommands>d__0.MoveNext() at System.Linq.Enumerable.<ConcatIterator>d__71
1.MoveNext()在系统 .Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable的1 commands, UpdateTranslator translator) at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands() at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at FilePublicator2.Controllers.FileController.Upload(String qqfile) in d:\Projects\FilePublicator2\trunk\FilePublicator2\Controllers\FileController.cs:line 115 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
1 commands, UpdateTranslator translator) at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands() at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at FilePublicator2.Controllers.FileController.Upload(String qqfile) in d:\Projects\FilePublicator2\trunk\FilePublicator2\Controllers\FileController.cs:line 115 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
2个参数)在System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary的2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8
1.b__7(IAsyncResult的)在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod( IAsyncResult的asyncResult)在System.Web.Mvc.Async.AsyncControllerActionInvoker <>ç_DisplayClass37 <> C_ DisplayClass39.b _33()在System.Web.Mvc.Async.AsyncControllerActionInvoker <> C_ DisplayClass4f.b _49()的InnerException。:
解:
以下是这是如何解决的一个完整的例子:
http://www.syntaxwarriors.com/2013/stream-varbinary-data-to-and-from-mssql-using-csharp/