Я пытаюсь определить, сбой транзакции из приложения. Как это может быть сделано?Как приложение может определить откат?
Кроме того, можно ли определить, где была выполнена транзакция, например, конкретная запись, которая нарушает ограничение?
Я пытаюсь определить, сбой транзакции из приложения. Как это может быть сделано?Как приложение может определить откат?
Кроме того, можно ли определить, где была выполнена транзакция, например, конкретная запись, которая нарушает ограничение?
В обычном 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, нет способа получить фактическое значение, вызывающее проблему, за исключением того, что пользователь показывает полное сообщение об ошибке. Было бы неплохо изменить это.
SQLstate, 'PQresultStatus',' PQerrorMessage'. –
@CraigRinger Спасибо Крейг Рингер! Не могли бы вы перейти к ответу? –