Загрузка файла через FileUploadEdit: при добавлении записи не сохраняет данные в базе
Есть страница справочника, для загрузки файла на нее добавлен FileUploadEdit.
Обработчик FileUploadEditChange такой:
Page.DataSource.ActiveRow.SetColumnValue("FileName", Page.FileUploadEdit.FileName);
if (!IsNew && !IsCopy) {
Page.DataSource.ActiveRow.Save();
}
При выборе файла для существующей записи (т.е. при редактировании) все работает, но при создании/копировании данные в полях FileData и FileName не сохраняются.
Пробовала сохранять данные в параметры процесса и затем редактировать Entity в событии DataSourceSaved и еще несколько вариантов, но так или иначе не получилось.
Помогите, пожалуйста
Версия bpm 7.3
Нравится
Добрый день!
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)