Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

У вас должно получиться что-то вроде

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

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

Ответ 8

С 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]

Ответ 9

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

Ответ 10

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