Вставка clobs в оракул с помощью ODBC

Я пытаюсь вставить clob в Oracle. Если я попробую это с OdbcConnection, он не вставит данные в базу данных. Он возвращает 1 затронутую строку и никаких ошибок, но ничего не вставляется в базу данных.

Он работает с OracleConnection. Однако использование Microsoft OracleClient часто приводит к сбою наших веб-сервисов с AccessViolationException (попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена). Это происходит часто, когда мы используем OracleDataAdapter.Fill(набор данных). Так что использовать это не похоже на вариант.

Есть ли способ вставить/обновить clobs с более чем 4000 символов из .Net с помощью OdbcConnection?


person Carra    schedule 04.06.2009    source источник
comment
Не могли бы вы опубликовать код, который вы используете?   -  person Thomas Levesque    schedule 04.06.2009


Ответы (3)


Я давно не работал на платформе .NET, так что это по памяти.

Насколько мне известно, адаптер OdbcConnection для Oracle устарел, и вы не можете вставлять/обновлять более 4000 символов за раз. Вы можете написать хранимую процедуру для передачи и обновления 4000 символов CLOB за раз, но это кажется сложным и неэффективным средством поддержки устаревшей библиотеки.

Таким образом, MS OracleConnection может быть лучшим способом отладки. AccessViolationException чаще всего возникает из-за того, что контроллер распределенных транзакций (msdtc.exe) не запущен, хотя существует множество других потенциальных причин (включая неисправное оборудование).

Прежде чем исследовать исключение, необходимо рассмотреть третью библиотеку соединений. Компоненты Oracle DataAccess (ODAC ODP.NET), которые должны быть включены в вашу лицензию на базу данных. Он поддерживается намного лучше, чем OdbcConnection, и должен обходить генерацию исключений OracleConnection.

person Andrew Champion    schedule 04.06.2009
comment
Теперь я попробовал это с Oracle ODP.NET, и, похоже, это работает. Я также хотел бы попробовать попытку хранимой процедуры. Есть примеры? - person Carra; 04.06.2009

В своей таблице я превратил свой клочок в клочок. преобразовать текст, идущий в табличный BLOB-объект, в массив байтов. затем при чтении значение преобразуется в строку массива байтов.

//insert code
System.Text.Encoding enc = System.Text.Encoding.ASCII;
byte[] blobByteArray = enc.GetBytes(text);

string sql = "insert into xxxxx (id,name,script_blob) values (?,?,?)";
cmd = new OdbcCommand(sql, conn);
cmd.CommandTimeout = _cmdtimeout;
cmd.Parameters.Add("id", OdbcType.VarChar);
cmd.Parameters["id"].Value = script_id;
cmd.Parameters.Add("name", OdbcType.VarChar);
cmd.Parameters["name"].Value = name;
cmd.Parameters.Add("script_blob", OdbcType.Binary);
cmd.Parameters["script_blob"].Value = blobByteArray;
int i = cmd.ExecuteNonQuery();

//read blob back from db
System.Text.Encoding enc = System.Text.Encoding.ASCII;
string sql = "select id,name,script_blob from bc_script";
cmd = new OdbcCommand(sql, conn);
cmd.CommandTimeout = _cmdtimeout;    
OdbcDataReader dr2 = cmd.ExecuteReader();
if (dr2.HasRows)
{
    rtn = new List<BCScript>();
    while (dr2.Read())
    {
        string Script_text = enc.GetString((byte[])dr2["script_blob"]);
    }
}

cmd.Dispose();
person SkinnyG    schedule 18.11.2010

Я не думаю, что это проблема с odbc, а скорее ограничение со стороны оракулов. Если вы вставляете или обновляете с помощью оператора select, вы не можете использовать более 4000 символов. Рекомендуемый способ сделать это — использовать переменные связывания и plsql. Я знаю, что это звучит как очень уродливое решение, но это все, что я нашел до сих пор; (.

http://www.evilcyborg.com/lounge/?ID=1245

person donkeyx    schedule 22.03.2010