обрезка байта [] при добавлении в базу данных сервера sql - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть байтовый массив, который всегда будет 10 мегабайт.Независимо от того, какие данные в нем, это будет десять мегабайт.Цель связана с кучей больших объектов ( дополнительная информация ).

Так что, если файл 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

1 Ответ

4 голосов
/ 08 февраля 2012

Создайте MemoryStream из байта [] и желаемой длины. Используйте поток для создания экземпляра SqlBytes. Создайте параметр, используя SqlBytes.

В качестве дополнительного комментария ваши большие данные никогда не должны материализоваться как byte[]. Он должен жить как поток через обработку. См. Загрузка и выгрузка изображений с SQL Server через ASP.Net MVC , где приведен реальный пример того, как вы можете сохранить большой объект в виде потока, никогда не материализованный в большой байт [], от начала до конца. на пути загрузки и выгрузки.

...