Загрузка файла через FileUploadEdit: при добавлении записи не сохраняет данные в базе

Есть страница справочника, для загрузки файла на нее добавлен FileUploadEdit.
Обработчик FileUploadEditChange такой:

Page.DataSource.ActiveRow.SetStreamValue("FileData", new MemoryStream(Page.FileUploadEdit.FileBytes));
Page.DataSource.ActiveRow.SetColumnValue("FileName", Page.FileUploadEdit.FileName);
if (!IsNew && !IsCopy) {
        Page.DataSource.ActiveRow.Save();
}

При выборе файла для существующей записи (т.е. при редактировании) все работает, но при создании/копировании данные в полях FileData и FileName не сохраняются.
Пробовала сохранять данные в параметры процесса и затем редактировать Entity в событии DataSourceSaved и еще несколько вариантов, но так или иначе не получилось.
Помогите, пожалуйста

Версия bpm 7.3

Нравится

6 комментариев

Добрый день!

Page.DataSource.ActiveRow.SetStreamValue("FileData", new MemoryStream(Page.FileUploadEdit.FileBytes));
Page.DataSource.ActiveRow.SetColumnValue("FileName", Page.FileUploadEdit.FileName);
if (!IsNew && !IsCopy) { //тут явно указано, что файл сохранять только для редактируемой записи
        Page.DataSource.ActiveRow.Save();
}

Дело в том, что файлы объекта это деталь, и каждая запись должна иметь связь с существуюущей записью. Так как новая запись или копия еще не записаны в базе, то и идентификатора у записи еще нет, и файл не может быть связан с ней.
Добавление файла может происходить только после сохранения записи (в новом интерфейсе это происходит автоматически).

"Вильшанский Дмитрий" написал:

Дело в том, что файлы объекта это деталь, и каждая запись должна иметь связь с существуюущей записью. Так как новая запись или копия еще не записаны в базе, то и идентификатора у записи еще нет, и файл не может быть связан с ней.

Добавление файла может происходить только после сохранения записи (в новом интерфейсе это происходит автоматически).

Дмитрий, у меня это все одна таблица, никаких деталей нет.
Я так думала, что при создании записи по кнопке ОК данные должны сохраниться (поле FileName, кстати, сохраняется, а вот FileData - нет).
А вот это

if (!IsNew && !IsCopy) {
        Page.DataSource.ActiveRow.Save();
}

просто промежуточное сохранение записи(!), а не файла отдельно, как Вы пишите.

Лариса, по-моему строка, которая отвечает за сохранение изменений в базе:

Page.DataSource.ActiveRow.Save();

в случае создания новой/копирования текущей записи не выполнится, т.к. явно же стоит условие:

if (!IsNew && !IsCopy) 

Предполагаю, что если сделать так:

Page.DataSource.ActiveRow.SetStreamValue("FileData", new MemoryStream(Page.FileUploadEdit.FileBytes));
Page.DataSource.ActiveRow.SetColumnValue("FileName", Page.FileUploadEdit.FileName);
//if (!IsNew && !IsCopy) {
        Page.DataSource.ActiveRow.Save();
//}

все заработает :)

Если нет, предлагаю отладиться: к примеру, выводите длину потока MemoryStream:

MemoryStream memStream = new MemoryStream(Page.FileUploadEdit.FileBytes);
string memStreamLength = memStream.Length.ToString();

Вместо вызова Page.DataSource.ActiveRow.SetStreamValue можно вызвать Page.DataSource.ActiveRow.SetBytesValue с параметром Page.FileUploadEdit.FileBytes
Тогда не нужно будет создавать MemoryStream из массива бит.

Люди добрые, со строкой сохранения и с условием мне и так все понятно.
Если сделать так

Page.DataSource.ActiveRow.SetStreamValue("FileData", new MemoryStream(Page.FileUploadEdit.FileBytes));
Page.DataSource.ActiveRow.SetColumnValue("FileName", Page.FileUploadEdit.FileName);
Page.DataSource.ActiveRow.Save();

то для новой записи есть две проблемы:
1) если не заполнены обяз. поля, то exception
2) если поля заполнены и нажали ОК, то "Нарушение "PK3wdCGYrpgy5znnXrWkxqbuBPszM" ограничения PRIMARY KEY."
т.е. либо нужно провести валидацию перед сохранением новой записи (1 случай), либо установить какой-то признак, что запись уже сохранили (2 случай)
а в идеале это нужно скомбинировать

"Олейник Дмитрий" написал:

Если нет, предлагаю отладиться: к примеру, выводите длину потока MemoryStream:

MemoryStream memStream = new MemoryStream(Page.FileUploadEdit.FileBytes);

string memStreamLength = memStream.Length.ToString();


это пробовала, поток не пустой

Пробовала сохранять данные в параметр процесса с типами "Файл" и "Двоичные данные", при этом в скрипте записи значений в параметр все ок, а вот в другом скрипте (после сохр. записи) при обращении к параметрам уже ошибка "ссылка на объект не указыавет на экземпляр объекта"

Чтобы отключить валидацию при сохранении, можно выставить соответствующий параметр в false:

public bool Save(bool validateRequired = true)
Показать все комментарии