【问题标题】:trimming a byte[] when adding into a sql server database添加到 sql server 数据库时修剪字节 []
【发布时间】:2012-02-08 22:01:02
【问题描述】:

我有一个始终为 10 兆的字节数组。不管里面有什么数据,都是十兆。目的与大对象堆有关 (more information)。

因此,如果将一个 1Mb 的文件放入 byte[],那么最后 9 个 meg 将被清零。问题是,当我将它上传到 SQL Server 时,上传的文件总是 10 兆。我宁愿只上传必要的部分。

在将其复制到字节数组之前,我已经有了大小,因此如果需要,我可以进行修剪。问题是,我不知道如何有效地做到不在 LOH 上创建新的 byte[]。

想法?

更新 #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);
}

这似乎对我有用。有人看到这有什么问题吗?

-乍得

【问题讨论】:

  • 向我们展示您用于“将文件上传到 SQL Server”的代码
  • 使用数据库调用更新。
  • 您在哪里找到了使用比实际需要的更大的数组更节省内存的信息?我在您链接的那个问题的答案中看不到任何暗示。相反,建议使用几个小数组而不是一个大数组的答案,但这显然不适用于您的情况。
  • 需求来自内存不足异常。如果我一次处理太多文件,我的 LOH 会变得支离破碎,我无法向其中添加新文件并且它会出错。因此,如果我不断地重新填充现有数组,那么我就不会遇到这个问题。
  • 如果您使用的是 SQL Server 2008,FileStream 可能是一个替代方案,因为它支持直接从流中查找和写入。

标签: c# sql-server bytearray


【解决方案1】:

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

作为旁注,您的大数据不应该被具体化为byte[]。它应该通过处理作为流存在。请参阅Download and Upload images from SQL Server via ASP.Net MVC,了解如何在下载和上传路径上端到端地将大对象保留为流,从不具体化为大字节[]。

【讨论】:

  • 我正在使用 itextsharp 将大的 pdf 切割成更小的块。 Itextsharp 需要一个 byte[] (我认为)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2013-01-15
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多