Ошибка SQL: строковые или двоичные данные будут усечены
Я делаю интеграцию на платформе сообщества под названием Telligent. Я использую стороннее дополнение BlogML для импорта сообщений блога из XML-файла (в формате BlogML) на мой локальный сайт Telligent. Платформа Telligent поставляется со многими классами в SDK, чтобы я мог программно добавлять контент, например сообщения в блогах. Е. Г.
myWeblogService.AddPost(myNewPostObject);
приложение BlogML, которое я использую, по существу анализирует XML и создает объекты сообщения в блоге, а затем добавляет их на сайт, используя код, такой как выше сечения. После импорта сообщений 40 я получаю ошибку SQL:
Exception Details: System.Data.SqlClient.SqlException:
String or binary data would be truncated.
The statement has been terminated.
Я считаю, что эта ошибка означает, что я пытаюсь вставить слишком много данных в поле DB, который имеет максимальный размер. К сожалению, я не могу сказать, какой области это касается. Я запустил профилировщик SQL Server во время импорта, но я не вижу, в какой хранимой процедуре возникает ошибка. Есть ли другой способ использовать профилировщик или другой инструмент, чтобы увидеть, какая именно хранимая процедура и даже в каком поле возникает ошибка? Есть любые другие советы, чтобы получить больше информации о том, где конкретно искать?
о радости сторонних инструментов...
2 ответов
вы правы в том, что исключение связано с попыткой поместить слишком много данных в символьное/двоичное поле. Запуск трассировки должен определенно позволить вам увидеть, какая процедура / оператор создает исключение, если вы записываете правильные события, те, которые вы хотите захватить, будут включить:
- SQL: BatchStarting
- SQL: BatchCompleted
- SQL: StmtStarting
- SQL: StmtCompleted
- RPC:запуск
- RPC:завершено
- SP: запуск
- SP: завершено
- SP: StmtStarting
- SP: StmtCompleted
- исключение
Если вы точно знаете, что это хранимая процедура, которая включает неисправный код, вы можете покончить с захват #ы 1-4. Убедитесь, что вы также записываете все связанные столбцы в трассировке (должно быть по умолчанию, если вы используете трассировку с помощью инструмента профилировщика). Класс Exception будет включать фактическую ошибку в трассировке, которая должна позволить вам увидеть непосредственно предыдущий оператор в том же SPID, который вызвал исключение. Вы должны включить начиная с события в дополнение к завершенным событиям в качестве исключения, которое происходит, будут препятствовать связанному завершенному события от стрельбы на трассе.
Если вы можете отфильтровать трассировку к определенной базе данных, приложению, имени хоста и т. д. это, безусловно, облегчит отладку, если вы находитесь на занятом сервере, однако, если вы находитесь на простаивающем сервере, вам может не понадобиться беспокоиться о фильтрации.
предполагая, что вы используете Sql 2005+, трассировка будет включать столбец под названием "EventSequence", который в основном представляет собой увеличивающееся значение, упорядоченное последовательностью событий. Как только вы запустите трассировка и захват вывода, найти "исключение" событие, которое сработало (если вы используете profiler, строка будет в красном цвете), то вы должны быть в состоянии просто найти самый последний SP:StmtStarting или SQL:stmtstarting событие для того же SPID, который произошел до исключения.
вот снимок экрана профиля, который я захватил, воспроизводя событие, подобное вашему:
alt текст http://i47.tinypic.com/1zc01mo.jpg
вы можете увидеть строка исключения красным цветом и выделенная строка-это непосредственно предшествующее событие SP:StmtStarting, которое было запущено до исключения для того же SPID. Если вы хотите найти хранимую процедуру, частью которой является этот оператор, найдите значения в Столбцах ObjectName и/или ObjectId.
делая некоторые глупые ошибки вы получите эту ошибку.
Если вы пытаетесь вставить строку.
String reqName="Food Non veg /n";
здесь / n виновник.Удалите /n из строки, чтобы выйти из этой ошибки.
Я надеюсь, что это поможет кому-то.