ADO как игнорировать предупреждения в хранимой процедуре

Диам
Дата: 17.02.2016 10:08:53
Здравствуйте.
Выполняю через АДО на сервере хранимую процедуру.
Во время выполнения в хранимке возникает предупреждение "Повторяющийся ключ пропущен." и она отрабатывает дальше без проблем. НО несмотря на то, что это всего лишь предупреждение - в Акцессе я получаю ошибку.

Кто-нибудь знает, как сделать так, чтобы АДО игнорировал такие предупреждения и вылетал только на реальных ошибках?

запускаю хранимку так:
  
  On Error GoTo ErrHandler
  Set cmd = New ADODB.Command
  Set R = New ADODB.Recordset
  cmd.ActiveConnection = strConnADO
  cmd.CommandType = adCmdText
  cmd.CommandTimeout = TimeOut
  cmd.CommandText = sqlTxt
  R.CursorLocation = adUseClient
  IsOpen = True
  R.open cmd, , adOpenStatic, adLockOptimistic

после R.open программа перекидывается на обработчик ошибок. А при пробежке по списку ошибок я вижу, что после возникновения ошибки(которое на самом деле предупреждение) процедура продолжила выполняться.
Slavinag
Дата: 17.02.2016 10:45:19
Насколько я понял субъект, то возвращается какой-то конкретный номер ошибки. Его можно отловить в обработчике ошибок (в блоке после метки ErrHandler:), либо просто поставив On Error Resume Next перед вызовом R.open cmd, , adOpenStatic, adLockOptimistic.
Диам
Дата: 17.02.2016 11:34:06
Slavinag, суть в том, что я не хочу игнорировать ошибки. Если во время работы процедуры ошибка возникла, то я у клиента отработаю её возникновение, а если возникло всего лишь предупреждение, то зачем же мне это надо? Причем главная то беда в том, что клиент считает что возникла ошибка и процедура НЕ отработала, а на самом то деле процедура выполнилась полностью.
Slavinag
Дата: 17.02.2016 14:36:16
А хранимая процедура возвращает отобранный по каким-то критериям набор записей? Который затем передаёт в АДО-рекордсет? Или - просто выполняет некие действия с данными на сервере? Почему не используется команда
cmd.Execute
и затем в какую-нибудь переменную не сохраняется выходной параметр процедуры
sResult = cmd.Parameters(0)
?
Шыфл
Дата: 17.02.2016 14:57:20
Диам,

есть подозрение, что на сервере в процедуре нужно поставить что-то типа, чтобы
SET NOCOUNT on
SET ANSI_WARNINGS off 

А что за предупреждение то? Truncation occurs during conversion to varbinary data? Или что?
Slavinag
Дата: 17.02.2016 15:50:00
Неплохо бы ещё проверить логику самой хранимки, как именно "она отрабатывает дальше без проблем" (с). Всё ли там нормально с результирующими данными, не обрезаются ли где-нибудь текстовые поля, нет ли пропущенных записей ("Повторяющийся ключ пропущен.") - это ж-ж-ж не спроста...
Диам
Дата: 18.02.2016 01:11:29
Slavinag, в хранимке происходит добавление записей в таблицу. У таблицы сделан уникальный индекс с "Ignore Duplicate Values" = On. Т.е. дубликаты вставлены не будут, но при этом не будет возникать ошибка, а только предупреждение.

И все происходит так как и задумано - на MSSQL возникает предупреждение и процедура продолжает выполняться дальше. А вот после окончания процедуры, уже на клиенте ADO вываливается с ошибкой, которая на самом деле не ошибка а предупреждение. Установка SET ANSI_WARNINGS off не спасает :(
Slavinag
Дата: 18.02.2016 08:23:23
Диам,

И всё-же - зачем использовать для выполнения процедуры (запуска её из клиента) АДО-рекордсет, а не просто
cmd.Execute
Диам
Дата: 18.02.2016 13:45:46
Slavinag, потому что хранимка возвращает набор данных. И я их потом читаю
Slavinag
Дата: 18.02.2016 15:30:36
Диам,

То есть, в хранимке после выполнения INSERT INTO не возникает ошибок, @@ERROR = 0, но есть некое предупреждение, в результате которого в клиенте Access на открытие получившегося рекордсета в VBA возникает ошибка? Но сам набор записей при этом правильный, доступен, и дальнейшая его обработка (в клиенте) идёт без проблем?

Я бы всё же попробовал разделить события. Сначала выполнить хранимку, не возвращая с её помощью набор записей в клиент. А затем уже в клиенте дал команду на открытие рекордсета с помощью обычного SELECT к той табличке, в которою хранимка добавила записи.