Обновите CLOB с помощью текстового поля в С#

Я был во всем Интернете с этим, и я удивлен, как я не могу найти способ сделать то, что я ищу.

Я использую библиотеку Oracle.DataAccess.Client в своем проекте C#, не устаревшую System.Data.OracleClient.

У меня есть очень простая таблица:

CREATE TABLE testing (
      ID NUMBER(10),
      COMMENTS CLOB,
      DATECREATED   DATE DEFAULT (SYSDATE) NOT NULL,
      DATEMODIFIED  DATE
);

INSERT INTO testing (ID, COMMENTS) VALUES(1, 'this is a test');

Вышеупомянутое, очевидно, работает просто отлично. Проблема в том, что это поле комментария будет изменено. В моей программе на С# я хотел бы разрешить пользователям сохранять комментарии. В этом примере я удаляю все сложное.

У меня есть кнопка в форме и текстовое поле под названием «комментарии».

using (OracleConnection connection = new OracleConnection(<VALID CONN STRING GOES HERE>)) {
    connection.Open();
    using (OracleCommand command = new OracleCommand()) {
         command.Connection = connection;
         command.CommandText = "UPDATE testing SET COMMENTS = :COMMENTS, DATEMODIFIED = sysdate WHERE ID = :ID";
         command.CommandType = CommandType.Text;
         command.Parameters.Add("ID", OracleDbType.Int32, ParameterDirection.Input).Value = 1;
         command.Parameters.Add("COMMENTS", OracleDbType.Clob, ParameterDirection.Input).Value = comments.Text;
         command.ExecuteNonQuery();
    }
}

Так что в основном этот код работает, пока я не пытаюсь написать Clob. Если я сохраню измененную дату, она будет создана, как и ожидалось. Однако, когда я сохраняю с помощью Clob, ничего не происходит. Никаких сообщений об ошибках от оракула, никаких исключений, ничего.

Если я откажусь от параметризации и сделаю это неправильно:

command.CommandText = "UPDATE testing SET COMMENTS = " + comments.Text + ", DATEMODIFIED = sysdate";

Нет проблем. Кажется, здесь проблема с параметризацией.


person Jeff    schedule 26.04.2013    source источник
comment
Дублировать? stackoverflow.com/ вопросы/4902250/   -  person gustavodidomenico    schedule 26.04.2013
comment
Этот вопрос касается типа данных BLOB, CLOB обычно предназначен для символов. Другой подход, поскольку BLOB может исходить из файлового потока, а мой - из текстового поля.   -  person Jeff    schedule 26.04.2013
comment
Глупая проблема, удивительно, на что способны обед и встреча. Следует ли удалить этот вопрос или он имеет достаточную ценность, чтобы помочь кому-то в будущем?   -  person Jeff    schedule 26.04.2013


Ответы (3)


Оказывается, я был прав в том, что проблема заключалась в параметризации, однако я могу сказать, что это была очень основная ошибка. В любом случае оператор на самом деле работал отлично, но параметры добавлялись не по порядку.

Обратите внимание, что в следующем коде ID добавляется последним, так как это последний параметр (предложение where.)

using (OracleConnection connection = new OracleConnection(<VALID CONN STRING GOES HERE>)) {
    connection.Open();
    using (OracleCommand command = new OracleCommand()) {
         command.Connection = connection;
         command.CommandText = "UPDATE testing SET COMMENTS = :COMMENTS, DATEMODIFIED = sysdate WHERE ID = :ID";
         command.CommandType = CommandType.Text;
         command.Parameters.Add("COMMENTS", OracleDbType.Clob, ParameterDirection.Input).Value = comments.Text;
         command.Parameters.Add("ID", OracleDbType.Int32, ParameterDirection.Input).Value = 1;
         command.ExecuteNonQuery();
    }
}
person Jeff    schedule 26.04.2013
comment
Это работает, когда comment.Text.Length › 32k символов? Подозреваю, что не будет. Этот ответ зависит от неявного преобразования varchar2 в clob, которое ломается после превышения максимальной длины PL/SQL для типа данных varchar2. - person Michael O'Neill; 14.05.2013
comment
Это неудачно. В моей конкретной реализации шансы превысить 100 символов маловероятны, но мне нужно обратить внимание на эту проблему и решить ее. Спасибо Вам за информацию. - person Jeff; 14.05.2013

Чтобы использовать привязку не по порядку для ODP .NET, вам нужно указать эту дополнительную команду (лучшая практика). Это не требовалось, если вы ранее использовали поставщика Microsoft.

Command.BindByName=истина;

Можете ли вы проверить свое обновление с> 32 КБ в комментарии, чтобы увидеть, есть ли ошибки?

person fb888    schedule 16.01.2014

По моему опыту, в этом контексте можно записать Oracle CLOB, преобразовав строку в массив символов следующим образом:

String input = "string value";

OracleParameter parm = new OracleParameter("parameter_name", OracleDbType.Clob);
parm.Direction = ParameterDirection.Input;
parm.Value = input.toCharArray();

поскольку CLOB является большим символьным объектом.

person Darth Jon    schedule 27.05.2014