|
|
|
| Думаю, это вопрос на засыпку.
При выполнение запроса из базы выводится инфа, например при запросе на добавление:
1) Будет добавлено следующее количество записей: 37
2) В приложении... значение Null присвоено следующему количеству числу полей - 0 (ошибка преобразования типа), не добавлено в таблицу следующее количество записей - 37 (нарушение уникальности ключа)...
Возможно ли и откуда можно считать эту информацию? | |
|
| |
|
|
|
| выполняйте запрос методом execute (ado или DAO на выбор)
в DAO есть свойство RecordsAffected
в ADO параметр RecordsAffected
возвращает число обработынных запросом записей
так. же там можно получить ошибку выполнения (такую как нарушение уникальности) и ее обработать | |
|
| |
|
|
|
| так. же там можно получить ошибку выполнения (такую как нарушение уникальности) и ее обработать
а можно поподробнее? где искать эту ошибку выполнения, в err вроде ничего не появляется?
за recordsaffected спасибо! | |
|
| |
|
|
|
| В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке — даже если не удается изменить или удалить ни одну из записей. Поэтому всегда следует использовать параметр dbFailOnError при запуске с помощью метода Execute запроса на обновление или удаление записей. Данный параметр задает генерирование ошибки выполнения и позволяет отменить все успешно проведенные изменения, если какие-либо из записей оказались заблокированными и не допускают изменения или удаления.
это из Help | |
|
| |
|
|
|
| Спасибо за информацию, буду копать в этой стороне (почитаю про options execute)
на первый взгляд опция dbFailOnError не точто мне надо, потому что она прерывает выполнение запроса, а мне нужно чтобы он выполнился, но при этом в лог я мог записать типа попытка добавить 37 записей, добавлено 20
по поводу
В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке
в некоторых случаях проще пропустить ошибки, чем добавлять в запрос проверку уже существующих записей | |
|
| |
|
|
|
| Возможно, но я других способов незнаю | |
|
| |
|
|
|
| вы можите обрабатывать код ошибки, используя ее дескриптор, и по номеру переходить по resume next | |
|
| |
|
|
|
| Dim q As DAO.QueryDef
Set q = CurrentDb.QueryDefs("_дб_Акты_замера_МСР")
On Error Resume Next
q.Execute dbFailOnError
в err вижу код ошибки 3022 description "Изменения не были успешно внесены из-за повторяющихся значений в индексе, ключевых полях или связях. Измените данные в поле или полях, содержащих повторяющиеся значения, удалите индекс или переопределите его, чтобы разрешить повторяющиеся значения, и п"
полезной инфы кроме того что, без ошибок выполнился запрос или нет, больше нет, а том о сколько не добавилось ничего не написано | |
|
| |
|
|
|
| RecordsAffected - чему равно?
точнее так,
RecordsAffected равно предполагаемому кол-ву записей которые должны быть отработаны?
а то я уже забыл такие подробности | |
|
| |
|
|
|
| RecordsAffected возвращает количество записей которые были обработаны (добавлены, обновлены, удалены - в зависимости от типа запроса), т.е. если из 37 записей добавляемых было добавлено только 20, то RecordsAffected выведет 20 | |
|
| |
|
|
|
| ну вот и ответ
в случае ошибки
можно получить select запросом (с таким же условием как и запрос на обновление) общее кол-во записей которое ДОЛЖНО было обработаться и вычесть из него RecordsAffected. Получим кол-во ошибочных записей. Причину ошибки даст код Err | |
|
| |
|
|
|
| Спасибо, конечно за совет, я об этом думал, типа дублирующие запросы.
но во-первых, это слишком удлиняет процесс (просто так select из insert'a например брать нельзя, если он выполняется минут 5, то чтобы узнать количество еще 5 минут - это много), ну а во-вторых, дополнительные действия в программе могут привести к ошибке.
если бы можно было считать в строку эти warning "В приложении... значение Null присвоено следующему количеству числу полей - 0 (ошибка преобразования типа), не добавлено в таблицу следующее количество записей - 37 (нарушение уникальности ключа)..." я бы из них, выцепил необходимую инфу. | |
|
| |
|
|
|
| "если бы можно было считать" - к сожалению, я не знаю способа это сделать.
IMHO, что вам даст эта информация? какая разница 100 записей не обновилось или 1?
IMHO 3 раза - запрос должен обновить все предполагаемые записи без ошибок, если он не может этого сделать, изменения не должны вноситься ни в одну запись.
если есть вероятность ошибок, нужно поверять новые данные ПЕРЕД обновлением на соответствие условиям. | |
|
| |
|
|
|
| Смысл моих происков:
в моей базе огромное количество запросов, перелопатить каждый на предмет ошибки ну очень не хочется (при этом нужно учитывать, что каждый запрос нужно запускать с разными исходными данными)
а эта информация как раз обратила бы мое внимание только на те запросы, которые выполнились с ошибкой.
В принципе, RecordsAffected и код ошибки дают хорошую информацию о выполненном запросе, просто хотелось еще лучше, тем более, что глазами это видишь, а использовать не можешь | |
|
| |