Параметр ODBC varchar (max), по-видимому, выдает «HY104 - недопустимое значение точности» для 8000 символов - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть хранимая процедура с входным параметром varchar(max), и мы вставляем этот параметр в столбец таблицы типа varchar(max) (например, длина установлена ​​в -1).
Я использую ODBC, потому что мы настроены на использование DSN (это устаревшее приложение).

Мой OdbcParameter указан как OdbcType.VarChar.

Он вызывается с ExecuteNonQuery, и когда данные имеют ровно 8000 символов, он выдает следующее исключение:

InnerException: Сообщение: ОШИБКА [HY104] [Microsoft] [Драйвер ODBC SQL Server] Неверное значение точности StackTrace: at System.Data.Odbc.OdbcConnection.HandleError (OdbcHandle hrHandle, RetCode retcode) в System.Data.Odbc.OdbcParameter.Bind (команда OdbcStatementHandle hstmt, команда OdbcCommand, порядковый номер Int16, параметр CNativeBufferBuffer, логический allowReentrance) в System.Data.Odbc.OdbcParameterCollection.Bind (команда OdbcCommand, CMDWrapper cmdWrapper, параметр CNativeBufferBuffer) в System.Data.Odbc.OdbcCommand.ExecuteReaderObject (поведение CommandBehavior, метод String, логический NeedReader, Object [] methodArguments, SQL_API odbcApiMethod) в System.Data.Odbc.OdbcCommand.ExecuteReaderObject (поведение CommandBehavior, метод String, логический needReader) в System.Data.Odbc.OdbcCommand.ExecuteNonQuery ()

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

При изучении кода я заметил, что при создании OdbcParameter мы не устанавливаем параметр Size.

Я пытаюсь понять, как устранить ошибки. Пока что мои идеи таковы:

  1. Укажите размер при создании OdbcParameter;
  2. Если длина ровно 8000, добавьте пробел в конец (это XML, поэтому, когда он будет считан обратно, он будет проанализирован в XDocument, поэтому я считаю, что добавленное пространство не будет иметь никакого значения);
  3. Возможно, попробуйте использовать SqlConnection вместо OdbcConnection и посмотрите, исчезнет ли проблема.

Но поскольку я не могу воссоздать ошибку, это все удар в темноте. В чем может быть причина ошибки, и как лучше всего ее исправить? Я знаю, что есть какое-то изменение страницы данных или что-то для varchar длиной более 8000, но я не могу найти ничего конкретного, связанного с ODBC.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Хотя я до сих пор не определил точную причину, я обнаружил, что установка поля Size для OdbcParameter на фактический размер данных, кажется, решает проблему.

Протестировано со значениями ровно 8000 и ниже, а также выше, просто для проверки.

0 голосов
/ 10 сентября 2018

Драйвер ODBC SQL Server, поставляемый с Windows, не был обновлен для новых функций, появившихся после SQL 2000, и предназначен только для использования в тех случаях, когда требуется обратная совместимость с устаревшими приложениями, разработанными для мира до SQL 2005.

Попробуйте использовать современный драйвер ODBC, например ODBC Driver 17 for SQL Server, который напрямую поддерживает тип данных varchar(MAX), введенный в SQL 2005.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...