Вставка, обновление, удаление для Oracle не работают в .NET C #? - PullRequest
0 голосов
/ 09 октября 2009

Уже давно я имею дело с оракулом и .net, и они, похоже, не идеально подходят друг другу. Вот эта странная вещь, я не нахожу никаких причин, почему это происходит или как это исправить.

Я делаю простые вставки, обновления и удаления, и они не работают. Не удается на

cmd.ExecuteNonQuery();

Вот кусок кода:

sqlCommand = string.Format(@" INSERT INTO TABLE_1
                              (ID, NAME, DESCRIPTION)
                              VALUES ((SELECT MAX(ID)+1 FROM TABLE_1),'{0}','{1}')", name, description);

using (OracleConnection conn = new OracleConnection(connectionString))
{
 OracleCommand cmd = new OracleCommand(sqlCommand, conn);
 cmd.CommandType = commandType;

 try
 {
  conn.Open();
  result = cmd.ExecuteNonQuery();                    
 }
 catch (Exception ex) { throw;}
 finally
 {
  conn.Close();
 }

простая вставка, верно ?! когда я отлаживаю, я получаю значение cmd.Text (это будет sqlCommand), и я выполняю его в Oracle db, все идет хорошо По мере того, как я выполняю эту задачу в .Net, она сдается.

Это известная ситуация? Есть ли какое-либо решение, какое-либо объяснение этому?

Спасибо заранее

Ответы [ 7 ]

1 голос
/ 09 октября 2009

Я думаю, что ваш стол заблокирован кем-то. Или таблица имеет растровые индексы? Растровые индексы не должны использоваться в среде, где данные изменяются одновременно несколькими пользователями, поскольку они сильно блокируются. Используйте индексы BTree в среде oltp.

Это не имеет ничего общего с вашим вопросом, но:

Когда вы работаете с Oracle, вы должны использовать параметризованные запросы вместо string.Format (.. {} ...). Параметризованные запросы выполняются намного быстрее, потому что это означает, что Oracle не нужно анализировать каждый SQL-оператор.

и сделай что-то вроде

create sequence table_1_seq

insert into table_1 (id, , ) values (table_1_seq.nextval, , ) для заполнения идентификатора.

Вместо

(SELECT MAX(ID)+1 FROM TABLE_1)

потому что это не работает в многопользовательской среде.

Редактировать 1

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

select index_name,table_name from all_indexes 
where index_type = 'BITMAP';
1 голос
/ 09 октября 2009

Это не имеет ничего общего с вашим вопросом, но:

Вы должны использовать последовательность вместо выбора (ВЫБЕРИТЕ МАКС. (ID) +1 ОТ TABLE_1), чтобы сгенерировать идентификатор

0 голосов
/ 25 октября 2012

Фиксация любого запроса, используемого в клиенте Oracle, например, Toad или SQL-Developer

параллельно с использованием клиента oracle (например, Toad или sSQL-Developer) и .net не разрешается, если вы хотите использовать оба параллельно, тогда используйте коммит в клиенте oracle перед использованием с .net.

Тогда попробуйте использовать его с .net - это сработает.

0 голосов
/ 01 сентября 2012

Вставка:

insert into student values('rahul',474,'mca','phase2');

Удалить:

delete from student where roll_no=472;

Обновление:

update student set address='phase7' where roll_no=474;
0 голосов
/ 20 декабря 2010

У меня была такая же проблема. Я понятия не имел, как это решить. Когда я запускаю программу без запуска sqldeveloper, все прошло нормально. Мой ответ на этот вопрос: закройте все другие программы, которые используют соединение с оракулом с вашего компьютера. Все прошло хорошо для меня.

0 голосов
/ 09 октября 2009

В зависимости от того, как вы это делаете; Вы можете использовать:

    catch (Exception ex)
    {
System.Data.OracleClient.OracleException oEx = (System.Data.OracleClient.OracleException)ex.InnerException;

      if (oEx.Message.IndexOf("ORA-0054") != 0)
      {
         .... do something here...    
      }

.. который будет определять наличие блокировки. YMMV, хотя, поскольку я использовал это только на Oracle 9i.

0 голосов
/ 09 октября 2009

Ну, я думаю, что я только что дал разумное объяснение:

база данных должна была быть занята выполнением другой операции обновления-удаления или, возможно, операции вставки, поэтому вы бесконечно ждали, пока она выполнит обновление из приложения.

У меня тоже есть проблема. Мой вопрос:

Как мы можем избежать этого ожидания или получить сообщение «Я попрошайничаю позже» из БД, чтобы пользователи знали о том, что происходит?

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