2014-02-12 3 views
0

Я пытаюсь определить, сбой транзакции из приложения. Как это может быть сделано?Как приложение может определить откат?

Кроме того, можно ли определить, где была выполнена транзакция, например, конкретная запись, которая нарушает ограничение?

+1

SQLstate, 'PQresultStatus',' PQerrorMessage'. –

+0

@CraigRinger Спасибо Крейг Рингер! Не могли бы вы перейти к ответу? –

ответ

3

В обычном libpq, вы бы:

  • Тест результат запроса с PQresultStatus

  • PQresultErrorField(thePgResult, PG_DIAG_SQLSTATE) получить SQLSTATE

  • Используйте PQerrorMessage, чтобы получить сообщение об ошибке для отображения для пользователя. не полагайтесь на разбор этого в приложении, вместо этого используйте SQLSTATE и другие поля в структуре результатов.

См connection status functions, libpq exec functions и остальной документации libpq.

Похожие: How to get the sql state from libpq?

У меня нет опыта работы с libpqxx, но я ожидал бы, чтобы обернуть ошибки SQL в исключения C++ с полями для SQLSTATE и т.д. См the getting started guide for libpqxx и the libpqxx exception classes reference.

This mailing list post и ответов в теме также будет представлять интерес, но быть в курсе, что это с 2007 года, и с тех пор PostgreSQL было расширено, чтобы сообщить более подробную информацию в PQresult, как PG_DIAG_CONSTRAINT_NAME. Понятия не имею, если libpqxx был расширен, чтобы воспользоваться этим, но вы могли бы развернуть исключение, чтобы получить базовый PQresult, если нет.

Существует, AFAIK, нет способа получить фактическое значение, вызывающее проблему, за исключением того, что пользователь показывает полное сообщение об ошибке. Было бы неплохо изменить это.