SQLException: Строковые или двоичные данные будут усечены

У меня есть код C #, который выполняет множество инструкций вставки в пакете. Выполняя эти инструкции, я получил сообщение «String или двоичные данные были обрезаны» и roledback транзакции.

Чтобы узнать, какой оператор insert вызвал это, мне нужно вставить один за другим в SQLServer, пока я не ударил ошибку.

Есть ли умный способ узнать, какой оператор и какое поле вызвало эту проблему, используя обработку исключений? (SqlException)

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

В любом случае одна из ваших переменных параметра (и данных внутри нее) слишком велика для поля, в котором он пытается хранить данные. Проверьте размеры параметров на размеры столбцов, и поле (и), о котором идет речь, должно быть довольно быстро видно.

Этот тип ошибки возникает, когда тип данных столбца SQL Server имеет длину, которая меньше длины данных, введенных в форму ввода.

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

BEGIN TRY INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2) END TRY BEGIN CATCH --print or insert into error log or return param or etc... PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'') PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'') END CATCH 

Как правило, вы вставляете значение, превышающее максимально допустимое значение. Ex, столбец данных может содержать до 200 символов, но вы вставляете строку из 201 символа

Это зависит от того, как вы создаете «Вставить вызовы». Все как один вызов, или как индивидуальные вызовы внутри транзакции? Если индивидуальные вызовы, то да (когда вы перебираете вызовы, поймайте тот, который терпит неудачу). Если один большой звонок, то нет. SQL обрабатывает весь оператор, поэтому он не входит в код.

  1. Получите запрос, вызывающий проблемы (вы также можете использовать SQL Profiler, если у вас нет источника)
  2. Удалите все предложения WHERE и другие несущественные части, пока вы в основном не останетесь с элементами SELECT и FROM
  3. Добавить WHERE 0 = 1 (это отобразит только структуру таблицы)
  4. Добавьте INTO [MyTempTable] непосредственно перед предложением FROM

Вы должны получить что-то вроде

 SELECT Col1, Col2, ..., [ColN] INTO [MyTempTable] FROM [Tables etc.] WHERE 0 = 1 

Это создаст таблицу MyTempTable в вашей БД, которую вы можете сравнить с вашей целевой структурой таблицы, то есть вы можете сравнить столбцы на обеих таблицах, чтобы увидеть, где они отличаются. Это немного обходное решение, но это самый быстрый метод, который я нашел.

С Linq To SQL я отлаживаю, регистрируя контекст, например. Context.Log = Console.Out Затем сканировал SQL, чтобы проверить наличие очевидных ошибок, было два:

 -- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1] -- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2] 

последний, который я нашел, просмотрев схему таблицы против значений, поле было nvarchar (20), но значение было 22 символа

-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]

Это также может быть связано с тем, что вы пытаетесь вернуть null значение в базу данных. Таким образом, одна из ваших транзакций может иметь нулевые значения.

В нашем случае я увеличиваю допустимый знак или размер поля таблицы sql, который меньше, чем общие символы, отправленные с лицевой стороны. Следовательно, это решение проблемы.

Давайте будем гением компьютера.