Вставка байта [0] в столбец NOT NULLABLE в таблице БД Oracle - PullRequest
1 голос
/ 09 июля 2019

У меня есть таблица DOCUMENTS в БД Oracle с приведенным ниже описанием

create table DOCUMENTS
(
   DOC_ID   NUMBER not null,
   DOCUMENT BLOB not null,
   DOC_URL VARCHAR2(4000)
)

Это простая таблица, которая используется для хранения изображений из нескольких источников.Из одного из источников, требование состоит в том, чтобы просто вставить HTTP-путь изображения без ДОКУМЕНТА (документ будет иметь значение NULL).

Поскольку в таблице столбец определен как NOT NULL, я пытался преодолеть это ограничение, вставив в таблицу пустой BLOB-объект.Я получил это, работая в операторе PlSql, используя функцию empty_blob () в инструкции INSERT, как показано ниже

Работа в Pl / Sql

     insert into DOCUMENTS (doc_id,document,doc_url) values SEQ_DOCUMENT_ID.nextval, empty_blob(), 'http://path_to_image');
     commit;

Но когда япопробуйте вставить его из моего постоянного хранилища NHibernate Я получаю сообщение об ошибке " ORA-01400: невозможно вставить NULL "

Не работает в Nhibernate

using (var session = SessionFactory.OpenSession())
{
    Document documentDomain = new Document();
    documentDomain.doc_url = "http://path_to_the_document";
    documentDomain.document = new byte[0];
    session.Save(documentDomain);
}

Есть ли что-то, чего мне здесь не хватает?

1 Ответ

1 голос
/ 09 июля 2019

Если вам подходит необработанный SQL (минуя модель домена Document), NHibernate позволяет выполнять необработанные запросы SQL.

var sql = @"<Your Sql Here>";
int count = session.CreateSQLQuery(sql)
    .ExecuteUpdate();

Так что что-то вроде ниже должно работать для вас:

using (var session = SessionFactory.OpenSession())
{
    session.CreateSQLQuery("insert into DOCUMENTS (doc_id,document,doc_url) values SEQ_DOCUMENT_ID.nextval, empty_blob(), 'http://path_to_image');")
            .ExecuteUpdate();
}

При выполнении необработанного SQL ваша транзакция будет по-прежнему выполняться. Единственной разницей будет кэш уровня сессии. Материал, выполняемый через сырой SQL, не будет отражать кэш уровня сеанса. Если вы используете блок using, это не должно быть большой проблемой, если смотреть на ограниченную область действия Session.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...