Обработка исключений команды Oracle для определения различий в сети, в автономном режиме, синтаксической ошибке и т. Д. - PullRequest
0 голосов
/ 26 февраля 2019

При выполнении операторов SQL я хочу перевести свое программное обеспечение в «автономный режим» и сохранить оператор SQL в автономный файл, если оператор SQL не удается выполнить из-за проблем с сетью.

Что лучшеспособ сказать, если оператор SQL не удается из-за проблемы в сети.Я хочу различать сбои: плохой синтаксис sql, ограничения внешнего ключа и отключение сети / базы данных.

Спасибо за любую помощь.

try
{
  using (var con = new OracleConnection(DBInfo.ConnectionString))
  {
    con.Open();

    var cmd = new OracleCommand
    {
      Connection = con,
      CommandText = sqlStatement,
      CommandType = CommandType.Text
    };
    cmd.ExecuteNonQuery();
  }
  return true;
}
catch (Exception e)
{
  //how to differentiate failure types? 
  // if(offline exception) GoOffline();

1 Ответ

0 голосов
/ 27 февраля 2019

Все исключения оракула обрабатываются ODP, и все они выбрасывают OracleException

try{ . . . }
catch(OracleException ex){ . . . }

Каждое исключение оракула имеет свойство Message, которое будет отображать простое старое сообщение Oracle, например

ORA-00600: внутренний код ошибки, аргументы

Если у вас есть проблемы с сетью, вы получите либо стандартные исключения Oracle, например,

ORA-12154: TNS:не удалось разрешить указанный идентификатор подключения

Или тайм-аут вашего провайдера.

Похоже, вам нужна очередь, которую можно сериализовать в случае отключения питания или чего-то подобного.Не сохраняйте sql, сохраняйте работу.Например, сериализуемый объект, который имеет все значения для вашей работы, а затем некоторый код, который можно использовать для запуска вызова БД.Например,

[Serializable]
public class CrudRequestModel
{
    public string Prop1 {get; set;} 
    public string Prop2 {get; set;}
    . . . . .
}

public class CrudRequestProcessor
{
    public CrudRequestProcessor(CrudRequestModel m) {. . . }

    public bool Persist()
    {
        // code that will execute DB call
    }

    public bool SaveQueue(QueueConfig conf)
    {
        // code that will serialize and save model to file or whatever if DB call fails
    }
}

Таким образом, ваш код будет выглядеть так:

var proc = new CrudRequestProcessor(model);
if (!proc.Persist())
    proc.SaveQueue(config);

Обратите внимание, SaveQueue может быть расширением, чтобы повысить уровень единоличной ответственности.

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