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

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

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

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

Ответы

Ответ 1

Устранение этой ошибки с 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);

            }
        }
    }
}

Ответ 2

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

Ответ 3

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