Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Статистика запроса
 
 автор: npth   (17.10.2008 в 10:13)   личное сообщение
 
 

Думаю, это вопрос на засыпку.
При выполнение запроса из базы выводится инфа, например при запросе на добавление:
1) Будет добавлено следующее количество записей: 37
2) В приложении... значение Null присвоено следующему количеству числу полей - 0 (ошибка преобразования типа), не добавлено в таблицу следующее количество записей - 37 (нарушение уникальности ключа)...
Возможно ли и откуда можно считать эту информацию?

  Ответить  
 
 автор: osmor   (17.10.2008 в 10:45)   личное сообщение
 
 

выполняйте запрос методом execute (ado или DAO на выбор)
в DAO есть свойство RecordsAffected
в ADO параметр RecordsAffected
возвращает число обработынных запросом записей
так. же там можно получить ошибку выполнения (такую как нарушение уникальности) и ее обработать

  Ответить  
 
 автор: npth   (17.10.2008 в 11:03)   личное сообщение
 
 

так. же там можно получить ошибку выполнения (такую как нарушение уникальности) и ее обработать
а можно поподробнее? где искать эту ошибку выполнения, в err вроде ничего не появляется?

за recordsaffected спасибо!

  Ответить  
 
 автор: osmor   (17.10.2008 в 11:06)   личное сообщение
 
 

В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке — даже если не удается изменить или удалить ни одну из записей. Поэтому всегда следует использовать параметр dbFailOnError при запуске с помощью метода Execute запроса на обновление или удаление записей. Данный параметр задает генерирование ошибки выполнения и позволяет отменить все успешно проведенные изменения, если какие-либо из записей оказались заблокированными и не допускают изменения или удаления.

это из Help

  Ответить  
 
 автор: npth   (17.10.2008 в 11:19)   личное сообщение
 
 

Спасибо за информацию, буду копать в этой стороне (почитаю про options execute)
на первый взгляд опция dbFailOnError не точто мне надо, потому что она прерывает выполнение запроса, а мне нужно чтобы он выполнился, но при этом в лог я мог записать типа попытка добавить 37 записей, добавлено 20
по поводу
В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке
в некоторых случаях проще пропустить ошибки, чем добавлять в запрос проверку уже существующих записей

  Ответить  
 
 автор: osmor   (17.10.2008 в 11:29)   личное сообщение
 
 

Возможно, но я других способов незнаю

  Ответить  
 
 автор: SerRock   (17.10.2008 в 14:29)   личное сообщение
 
 

вы можите обрабатывать код ошибки, используя ее дескриптор, и по номеру переходить по resume next

  Ответить  
 
 автор: npth   (20.10.2008 в 17:02)   личное сообщение
 
 

Dim q As DAO.QueryDef
Set q = CurrentDb.QueryDefs("_дб_Акты_замера_МСР")
On Error Resume Next
q.Execute dbFailOnError

в err вижу код ошибки 3022 description "Изменения не были успешно внесены из-за повторяющихся значений в индексе, ключевых полях или связях. Измените данные в поле или полях, содержащих повторяющиеся значения, удалите индекс или переопределите его, чтобы разрешить повторяющиеся значения, и п"

полезной инфы кроме того что, без ошибок выполнился запрос или нет, больше нет, а том о сколько не добавилось ничего не написано

  Ответить  
 
 автор: osmor   (20.10.2008 в 18:11)   личное сообщение
 
 

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

  Ответить  
 
 автор: npth   (21.10.2008 в 11:09)   личное сообщение
 
 

RecordsAffected возвращает количество записей которые были обработаны (добавлены, обновлены, удалены - в зависимости от типа запроса), т.е. если из 37 записей добавляемых было добавлено только 20, то RecordsAffected выведет 20

  Ответить  
 
 автор: osmor   (21.10.2008 в 11:26)   личное сообщение
 
 

ну вот и ответ
в случае ошибки
можно получить select запросом (с таким же условием как и запрос на обновление) общее кол-во записей которое ДОЛЖНО было обработаться и вычесть из него RecordsAffected. Получим кол-во ошибочных записей. Причину ошибки даст код Err

  Ответить  
 
 автор: npth   (21.10.2008 в 11:57)   личное сообщение
 
 

Спасибо, конечно за совет, я об этом думал, типа дублирующие запросы.
но во-первых, это слишком удлиняет процесс (просто так select из insert'a например брать нельзя, если он выполняется минут 5, то чтобы узнать количество еще 5 минут - это много), ну а во-вторых, дополнительные действия в программе могут привести к ошибке.

если бы можно было считать в строку эти warning "В приложении... значение Null присвоено следующему количеству числу полей - 0 (ошибка преобразования типа), не добавлено в таблицу следующее количество записей - 37 (нарушение уникальности ключа)..." я бы из них, выцепил необходимую инфу.

  Ответить  
 
 автор: osmor   (21.10.2008 в 12:11)   личное сообщение
 
 

"если бы можно было считать" - к сожалению, я не знаю способа это сделать.
IMHO, что вам даст эта информация? какая разница 100 записей не обновилось или 1?
IMHO 3 раза - запрос должен обновить все предполагаемые записи без ошибок, если он не может этого сделать, изменения не должны вноситься ни в одну запись.
если есть вероятность ошибок, нужно поверять новые данные ПЕРЕД обновлением на соответствие условиям.

  Ответить  
 
 автор: npth   (21.10.2008 в 12:25)   личное сообщение
 
 

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

В принципе, RecordsAffected и код ошибки дают хорошую информацию о выполненном запросе, просто хотелось еще лучше, тем более, что глазами это видишь, а использовать не можешь

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList