2012-02-07 62 views
2

我有一个总是10兆字节的字节数组。不管它里面有什么数据,它都会是十兆。目的与大对象堆(more information)有关。添加到sql server数据库时修剪一个字节[]

因此,如果一个1Mb文件被放入字节[]中,则最后九个宏将被清零。问题是,当我上传到SQL Server时,上传的文件总是10兆字节。我宁愿只上传必要的位。

我有它的大小复制到字节数组之前,所以我可以做一个修剪,如果需要的话。问题是,我不知道如何有效地执行一个不会在LOH上创建新的字节[]的问题。

想法?

更新#1

下面是一些伪代码。我已经删除了大部分不需要的代码。它使用Microsoft.Practices.EnterpriseLibrary.Data库来访问数据库。 (遗留代码,不能改变)

Param[] parametersArray = new Param[10]; 
// other params 
parametersArray[4] = new Param("DocumentData", DbType.Binary, documentToSave.Data); 
// other params 
DataAccess.ExecuteNonQuery("esMD.proc_WS_UpdateDocument", parametersArray); 

public static int ExecuteNonQuery(string spName, params Param[] parameters) 
{ 
    int ret = -1; 

    DbCommand storedProcedure = Database.Db.GetStoredProcCommand(spName); 
    storedProcedure.CommandTimeout = commandTimeout; 

    if (parameters != null) 
    { 
     foreach (Param parameter in parameters) 
     { 
      if (parameter != null) 
      { 
       Database.Db.AddInParameter(storedProcedure, parameter.ParameterName, parameter.DbType, parameter.Value); 
      } 
     } 
    } 

    try 
    { 
     ret = MedicareDatabase.Db.ExecuteNonQuery(storedProcedure); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
    finally 
    { 
     if (storedProcedure != null) 
     { 
      storedProcedure.Dispose(); 
     } 
    } 
    return ret; 
} 

更新#2

我修改上面的数据库调用,还修改了我如何进入参数。

if (parameter.Size != null && parameter.Size > 0) 
{ 
    MedicareDatabase.Db.AddParameter(storedProcedure, parameter.ParameterName, DbType.Binary, parameter.Size, ParameterDirection.Input, true, 0, 0, string.Empty, DataRowVersion.Default, parameter.Value); 
} 
else 
{ 
    MedicareDatabase.Db.AddInParameter(storedProcedure, parameter.ParameterName, parameter.DbType, parameter.Value); 
} 

这似乎是为我工作。有没有人看到这个问题?

-Chad

+3

向我们展示您用于“将文件上载到SQL Server”的代码 – dtb 2012-02-07 21:53:26

+0

已更新,并附有数据库调用。 – Cyfer13 2012-02-07 22:02:15

+1

您从哪里找到了使用比实际需要的数组更大内存效率的信息?我无法看到你提到的那个问题的答案中的任何内容。相反,推荐使用几个小阵列的答案超过一个,但这显然不适用于你的情况。 – PHeiberg 2012-02-07 22:25:28

回答

4

创建从字节[]和所需长度的MemoryStream。使用流构造一个SqlBytes实例。使用SqlBytes构建参数。

作为一条评论,您的大数据不应该被物化为byte[]。它应该作为一个流通过处理。请参阅Download and Upload images from SQL Server via ASP.Net MVC以了解如何将大型对象保留为流,并且从未实现为大型字节[]的实例,从下载和上载路径上的端到端。

+0

我正在使用itextsharp将较大的pdf切成较小的块。 Itextsharp需要一个字节[](我认为)。 – Cyfer13 2012-02-07 22:33:53