在添加到sql server数据库时修剪字节[]

时间:2012-02-07 21:46:15

标签: c# sql-server bytearray

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

有关

因此,如果将一个1Mb文件放入byte []中,那么最后九个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);
}

这似乎对我有用。有没有人看到这个问题?

-Chad

1 个答案:

答案 0 :(得分:4)

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

作为旁注,您的大数据绝不应该被视为byte[]。它应该通过处理作为流存在。有关如何将大对象保持为流的实际示例,请参阅Download and Upload images from SQL Server via ASP.Net MVC,从未在下载和上载路径上从端到端实现大字节[]。