У меня есть хранимая процедура с входным параметром 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
.
Я пытаюсь понять, как устранить ошибки. Пока что мои идеи таковы:
- Укажите размер при создании
OdbcParameter
;
- Если длина ровно 8000, добавьте пробел в конец (это XML, поэтому, когда он будет считан обратно, он будет проанализирован в
XDocument
, поэтому я считаю, что добавленное пространство не будет иметь никакого значения);
- Возможно, попробуйте использовать
SqlConnection
вместо OdbcConnection
и посмотрите, исчезнет ли проблема.
Но поскольку я не могу воссоздать ошибку, это все удар в темноте.
В чем может быть причина ошибки, и как лучше всего ее исправить? Я знаю, что есть какое-то изменение страницы данных или что-то для varchar длиной более 8000, но я не могу найти ничего конкретного, связанного с ODBC.