"Строка или двоичные данные будут проигнорированы."исключение linq, не могу найти, какое поле превысило максимальную длину - PullRequest
16 голосов
/ 08 сентября 2010

Строка или двоичные данные будут усечены.исключение linq, не могу найти, какое поле превысило максимальную длину.

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

пожалуйста, помогите

Ответы [ 3 ]

34 голосов
/ 02 октября 2010

Устранение этой ошибки с 350 полями может быть чрезвычайно трудным , и в этом случае SQL Server Profiler не сильно помогает (поиск длинной строки в сгенерированном SQL подобен поиску иголки в стоге сена).

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

Как это работает: он перебирает все свойства объекта, который вы ''собираемся сохранить, найдя свойства с LINQ to SQL ColumnAttribute.Затем, если ColumnAttribute.DbType содержит «varchar», вы знаете, что это строка, и вы можете проанализировать эту часть атрибута, чтобы найти максимальную длину.

Вот как это использовать:

foreach (object update in context.GetChangeSet().Updates)
{
    FindLongStrings(update);
}

foreach (object insert in context.GetChangeSet().Inserts)
{
    FindLongStrings(insert);
}

context.SubmitChanges();

А вот и метод:

public static void FindLongStrings(object testObject)
{
    foreach (PropertyInfo propInfo in testObject.GetType().GetProperties())
    {
        foreach (ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(ColumnAttribute), true))
        {
            if (attribute.DbType.ToLower().Contains("varchar"))
            {
                string dbType = attribute.DbType.ToLower();
                int numberStartIndex = dbType.IndexOf("varchar(") + 8;
                int numberEndIndex = dbType.IndexOf(")", numberStartIndex);
                string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex));
                int maxLength = 0;
                int.TryParse(lengthString, out maxLength);

                string currentValue = (string)propInfo.GetValue(testObject, null);

                if (!string.IsNullOrEmpty(currentValue) && maxLength != 0 && currentValue.Length > maxLength)
                    Console.WriteLine(testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength);

            }
        }
    }
}
3 голосов
/ 02 октября 2010

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

0 голосов
/ 20 января 2011

я установил максимальную длину для всех 350 полей. Я думаю, это единственный способ. спасибо за вашу поддержку.

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